Jump to content

LoganDark

Forge Modder
  • Posts

    19
  • Joined

Converted

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

LoganDark's Achievements

Tree Puncher

Tree Puncher (2/8)

0

Reputation

  1. Even that uses IInventory LOL Besides, I need get/setField. Thanks for the recommendation, though, I'll be sure to use that next time if I need something like a chest. Edit: I'm dumb, I can make the container take FurnaceCapability instead of IItemHandler. Working on it...
  2. How do I use that for the GUI then? Is there a type of GUI slot that accepts IItemHandlers? Because the regular GUI Slot only accepts IInventories. I need the adapter, even though I use IItemHandler behind the scenes.
  3. What do I use instead? What TE? Is an ItemStack a TileEntity? No, so why would you mark it dirty? I'm pretty sure it saves on its own... -------------------------------------------------------------------- Please see my new post here: This one is obsolete.
  4. Hi, it's me again, back with the Potato Furnace. So, I have the furnace functionality working (just whatever you do, do NOT move/drop/touch the item in creative mode while it has items in it). If you download the mod (diamond2potato-1.0.jar or build it yourself), load it up in a singleplayer (or multiplayer, it works in both) world, run the /pfurnace command (for testing), and open the GUI, you'll find that the item you opened the GUI from is somewhat hard to move. You can't even drop it via Q, you can't pick it up with left or right click. However, there's some issues... Say you have it in hotbar slot 1. Hovering over that slot and pressing any other hotbar key will duplicate the stack to that slot. I know it's a duplicate because it multiplies the times the furnace capability's update function is called per tick, and dropping one of them makes them all disappear. Rejoining (singleplayer or multiplayer, still doesn't matter) causes all of these items to duplicate, including the items inside them. Here's a gif of that furnace updating thing: However, taking, for example, the result items out, result in ghost items in multiplayer that don't actually exist on the server, causing weird behavior. Hovering over any slot (doesn't have to be your hotbar) and pressing the key of the furnace slot (let's say slot 1 still) will cause it to disappear. Yep, gone forever. Of course, you can still take the items out of it, but only until you close the GUI. Picking up an item (like with your mouse) and then trying to swap it with the furnace causes your picked up item to become another duplicate of the furnace. When you place it in a slot, the furnace moves. The GUI stops updating. When you close it, the original disappears. But, you can use any item to keep duplicating furnaces from the original item, then when you close the GUI only the original will disappear. You can drop both duplicated items separately to prove they really duplicated. Shift-clicking it once will move it in your inventory, shift-clicking again will cause it to disappear. (assuming you used /pfurnace to spawn it, which puts it in the right configuration to do something like that) Oh, by the way, all of this item duplication stuff works and was tested in SMP. Sanity checks like dropping the items on the ground or rejoining the server were performed to make sure the item really was/wasn't duplicated. Now, I'd really like to implement server-side guards for this. I've tried to implement an IInventory for the GUI used on the server (and client too naturally), that tries to prevent any of this stuff. I know you can disable slots on the client side, since I had to reimplement ContainerFurnace to allow for any IInventory to be used, but I really want to get the server-side down FIRST before I prevent anything on the client. GitHub
  5. Okay, so after some more work I've made the potato furnace almost fully functional in singleplayer. You can move the item around in your inventory, drop it on the ground, etc. and pick it back up and the state persists. GitHub commit It still doesn't work in multiplayer. Even in singleplayer, sometimes when, for example, there's 16 Potatoes in the item slot and you try to drop 16 on top, the 16 extra disappears. Any more advice on how to make this work?
  6. Okay, so I did some updates. First, I'm now using Items and Blocks for almost all vanilla items/blocks (minus potatoFood and bakedPotatoFood in the Diamond2Potato class, to not have to cast them to ItemFood every time I use their ItemFood methods). Second, I've moved the Potato Furnace over to Capabilities. Now, the new Capability-based furnace seems to work okay, except for one problem. It doesn't seem to save, and items disappear randomly if you drop the item, move it around, etc. Now, I've defined the Capabilities.IStorage methods in my capability, but it doesn't seem to do anything on its own. So, my question now is, how do I get it to save? Should I just save it manually using the stack's tag compound using a 'mark dirty' method of some sort? Additionally, how do I keep this in sync between client and server? Does it just happen automatically, or is there something specific I should do? Capabilities commit
  7. ResourceLocations have a namespace argument that's always set to my mod ID, that's what Forge uses for the namespace, right? Oh, wait, so I can use ObjectHolders in each class that uses them...? Or Item.getByNameOrId?
  8. So I need a field for every item in my mod? I have no issue with ObjectHolder. I have an issue with having to manually create variables for each item and assign an instance to it manually for every single item in the mod. I'm not saying I WOULDN'T do it, I'm just trying to figure out why exactly I SHOULD do it, rather than what I'm doing right now, which is adding an entry to an array and calling it good. Could you give me an example of it not "working correctly"? Okay, thank you. Sorry I haven't read the javadoc... I'm going to go try things now. Now that I have the mod in version control, I can go crazy. I'll provide an update if things change.
  9. Isn't an item just a data structure, with methods and such? I don't see anything wrong with instantiating one without registering it, but I'll see if I can remove that. So I need an ObjectHolder for every item in my mod rather than doing it the way I currently do? It probably doesn't make any difference if I instantiate my singleton items before or during registration. Items don't do anything on their own when instantiated, right? Please do clarify on this though, what could go wrong if I keep doing it the way I currently do? How would I keep a separate instance of the Capability for each item? I have no idea how to do this other than instantiating it every tick in onUpdate. Unless something else handles what I return from initCapabilities? I'm confused, you need to provide more info than "read the docs" because the docs don't actually detail this. They just say "make an instance of the capability and override get/hasCapability". Read it yourself and then tell me how useful that is!
  10. Sorry, didn't know if-else could be that small, heh... And, well, I instantiated ItemFood because I didn't want to reimplement everything (even if it is just copy and paste). Also, where would I put the lateinit? Would I store all items in their own variables under my mod class and register them all individually? Put them in companion objects and use reflection to set it during the registration step? Also, sure I can override initCapabilities but what do I put in it? The docs are completely unclear on this.
  11. Only works on vars (which are then forever cursed with the absence of a non-null guarantee, requiring me to use !! everywhere I use it), and I strongly prefer using vals. I'll look into it.
  12. Issue 5 was detailed in my post, read it. If you want me to use capabilities you're going to have to tell me how they work because I don't know how to put capabilities in an item. Issue 10, point taken, I'm in the process of fixing it and pushing it to GitHub. Issue 14, at first I didn't understand what you meant, but then I realized you didn't mean registering them, but actually instantiating them (like ItemPotatoPickaxe and such). I only do that so I don't have to add ? to all the types. I know Forge replaces them at runtime using reflection, which is why I assign dumb values to them, knowing they'll change. Kotlin has no "guaranteed to be injected at runtime" annotation, unfortunately. And there's a difference between nullable and non-nullable types. I wasn't actually aware that Items existed until a while ago. Point taken I do that so I can use val rather than var, but still, point taken. Kotlin has no ternary which is what I would've used. These are not item instances, they're classes, like ItemHoe or ItemFood. ItemHoeFood is an ItemHoe that can be eaten. It's meant to be subclassed, not registered. Then the subclasses registered. See ItemPotatoHoe.
  13. So I'm trying to make a silly "mobile furnace". I have it mostly functional, but (inventory) items don't update on the client unless you reopen the GUI, and I feel like I'm doing something horribly, deeply wrong, as this should probably not be the case for any use of Container/IInventory (because detectAndSendChanges). I've been studying the TileEntityFurnace/TileEntityChest classes a LOT trying to figure out what to do here. But it's really really hard to do things, since there are no instances of items, so I can't use class variables or whatever. That's fine, I'll just load from NBT and then save it again in onUpdate. Which is bad, I hate it. So, I'm really, badly needing a code review. I need someone to look at my code, figure out what's wrong with it, and please please teach me how to do it right. I never thought something as simple as an item furnace could be so complicated... The simplest way for you to see how things are, my code, and etc. is to download the project and run it for yourself. ./gradlew setupDecompWorkspace idea genIntellijRuns and so on. The project's on GitHub. Here are some quick links to the Kotlin files, if you want to take a look without downloading it: ItemPotatoFurnace (the Item) ContainerPotatoFurnace (the ContainerFurnace) GuiPotatoFurnace (the GuiFurnace) InventoryPotatoFurnace (the IInventory) If you can teach me how to use capabilities for items, that would be great too. The forge docs are SO confusing on capabilities, I wouldn't even know how to use them for blocks. Basically, I'm just really looking for help on anything. If you can, teach me how to keep the items synchronized on client and server. Anything else would definitely be appreciated. I started modding about 2 days ago, never touched the MDK ever before that. This is also my first time with Kotlin, hehe. Notes for each thingy: The item: This isn't listed in a creative tab like the other items so you'll have to use /give @p diamond2potato:potato_furnace. Right click to open the furnace, obviously. Use it like a normal furnace. It'll keep smelting as long as it's in your inventory, I think. I haven't checked if onUpdate gets called in a chest. The container: It has a logger left over from when I made sure this was being called, it's weird. You can ignore it, or remove it (which would be nice for keeping your logs clean) The GUI: Just a GuiFurnace. I made it its own class in case I need to change anything, but I don't think I'll need to. The inventory: This is where I think my error is. There's, of course, the item implementation which mandates some sort of bad practice due to the way it handles things (advice would be appreciated by the way), but this inventory is probably the source of all my problems. I would love to use capabilities but I'm just not sure how. Please advise...
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.