Posted February 18, 20178 yr So I picked up modding a few days ago and thanks to the modding tutorials by _bedrock_miner_, shadowfacts.net and jabelar and thank to diesieben07's and Choonster's amazing effort to answer questions in this forum, I already came quite far. However now I'm stuck. I started out with a simple currency mod, for which I added a "Money" Capability, implementing "IMoney" and a "UpdateMoneyMessage" Message. Code here: http://pastebin.com/hu7w6kVi So as you can see, whenever I call "addMoney" or "setMoney", I also want to call "onMoneyUpdate", so I can dispatch a "UpdateMoneyMessage" to the player, to inform him about the change. However from the "Money" class, I have no access to the parent Entity owning this capability. How should I solve this problem?. (see line 20 in the paste for the part where I'm stuck).
February 18, 20178 yr Store the player in a field of the Money class. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
February 18, 20178 yr Author Okay, straight forward enough. Wasn't quite sure if this was considered "good practice". In any case, how would I go about "injecting" the owning Entity into the capability then. AFAIK, the "Money" Capability is instantiated by "getDefaultInstance" in the capability provider, however this method takes no arguments. Is it even possible for the capability to have a non-default constructor? The only solution that comes to my mind right now is to inject the owning Entity after construction of the Capability instance in the "onAttachCapabilitiesEvent" handler. More code: http://pastebin.com/JiGSiAZT
February 18, 20178 yr Author Now I am even more confused. Ok, let me just go over things, so you guys can make sure I understand this stuff correctly. So I have the interface IMoney with an implementation Money, which I want to be the default implementation. I also have aMoneyProvider and a MoneyStorage (lets leave that one aside for the moment) and a event handler running in the CommonProxy domain. In the event handler, I have a static ResourceLocation, indicating the default implementation of the money capability. I pass this resource to the addCapability function in the onAttachCapabilitiesEvent handler, together with a new instance of MoneyProvider. So far so good. Now if I understand correctly, an instance of Capability<Money> is instantiated by the capability framework using the passed ResourceLocation and injected into theCapabilityInject@ annoated field MONEY_CAPABILITY. The MoneyProvider then uses this injected Capability<Money> object to get a reference to a new instance of the default implementation Money (as specified in the original ResourceLocation) and uses this one as instance here: private IMoney instance = MONEY_CAPABILITY.getDefaultInstance(); . So ultimately the Money instance is constructed by the Capability<Money> object, so I have no access to the constructor call of Money. All correct so far? So how would I pass the owning Entity to Money? And could you possibly elaborate the purpose of the Provider class? is it used used to link everything together? Edited February 18, 20178 yr by Xaser typos
February 18, 20178 yr 3 minutes ago, diesieben07 said: You can simply use a constructor and pass the player instance to it. like so https://gist.github.com/anonymous/5bf4cc6042dd370368af6370afa35415
February 18, 20178 yr Author Awesome, got it, thank you. so the entity has to pass through the provider to the actual capability. This would still leave the question whether this can be achieved with a defaultImplementation at all, however for my needs I am fine with not using defaultImplementation. Thanks!
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.