Posted March 10, 20169 yr I'm trying to create a mana system to keep track of a player's pool of mana. Unfortunately, I'm having huge trouble registering it. I've tried every combination of .class and new() but I just can't seem to get it to do anything other than give the error "The method register(Class<T>, Capability.IStorage<T>, Class<? extends T>) in the type CapabilityManager is not applicable for the arguments (Class<IBaseManaCapability>, PlayerManaCapabilityHandler, Class<PlayerManaCapability>)". Here's some code: IBaseManaCapability package com.nosrick.masterofmagic.capabilities; public interface IBaseManaCapability extends IBaseCapability { public int GetMana(); public void SetMana(int mana); } PlayerManaCapability package com.nosrick.masterofmagic.capabilities; public class PlayerManaCapability implements IBaseManaCapability { protected int m_Mana = 0; @Override public int GetMana() { return m_Mana; } @Override public void SetMana(int mana) { m_Mana = mana; } } PlayerManaCapabilityHandler package com.nosrick.masterofmagic.capabilities; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability.IStorage; import net.minecraftforge.common.capabilities.CapabilityManager; public class PlayerManaCapabilityHandler implements IStorage<PlayerManaCapability> { @Override public NBTBase writeNBT(Capability<PlayerManaCapability> capability, PlayerManaCapability instance, EnumFacing side) { NBTTagCompound manaTags = new NBTTagCompound(); manaTags.setInteger("mana", instance.GetMana()); return manaTags; } @Override public void readNBT(Capability<PlayerManaCapability> capability, PlayerManaCapability instance, EnumFacing side, NBTBase nbt) { NBTTagCompound manaTags = (NBTTagCompound)nbt; instance.SetMana(manaTags.getInteger("mana")); } } And the factory, PlayerManaFactory package com.nosrick.masterofmagic.capabilities; import java.util.concurrent.Callable; public class PlayerManaFactory implements Callable<PlayerManaCapability> { @Override public PlayerManaCapability call() throws Exception { return new PlayerManaCapability(); } } Now, here is how I'm trying to register it: CapabilityManager.INSTANCE.register(IBaseManaCapability.class, new PlayerManaCapabilityHandler(), PlayerManaCapability.class); I've tried a few different methods - including trying to use the factory - but they all give me the same error. What am I doing wrong?
March 10, 20169 yr Just went through an almost identical process I'll update this response with some specifics but for now you can take a look at my github. You'll want to look at DefaultDrafter and DrafterProvider. Update: IBaseManaCapability should be a regular interface(doesn't extend anything) PlayerManaCapability should implement IBaseManaCapability(this is the default implementation) For saving the players mana and loading it you would do something like this: public class PlayerManaCapability implements IBaseManaCapability{ //implement methods public static class ManaStorage implements IStorage<IBaseManaCapability>{ public static final ManaStorage manaStorage = new ManaStorage (); //implement methods of IStorage (read and write nbt) } } You can break ManaStorage into a different file like you have it but if you leave it as an inner class it lets you access the instance.privateVariables for read and write without extra method calls. register it like this: CapabilityManager.INSTANCE.register(IBaseManaCapability.class, ManaStorage .manaStorage , PlayerManaCapability .class); update 2: your factory should be a provider meaning something like this: public class ManaProvider implements ICapabilityProvider, INBTSerializable{ @CapabilityInject(IBaseManaCapability .class) public static Capability<IBaseManaCapability > MANAPLAYER = null; // implement methods } You will also want to hook into these two events @SubscribeEvent public void AttachCapability(AttachCapabilitiesEvent.Entity e) @SubscribeEvent public void onClonePlayer(PlayerEvent.Clone e) Current Project: Armerger Planned mods: Light Drafter | Ore Swords Looking for help getting a mod off the ground? Coding | Textures
March 10, 20169 yr Author Register takes a class first, an instance of the storage second and a class third That's exactly what I've done here: CapabilityManager.INSTANCE.register(IBaseManaCapability.class, new PlayerManaCapabilityHandler(), PlayerManaCapability.class); PlayerManaCapabilityHandler is the storage.
March 10, 20169 yr I am not 100% sure with it, but I think that ur PlayerManaCapabilityHandler needs to implement IBaseManaCapability
March 10, 20169 yr Author I am not 100% sure with it, but I think that ur PlayerManaCapabilityHandler needs to implement IBaseManaCapability Just tried modifying the code; no such luck, I'm afraid.
March 10, 20169 yr your handler should be implementing IStorage<IBaseManaCapability> Current Project: Armerger Planned mods: Light Drafter | Ore Swords Looking for help getting a mod off the ground? Coding | Textures
March 10, 20169 yr Author your handler should be implementing IStorage<IBaseManaCapability> Thanks! It's registering, now. Just got to get the rest of it working now. Thanks again!
March 10, 20169 yr Your welcome, and it is almost exactly what I have been going through. Let me know if you need help getting the client to update properly, that bit took a lot of trouble shooting for me. Current Project: Armerger Planned mods: Light Drafter | Ore Swords Looking for help getting a mod off the ground? Coding | Textures
March 11, 20169 yr Author Your welcome, and it is almost exactly what I have been going through. Let me know if you need help getting the client to update properly, that bit took a lot of trouble shooting for me. I'd love some help with that. But the main problem I'm having right now is that the player doesn't have the custom capability, so any hasCapability() call always returns false. Is the addition process automated, or do I have to do it myself?
March 11, 20169 yr https://github.com/MinecraftForge/MinecraftForge/blob/1.9/src/test/java/net/minecraftforge/test/NoBedSleepingTest.java#L37-L121 https://github.com/MinecraftForge/MinecraftForge/blob/1.9/src/test/java/net/minecraftforge/test/TestCapabilityMod.java I do Forge for free, however the servers to run it arn't free, so anything is appreciated. Consider supporting the team on Patreon
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.