Jump to content

[1.14.4] Best way to sync progress in tile entity.


Recommended Posts

Posted

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!

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;
Posted

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.

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.

Posted
  On 11/21/2019 at 5:09 PM, 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.

Expand  

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.

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;
Posted
  On 11/21/2019 at 5:15 PM, Legenes said:

exampleItemStack.getBurnTime() always returns -1 for some reason

Expand  

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.

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;
Posted
  On 11/21/2019 at 5:19 PM, 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.

Expand  

I found out that it's most likely that I need to use the

net.minecraftforge.common.ForgeHooks.getBurnTime()

instead.

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;
Posted (edited)
  On 11/21/2019 at 5:18 PM, diesieben07 said:

Look at what the vanilla furnace does (AbstractFurnaceContainer).

Expand  

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 by Legenes
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;
Posted
  On 11/21/2019 at 5:19 PM, Legenes said:

I don't know if the "vanilla" logic is failing, or I need to use something else, but this is weird.

Expand  

Items, in general, by default, are not furnace fuel. If an item is fuel, it will override that method.

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.

Posted
  On 11/21/2019 at 6:02 PM, Draco18s said:

Items, in general, by default, are not furnace fuel. If an item is fuel, it will override that method.

Expand  

 

  On 11/21/2019 at 5:22 PM, Legenes said:

I found out that it's most likely that I need to use the

net.minecraftforge.common.ForgeHooks.getBurnTime()

instead.

Expand  

I figured it out, and now I use the correct method, but thanks anyway ☺️. (It works.)

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;
Posted
  On 11/21/2019 at 6:03 PM, diesieben07 said:

... unless it is a vanilla fuel item. Which is why you need to call the method in ForgeHooks.

Expand  

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.

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.

Posted
  On 11/21/2019 at 6:01 PM, 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);
    }

 

Expand  

It super weird... the values are only updated when the GUI is opened, after that it doesn't track them.

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;
Posted
  On 11/21/2019 at 6:13 PM, diesieben07 said:

Show your implementation of IIntArray.

Expand  

Well... I have this only:

    private IIntArray fields = new IntArray(2);

This is in my TileEntity's class.

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;
Posted
  On 11/21/2019 at 6:15 PM, Legenes said:

Well... I have this only:

    private IIntArray fields = new IntArray(2);

This is in my TileEntity's class.

Expand  

Okay, so I need to implement my own IIntArray, I'm so dumb, sry. I didn't look at the AbstractFurnaceTileEntity.

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;
Posted
  On 11/21/2019 at 6:16 PM, diesieben07 said:

IntArray is not a minecraft class...

Expand  

It is, but I get the point.

import net.minecraft.util.IntArray;

 

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;
Posted (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 by Legenes
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;

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • The weird part also is that a little while ago today i made a vanilla profile for mc 1.8.9 for testing without and forge mod loader attached and it still crashed with error code 1 so I don't know if it's the version jar or what. 
    • yep I just tried to start the newest version of RL craft and it crashed error code 1. I  tried  All The mods 9 the latest version and it worked fine and it was forge version 47.4.0.
    • I tried to startup a mod pack (Ultimate hypixel package 1.8.9) and it was crashing with minecraft error code 1 mind you it was working fine up until today. So I tried making a new profile in curseforge with no mods but same minecraft version and same forge version and it also crashed on startup.       Forge profile log:  [10:06:00] [main/INFO]:Loading tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker [10:06:00] [main/INFO]:Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker [10:06:00] [main/INFO]:Calling tweak class net.minecraftforge.fml.common.launcher.FMLTweaker [10:06:00] [main/INFO]:Forge Mod Loader version 11.15.1.2318 for Minecraft 1.8.9 loading [10:06:00] [main/INFO]:Java is Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_51, running on Windows 10:amd64:10.0, installed at C:\Users\JoeKa\curseforge\minecraft\Install\runtime\jre-legacy\windows-x64\jre-legacy [10:06:00] [main/INFO]:Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker [10:06:00] [main/INFO]:Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker [10:06:00] [main/INFO]:Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker [10:06:00] [main/INFO]:Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker [10:06:00] [main/INFO]:Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper [10:06:01] [main/INFO]:Found valid fingerprint for Minecraft Forge. Certificate fingerprint e3c3d50c7c986df74c645c0ac54639741c90a557 [10:06:01] [main/INFO]:Found valid fingerprint for Minecraft. Certificate fingerprint cd99959656f753dc28d863b46769f7f8fbaefcfc [10:06:01] [main/INFO]:Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper [10:06:01] [main/INFO]:Calling tweak class net.minecraftforge.fml.common.launcher.FMLDeobfTweaker [10:06:01] [main/INFO]:Loading tweak class name net.minecraftforge.fml.common.launcher.TerminalTweaker [10:06:01] [main/INFO]:Calling tweak class net.minecraftforge.fml.common.launcher.TerminalTweaker [10:06:01] [main/INFO]:Launching wrapped minecraft {net.minecraft.client.main.Main} [10:06:02] [main/ERROR]:Unable to launch java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_51] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_51] at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_51] at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?] Caused by: java.lang.UnsatisfiedLinkError: no lwjgl64 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865) ~[?:1.8.0_51] at java.lang.Runtime.loadLibrary0(Runtime.java:870) ~[?:1.8.0_51] at java.lang.System.loadLibrary(System.java:1122) ~[?:1.8.0_51] at org.lwjgl.Sys$1.run(Sys.java:72) ~[lwjgl-2.9.4-nightly-20150209.jar:?] at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_51] at org.lwjgl.Sys.doLoadLibrary(Sys.java:66) ~[lwjgl-2.9.4-nightly-20150209.jar:?] at org.lwjgl.Sys.loadLibrary(Sys.java:87) ~[lwjgl-2.9.4-nightly-20150209.jar:?] at org.lwjgl.Sys.<clinit>(Sys.java:117) ~[lwjgl-2.9.4-nightly-20150209.jar:?] at net.minecraft.client.Minecraft.func_71386_F(Minecraft.java:2756) ~[ave.class:?] at net.minecraft.client.main.Main.main(SourceFile:41) ~[Main.class:?] ... 6 more [10:06:02] [main/INFO]:[java.lang.ThreadGroup:uncaughtException:1052]: net.minecraftforge.fml.relauncher.FMLSecurityManager$ExitTrappedException [10:06:02] [main/INFO]:[java.lang.ThreadGroup:uncaughtException:1052]: at net.minecraftforge.fml.relauncher.FMLSecurityManager.checkPermission(FMLSecurityManager.java:30) [10:06:02] [main/INFO]:[java.lang.ThreadGroup:uncaughtException:1052]: at java.lang.SecurityManager.checkExit(SecurityManager.java:761) [10:06:02] [main/INFO]:[java.lang.ThreadGroup:uncaughtException:1052]: at java.lang.Runtime.exit(Runtime.java:107) [10:06:02] [main/INFO]:[java.lang.ThreadGroup:uncaughtException:1052]: at java.lang.System.exit(System.java:971) [10:06:02] [main/INFO]:[java.lang.ThreadGroup:uncaughtException:1052]: at net.minecraft.launchwrapper.Launch.launch(Launch.java:138) [10:06:02] [main/INFO]:[java.lang.ThreadGroup:uncaughtException:1052]: at net.minecraft.launchwrapper.Launch.main(Launch.java:28)  
  • Topics

×
×
  • Create New...

Important Information

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