Legenes Posted November 21, 2019 Posted November 21, 2019 Hi! I was thinking about making a machine that generates RF from fuels, and it should display its current progress of burning. My problem is that I don't know the best way to sync up the tile with the GUI. Should I use a custom capability or just a packet of some kind? If I should use one of them, what should I implement? Thanks for the help! Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Draco18s Posted November 21, 2019 Posted November 21, 2019 You don't need to sync very much or very often. The client, provided that the amount of fuel has been synced as the result of an inventory change, can calculate the RF conversion process all on its own using the exact same code as the server side tile entity. There is no point or need to sync the progress. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Legenes Posted November 21, 2019 Author Posted November 21, 2019 2 minutes ago, Draco18s said: You don't need to sync very much or very often. The client, provided that the amount of fuel has been synced as the result of an inventory change, can calculate the RF conversion process all on its own using the exact same code as the server side tile entity. There is no point or need to sync the progress. Sorry, I may have said something incorrectly. This block is like a furnace but without an output. I want to be able to see how much more the item inside is going to last as a fuel, like the little flame in the furnace. That depends on the currently burnt item's burn time (where the exampleItemStack.getBurnTime() always returns -1 for some reason) and how many ticks did I burn it for. I want to sync the the little flame if you get what I mean. Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Legenes Posted November 21, 2019 Author Posted November 21, 2019 2 minutes ago, Legenes said: exampleItemStack.getBurnTime() always returns -1 for some reason I found this in the IForgeItem class: /** * @return the fuel burn time for this itemStack in a furnace. Return 0 to make * it not act as a fuel. Return -1 to let the default vanilla logic * decide. */ default int getBurnTime(ItemStack itemStack) { return -1; } I don't know if the "vanilla" logic is failing, or I need to use something else, but this is weird. Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Legenes Posted November 21, 2019 Author Posted November 21, 2019 2 minutes ago, Legenes said: I found this in the IForgeItem class: /** * @return the fuel burn time for this itemStack in a furnace. Return 0 to make * it not act as a fuel. Return -1 to let the default vanilla logic * decide. */ default int getBurnTime(ItemStack itemStack) { return -1; } I don't know if the "vanilla" logic is failing, or I need to use something else, but this is weird. I found out that it's most likely that I need to use the net.minecraftforge.common.ForgeHooks.getBurnTime() instead. Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Legenes Posted November 21, 2019 Author Posted November 21, 2019 (edited) 47 minutes ago, diesieben07 said: Look at what the vanilla furnace does (AbstractFurnaceContainer). I tried to pass an IIntArray as the vanilla container does, with the values I need, I save it in a variable and I use this.trackIntArray(), but it only updates when I open the block. Am I missing something? private IIntArray fields; public MachineBlockContainer(int id, World clientWorld, BlockPos pos, PlayerInventory playerInv, PlayerEntity player, IIntArray Fields) { super(MachineBlock_Container, id); //* other stuff *// fields = Fields; //* other stuff *// this.trackIntArray(Fields); } Edited November 21, 2019 by Legenes Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Draco18s Posted November 21, 2019 Posted November 21, 2019 41 minutes ago, Legenes said: I don't know if the "vanilla" logic is failing, or I need to use something else, but this is weird. Items, in general, by default, are not furnace fuel. If an item is fuel, it will override that method. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Legenes Posted November 21, 2019 Author Posted November 21, 2019 Just now, Draco18s said: Items, in general, by default, are not furnace fuel. If an item is fuel, it will override that method. 39 minutes ago, Legenes said: I found out that it's most likely that I need to use the net.minecraftforge.common.ForgeHooks.getBurnTime() instead. I figured it out, and now I use the correct method, but thanks anyway ☺️. (It works.) Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Draco18s Posted November 21, 2019 Posted November 21, 2019 Just now, diesieben07 said: ... unless it is a vanilla fuel item. Which is why you need to call the method in ForgeHooks. Well, yes. Because vanilla did things in a way that aren't extendable. I'm not debating that. I'm saying that the method is returning a sensible value and that it's the wrong thing to look at. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Legenes Posted November 21, 2019 Author Posted November 21, 2019 6 minutes ago, Legenes said: I tried to pass an IIntArray as the vanilla container does, with the values I need, I save it in a variable and I use this.trackIntArray(), but it only updates when I open the block. Am I missing something? private IIntArray fields; public MachineBlockContainer(int id, World clientWorld, BlockPos pos, PlayerInventory playerInv, PlayerEntity player, IIntArray Fields) { super(MachineBlock_Container, id); //* other stuff *// fields = Fields; //* other stuff *// this.trackIntArray(Fields); } It super weird... the values are only updated when the GUI is opened, after that it doesn't track them. Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Legenes Posted November 21, 2019 Author Posted November 21, 2019 Just now, diesieben07 said: Show your implementation of IIntArray. Well... I have this only: private IIntArray fields = new IntArray(2); This is in my TileEntity's class. Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Legenes Posted November 21, 2019 Author Posted November 21, 2019 1 minute ago, Legenes said: Well... I have this only: private IIntArray fields = new IntArray(2); This is in my TileEntity's class. Okay, so I need to implement my own IIntArray, I'm so dumb, sry. I didn't look at the AbstractFurnaceTileEntity. Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Legenes Posted November 21, 2019 Author Posted November 21, 2019 1 minute ago, diesieben07 said: IntArray is not a minecraft class... It is, but I get the point. import net.minecraft.util.IntArray; Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
Legenes Posted November 21, 2019 Author Posted November 21, 2019 (edited) Finally, here's my working implementation: private final IIntArray fields = new IIntArray() { public int get(int index) { switch(index) { case 0: return MachineBlockTile.this.counter; case 1: return MachineBlockTile.this.burnTime; default: return 0; } } public void set(int index, int value) { switch(index) { case 0: MachineBlockTile.this.counter = value; break; case 1: MachineBlockTile.this.burnTime = value; break; } } public int size() { return 2; } }; Thanks for the help! Edited November 21, 2019 by Legenes Quote procedure WakeMeUp(Integer plusTime); var I: Integer; begin for I := 0 to plusTime do begin println('One more minute!'); Sleep(1000); end; println('Okay, nothing to worry, I''m alive!'); println('So... somebody can give me a coffee?'); println('I know it''s Pascal, and not Java, but I love it :D.'); end;
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.