Jump to content

[SOLVED] Machine's GUI desync after re-entering the world


mokonaModoki

Recommended Posts

I've got a trouble with GUI. My GUI class has a variable which links to the machine's TileEntity object, but all the fields inside this object are nullified after re-entering the world and as the result, GUI can't have the right data.

 

I used debug and messages to find out that all the data in actual TileEntity object are loaded properly and that might be some kind of a desync problem between the server and client parts of the game. Also, there are some problems with item slots: the items placed inside dissapear from the slot, but when clicking on it again, they are being grabbed as if they were in the slot.

 

I had similar problems when 1.3.1 came out and that was the reason I stopped further development of my mod.

 

Here is the code of all the classes you might need. I count on your help.

MainModClass: http://pastebin.com/0v8Qda1H

ServerPacketHandler: http://pastebin.com/Tjscq5tE

ClientPacketHandler: http://pastebin.com/UkFHyzih

GUIHandler: http://pastebin.com/kuXGPXF6

GUIClass: http://pastebin.com/KyTBqp3U

TileEntityClass: http://pastebin.com/iKHv730c

BlockClass: http://pastebin.com/byrXsT8i

ContainerClass: http://pastebin.com/DvY1s47D

Link to comment
Share on other sites

Okay, I've decided to use custom packets to manually sync data between GUI and TileEntity, stored on server. In order to do this I need server world objectto get to the TileEntity I need. Could anyone help me? How do I get to the world object using static access or something..?

Link to comment
Share on other sites

I had to search a longer time for a stabel way to get the world, this is what I found (wrapped in a method in my commonproxy):

 

/**
* Gets the current world.
* @param dim int the dimension of the world
* 
* @return World the current world
*/
public World getWorld(int dim) {
return DimensionManager.getWorld(dim);
}

Link to comment
Share on other sites

Allright. I solved the problem by rewriting Container class.

When disconnecting from the world and logging in again my client apparently had no idea what data is stored in the TileEntity class, since it is stored on the server part.

 

I looked at vanilla ContainerFurnace code and figured out that 

public void addCraftingToCrafters(ICrafting par1ICrafting)

public void detectAndSendChanges()

and  public void updateProgressBar(int index, int value)

 

are responsible for syncing the client and server GUI parts. I just implemented these methods in my container class and made them do all the syncing stuff properly and voila - everything is displaying correctly and client side has all the data it needs to display machine's GUI properly.

 

That's my COntainer code now: http://pastebin.com/FKP4C0yN

Link to comment
Share on other sites

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

    • public class HUD { public Minecraft mc = Minecraft.getMinecraft(); public static class ModuleComparator implements Comparator<Module>{ @Override public int compare(Module o1, Module o2) { if (Minecraft.getMinecraft().fontRendererObj.getStringWidth(o1.name) > Minecraft.getMinecraft().fontRendererObj.getStringWidth(o2.name)){ return -1; } if (Minecraft.getMinecraft().fontRendererObj.getStringWidth(o1.name) < Minecraft.getMinecraft().fontRendererObj.getStringWidth(o2.name)){ return 1; } return 0; } } public void draw(){ ScaledResolution sr = new ScaledResolution(mc); FontRenderer fr = mc.fontRendererObj; Collections.sort(Client.modules, new ModuleComparator()); GlStateManager.pushMatrix(); GlStateManager.translate(4,4,0); GlStateManager.scale(1.5,1.5,1); GlStateManager.translate(-4, -4, 0); fr.drawString("Skyline", 10, 10, -1); GlStateManager.popMatrix(); int count = 0; for (Module m : Client.modules){ if (!m.toggled || m.name.equals("TabGUI")) continue; int offset = count* (fr.FONT_HEIGHT + 6); GL11.glTranslated(0.0f, 0.0f, -1.0f); Gui.drawRect(sr.getScaledWidth() - fr.getStringWidth(m.name) - 10, offset, sr.getScaledWidth() - fr.getStringWidth(m.name) - 8, 6 + fr.FONT_HEIGHT + offset, -1); Gui.drawRect(sr.getScaledWidth() - fr.getStringWidth(m.name) - 8, offset, sr.getScaledWidth(), 6 + fr.FONT_HEIGHT + offset, 0x90000000); fr.drawString(m.name, sr.getScaledWidth() - fr.getStringWidth(m.name) - 4, offset + 4, -1); count++; } Client.onEvent(new EventRenderGUI()); } } I have just recently stumbled upon this Problem, where the HudRenderer renders the wrong section of the textures and therefore completely destroys the Minecraft Armour and Hunger Bar. I am currently thinking if it is an issue with the DrawRect changing something it shouldn't. But I couldn't find anything about it. (To keep things Clean, the function is Called from another file) public class RenderGUIHandler { @SubscribeEvent public void renderGUI(RenderGameOverlayEvent.Post event){ Client.hud.draw(); } } Any help would be greatly appreciated  
    • Hello, I play on a private server (forge 47.2.0) (about 200 mods) with my friends. Everything is normal until the game crashes. I assume it's due to the generation of a chunk, possibly in a biome from the Aquamirae mod. Caused by: java.lang.NullPointerException: No chunk exists at [9, 38]     at net.minecraft.server.level.WorldGenRegion.m_6325_(WorldGenRegion.java:2079) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.server.level.WorldGenRegion.m_6924_(WorldGenRegion.java:375) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.levelgen.structure.structures.ShipwreckPieces$ShipwreckPiece.m_213694_(ShipwreckPieces.java:127) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.levelgen.structure.StructureStart.m_226850_(StructureStart.java:90) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.chunk.ChunkGenerator.m_223080_(ChunkGenerator.java:320) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at com.google.common.collect.ImmutableList.forEach(ImmutableList.java:422) ~[guava-31.1-jre.jar%2374!/:?]     at net.minecraft.world.level.chunk.ChunkGenerator.m_213609_(ChunkGenerator.java:319) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.chunk.ChunkStatus.m_279978_(ChunkStatus.java:108) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.chunk.ChunkStatus$SimpleGenerationTask.m_214024_(ChunkStatus.java:309) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.chunk.ChunkStatus.m_280308_(ChunkStatus.java:252) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$27(ChunkMap.java:643) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at com.mojang.datafixers.util.Either$Left.map(Either.java:38) ~[datafixerupper-6.0.8.jar%2377!/:?]     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$29(ChunkMap.java:634) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ~[?:?]     ... 11 more
    • that fixed it! Thank you soo much!!! If there is a way I can like upvote your profile or something let me know!
    • Also add the latest.log from the server after such disconnects
    • i am the host of the server, so im running the server and playing on it with a friend
  • Topics

×
×
  • Create New...

Important Information

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