dan donn Posted June 14, 2022 Share Posted June 14, 2022 I am getting the following error. Quote reason: no instance(s) of type variable(s) exist so that PlayerTeamCapability conforms to PlayerTeam inference variable T has incompatible bounds: equality constraints: PlayerTeam lower bounds: PlayerTeamCapability The code is the follwoing package uk.nf.teamserpentalise.tspaintball; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import uk.nf.teamserpentalise.tspaintball.capability.CapabilityTeamStorage; import uk.nf.teamserpentalise.tspaintball.capability.PlayerTeam; import uk.nf.teamserpentalise.tspaintball.capability.PlayerTeamCapability; import uk.nf.teamserpentalise.tspaintball.init.*; @Mod(TSPaintball.MOD_ID) public class TSPaintball { public static final String MOD_ID = "tspaintball"; public static final Logger LOG = LogManager.getLogger(); public TSPaintball() { IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); MinecraftForge.EVENT_BUS.register(eventinit.class); bus.addListener(this::CommonSetup); bus.register(this); } public void CommonSetup(FMLCommonSetupEvent event){ CapabilityManager.INSTANCE.register(PlayerTeam.class, new CapabilityTeamStorage(), PlayerTeamCapability::new); } } That is the main class where the capability manager is throwing the error. (I have shortened the class down to ease with size. package uk.nf.teamserpentalise.tspaintball.capability; import net.minecraft.nbt.INBT; import net.minecraft.util.Direction; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.util.LazyOptional; import javax.annotation.Nonnull; import javax.annotation.Nullable; public class PlayerTeamCapability implements ICapabilitySerializable<INBT> { @CapabilityInject(PlayerTeam.class) public static final Capability<PlayerTeam> TEAM_CAPABILITY = null; private LazyOptional<PlayerTeam> instance = LazyOptional.of(TEAM_CAPABILITY::getDefaultInstance); @Nonnull @Override public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) { return cap == TEAM_CAPABILITY ? instance.cast() : LazyOptional.empty(); } @Override public INBT serializeNBT() { return TEAM_CAPABILITY.getStorage().writeNBT(TEAM_CAPABILITY,this.instance.orElseThrow(() -> new IllegalArgumentException("LazyOptional must not be empty!")), null); } @Override public void deserializeNBT(INBT nbt) { TEAM_CAPABILITY.getStorage().readNBT(TEAM_CAPABILITY, this.instance.orElseThrow(() -> new IllegalArgumentException("LazyOptional must not be empty!")), null, nbt); } } package uk.nf.teamserpentalise.tspaintball.capability; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.INBT; import net.minecraft.util.Direction; import net.minecraftforge.common.capabilities.Capability; import javax.annotation.Nullable; public class CapabilityTeamStorage implements Capability.IStorage<PlayerTeam> { @Nullable @Override public INBT writeNBT(Capability<PlayerTeam> capability, PlayerTeam instance, Direction side) { CompoundNBT Tag = new CompoundNBT(); Tag.putString("player.team",instance.GetTeam()); return Tag; } @Override public void readNBT(Capability<PlayerTeam> capability, PlayerTeam instance, Direction side, INBT nbt) { instance.SetTeam(nbt.getAsString()); } } package uk.nf.teamserpentalise.tspaintball.capability; import net.minecraft.nbt.CompoundNBT; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.INBTSerializable; public interface PlayerTeam extends INBTSerializable<CompoundNBT> { String GetTeam(); void SetTeam(String Team); } Any help is greatly appreciated. Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 14, 2022 Author Share Posted June 14, 2022 package uk.nf.teamserpentalise.tspaintball.init; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import uk.nf.teamserpentalise.tspaintball.TSPaintball; import uk.nf.teamserpentalise.tspaintball.capability.PlayerTeamCapability; @Mod.EventBusSubscriber(modid = TSPaintball.MOD_ID) public class eventinit { @SubscribeEvent public static void Hurt(LivingHurtEvent event) { TSPaintball.LOG.info("Hurt Event Fired"); Entity Target = event.getEntity(); Entity Hit = event.getSource().getDirectEntity(); TSPaintball.LOG.info("Traget: " + Target.toString() + "\nHit: " + Hit.toString()); } @SubscribeEvent public static void AttachCap(AttachCapabilitiesEvent<Entity> event) { if(event.getObject() instanceof PlayerEntity) { event.addCapability(new ResourceLocation(TSPaintball.MOD_ID,"player_team"),new PlayerTeamCapability()); } } } This is where the attach event is located that the main class registers to the eventbus Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 @diesieben07How would I go about adding this last parameter as I'm new to this capability stuff but know enough java. Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 @diesieben07 not familiar with the factory could you possibly provide a basic example that way I can try to comprehend what it is. Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 (edited) Still don't quite get how to do this with the capability, I do understand the idea but having trouble implementing it. Sorry if this is too much to ask but could you possibly show me how and what I've done wrong. package uk.nf.teamserpentalise.tspaintball.capability; public class CapabilityFactory { public PlayerTeamCapability get(){ return new PlayerTeamCapability(); } } @diesieben07 Again my apologies if this is too much to ask Edited June 15, 2022 by dan donn Spelling Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 no instance(s) of type variable(s) exist so that CapabilityTeamStorage conforms to PlayerTeam inference variable T has incompatible bounds: equality constraints: PlayerTeam lower bounds: CapabilityTeamStorage Managed to find a basic example and went from there but the error above is now what is happening Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 nevermind i misread the tutorial code Quote Link to comment Share on other sites More sharing options...
urbanxx001 Posted June 15, 2022 Share Posted June 15, 2022 (edited) Not sure if you already got it from the tutorial, but In your PlayerTeamCapability provider class, you should add: public String team; public PlayerTeamCapability() {this.team = ""} @Override public void SetTeam(String string) { this.team = string; } @Override public String GetTeam() { return this.team; } where we're using the methods from your interface PlayerTeam. But for this PlayerTeamCapability needs to implement PlayerTeam right after ICapabilitySerializable<INBT>. Edited June 15, 2022 by urbanxx001 Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 @urbanxx001Yes just managed to get that however now the first parameter does not meet type class<T> instead it is class<PlayerTeam> not sure what is going on there Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 Required type Provided type: Class<T> Class<PlayerTeam> storage: IStorage<T> CapabilityTeamStorage factory: Callable<? extends T> <method reference> reason: no instance(s) of type variable(s) exist so that CapabilityTeamStorage conforms to PlayerTeam inference variable T has incompatible bounds: equality constraints: PlayerTeam lower bounds: CapabilityTeamStorage It's the top one giving me isssues Quote Link to comment Share on other sites More sharing options...
urbanxx001 Posted June 15, 2022 Share Posted June 15, 2022 (edited) It may be because your PlayerTeam interface doesn't need to extend INBTSerializable<CompoundNBT> Edited June 15, 2022 by urbanxx001 Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 That hasn't fixed it. still same error Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 package uk.nf.teamserpentalise.tspaintball.capability; import net.minecraft.nbt.CompoundNBT; public class PlayerTeamImpl implements PlayerTeam { private final String Team; public PlayerTeamImpl(){ this("None"); } public PlayerTeamImpl(String team) { Team = team; } @Override public String GetTeam() { return null; } @Override public void SetTeam(String Team) { } @Override public CompoundNBT serializeNBT() { final CompoundNBT nbt = new CompoundNBT(); nbt.putString("player.team", this.GetTeam()); return nbt; } @Override public void deserializeNBT(CompoundNBT nbt) { this.SetTeam(nbt.getString("player.team")); } } Does that seem right Quote Link to comment Share on other sites More sharing options...
urbanxx001 Posted June 15, 2022 Share Posted June 15, 2022 (edited) The code in your previous PlayerTeamCapability was fine, but just needs the snippet I mention. You have some of it, but your GetTeam and SetTeam aren't affecting Team. You also shouldn't need: public PlayerTeamImpl(){ this("None"); } And you can implement both interfaces with: public class PlayerTeamCapability implements PlayerTeam, ICapabilitySerializable<INBT> Then as far as I can tell, your code would be the same as what I have when I used capabilities, which was able to register and work in game. Edited June 16, 2022 by urbanxx001 Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 Now the error is to do with INBT and CompoundNBT. not sure why Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 https://github.com/DDX5/TSPaintball it is under src/main/java/uk/nf/teamserpentalise/tspaintball/capability/ the main class has the register and eventinit has the attach capability Quote Link to comment Share on other sites More sharing options...
dan donn Posted June 15, 2022 Author Share Posted June 15, 2022 (edited) I may just stick to basic nbt saving, this seems like a headache to me. Thank you for the help anyways but I don't fully understand it Mainly outside of my range of abilities. Edited June 15, 2022 by dan donn Appended Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.