Posted June 14, 20223 yr 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.
June 14, 20223 yr Author 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
June 15, 20223 yr Author @diesieben07How would I go about adding this last parameter as I'm new to this capability stuff but know enough java.
June 15, 20223 yr Author @diesieben07 not familiar with the factory could you possibly provide a basic example that way I can try to comprehend what it is.
June 15, 20223 yr Author 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, 20223 yr by dan donn Spelling
June 15, 20223 yr Author 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
June 15, 20223 yr 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, 20223 yr by urbanxx001
June 15, 20223 yr Author @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
June 15, 20223 yr Author 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
June 15, 20223 yr It may be because your PlayerTeam interface doesn't need to extend INBTSerializable<CompoundNBT> Edited June 15, 20223 yr by urbanxx001
June 15, 20223 yr Author 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
June 15, 20223 yr 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, 20223 yr by urbanxx001
June 15, 20223 yr Author 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
June 15, 20223 yr Author 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, 20223 yr by dan donn Appended
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.