Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Synchronizing GUI


Stjubit
 Share

Recommended Posts

Hello,

 

I have a GUI with 2 Buttons (ON and OFF) which activates/deactivates a redstone signal. My problem is, that when two player's are accessing the same GUI and one player clicks the ON-Button, the other player doesn't see that. How can I make all other players updating their GUIs?

 

I am already sending a packet to the server with the new state. This packet redirects the state to the container which sets it in the TileEntity.

 

I hope you can understand my problem, thanks,

Julian

Link to comment
Share on other sites

"a redstone signal" - you need to store this somewhere, e.g. in metadata or whatever. Then just access that information in the GUI (metadata would be synced automatically, everything else you would have to do by hand) and send a packet to the server to change it when the button is clicked.

Link to comment
Share on other sites

I stored the redstonesignal in the TileEntity and I did it all by hand.

Immediatly after the player opens a GUI, I send a packet to the player with the redstonesignal to display it in the GUIContainer.

 

But how can I "update" the GUI of all players with the new redstonesignal when the GUI is already opened?

Link to comment
Share on other sites

But if i try to get the redstonesignal of the TileEntity in the initGui()-method, the redstonesignal is always null. I think that I always need to send the redstonesignal to the client immediatly after I open the GUI. Otherwise everything will be null, because I can't get things on the Server from the Client without packets, or am I something missunderstanding?

Link to comment
Share on other sites

EDIT:

 

Okay, everything is working fine except for keeping track which players have opened the GUI.

So, I created a List of EntityPlayerMP and every time someone is opening the GUI, I add the player to the List.

In the GUIContainer, I overwrote the onGuiClosed()-method to remove the player when he closed the GUI.

 

Now the problem: When the player has the GUI opened and stops the Minecraft process (or clicks on the X), the onGuiClosed()-method isn't called.

Is there a event which is fired when the player leaves the game?

 

Thanks,

Julian

Link to comment
Share on other sites

EDIT:

 

I can't send the packet to all around, because if there are 2 blocks next to each other and player1 is accessing the gui in block1 and player2 is accessing the gui in block2, both players will get the update and that's a huge problem.

 

So, I need to check if the player (to which the packet was sent) has opened the same GUI, but how?!?

 

It seems that I ran into a bit of a problem here :(

Link to comment
Share on other sites

Again I will say, when the tile entity on the server changes, tell it to send a packet to the client updating its tilentity.

 

  markblockforupdate.  Have your tilentity read/write the nbt data correctly.

 

Let the GUI naturally update with the new data from your freshly updating tile. 

 

You don't need to worry about who has what opened.

 

 

Long time Bukkit & Forge Programmer

Happy to try and help

Link to comment
Share on other sites

Gui

  - render background, text, whatever the heck

      - tile.getMana()

 

oops, that returned zero or null

 

Sync data from server to client.

 

Wow, now the tile on client knows what server knows.

 

This time when my gui looks, it gets real info. 

 

 

In your tile

- make sure everytime you change a value, send the packet from server to client.  I actually mark a flag on the tile and then on a periodic tick update the client, but if you only have a few fields, so be it.

- make sure your variables is stored in NBT

- make sure the packetreceived on client method in the tile updates right.

 

Long time Bukkit & Forge Programmer

Happy to try and help

Link to comment
Share on other sites

  • 3 weeks later...

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
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.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Thanks for your reply! I have done it using data generation now. It works well for world generation, and I have realised that I don't care about saplings, so it works well. For anyone looking to do something similar, I include files to show what I did. They are just a bit hacky and incomplete now, but they can probably easily be generalised.   import static net.anju.larus.data.ResourceLocationUtil.prefix; import static net.anju.larus.data.ResourceLocationUtil.slash; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public abstract class LarusFeatureProvider<T> implements DataProvider { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); protected final Set<FeatureEntry> featureEntries = new HashSet<>(); private final DataGenerator generator; protected LarusFeatureProvider(DataGenerator generator, Registry<T> registry) { this.generator = generator; for (Map.Entry<ResourceKey<T>, T> entry : registry.entrySet()) { ResourceKey<T> key = entry.getKey(); T feature = entry.getValue(); JsonElement jsonElement = getJson(feature); if (jsonElement != null) { FeatureEntry featureEntry = new FeatureEntry(prefix(key.location(), key.getRegistryName()), jsonElement); featureEntries.add(featureEntry); } } } private void addFeatures() { for (FeatureEntry featureEntry : featureEntries) { modifyFeatureEntry(featureEntry); } } protected abstract void modifyFeatureEntry(FeatureEntry featureEntry); @Override public void run(HashCache cache) { addFeatures(); writeFiles(cache, this.generator.getOutputFolder(), featureEntries); } // Actually write out the tables in the output folder private static void writeFiles(HashCache cache, Path outputFolder, Set<FeatureEntry> featureEntries) { for (FeatureEntry featureEntry : featureEntries) { if (featureEntry.isModified()) { ResourceLocation key = featureEntry.resourceLocation; JsonElement jsonElement = featureEntry.jsonElement; Path path = getPath(outputFolder, key); try { DataProvider.save(GSON, cache, jsonElement, path); } catch (IOException e) { LarusMod.LOGGER.error("Couldn't write data {}", key, e); } } } } @Override public String getName() { return "Larus features"; } @Nullable public JsonElement getJson(T feature) { if (feature instanceof ConfiguredFeature<?, ?> configuredFeature) { Optional<JsonElement> optional = ConfiguredFeature.DIRECT_CODEC.encodeStart(JsonOps.INSTANCE, configuredFeature).result(); return optional.orElse(null); } return null; } public static Path getPath(Path outputFolder, ResourceLocation key) { return outputFolder.resolve("data/" + slash(key) + ".json"); } protected static class FeatureEntry { boolean modified = false; private final ResourceLocation resourceLocation; private final JsonElement jsonElement; private FeatureEntry(ResourceLocation resourceLocation, JsonElement jsonElement) { this.resourceLocation = resourceLocation; this.jsonElement = jsonElement; } public JsonElement getJsonElement() { return jsonElement; } protected void markModified() { this.modified = true; } private boolean isModified() { return this.modified; } } } public class LarusLeavesFeatureProvider extends LarusFeatureProvider<ConfiguredFeature<?, ?>> { public LarusLeavesFeatureProvider(DataGenerator generator) { super(generator, BuiltinRegistries.CONFIGURED_FEATURE); } @Override protected void modifyFeatureEntry(FeatureEntry featureEntry) { JsonElement jsonElement = featureEntry.getJsonElement(); if (jsonElement.isJsonObject()) { JsonObject jsonObject = jsonElement.getAsJsonObject(); if (jsonObject.has("config")) { JsonObject config = jsonObject.get("config").getAsJsonObject(); if (config.has("foliage_provider")) { JsonObject mcFoliage = config.get("foliage_provider").getAsJsonObject(); JsonObject larusFoliage = larusFoliage(mcFoliage); if (larusFoliage != null) { config.add("foliage_provider", larusFoliage); featureEntry.markModified(); } } } } } @Nullable protected JsonObject larusFoliage(JsonObject mcFoliage) { JsonElement type = mcFoliage.get("type"); if (type.getAsString().equals("minecraft:simple_state_provider")) { JsonObject state = mcFoliage.get("state").getAsJsonObject(); // Change leaves String mcLeaves = state.get("Name").getAsString(); LarusLeavesBlock larusLeavesBlock = larusLeavesBlock(mcLeaves); if (larusLeavesBlock == null || larusLeavesBlock.getRegistryName() == null) return null; String larusLeaves = larusLeavesBlock.getRegistryName().toString(); state.add("Name", new JsonPrimitive(larusLeaves)); // Transform properties JsonObject mcProperties = state.get("Properties").getAsJsonObject(); transformProperties(mcProperties, larusLeavesBlock); } else { LarusMod.LOGGER.warn("Unexpected type for MC foliage " + mcFoliage); } return mcFoliage; } protected void transformProperties(JsonObject properties, LarusLeavesBlock larusLeavesBlock) { if (larusLeavesBlock instanceof LarusDeciduousLeavesBlock) properties.add("leafy", new JsonPrimitive("green")); } @Nullable protected LarusLeavesBlock larusLeavesBlock(String mcLeaves) { switch (mcLeaves) { case "minecraft:oak_leaves" -> { return LarusBlocks.OAK_LEAVES.get(); } case "minecraft:birch_leaves" -> { return LarusBlocks.BIRCH_LEAVES.get(); } case "minecraft:acacia_leaves" -> { return LarusBlocks.ACACIA_LEAVES.get(); } case "minecraft:jungle_leaves" -> { return LarusBlocks.JUNGLE_LEAVES.get(); } case "minecraft:dark_oak_leaves" -> { return LarusBlocks.DARK_OAK_LEAVES.get(); } case "minecraft:spruce_leaves" -> { return LarusBlocks.SPRUCE_LEAVES.get(); } } return null; } }  
    • the reason for that is the PlayerModel positions and rotations are set after the RenderPlayerEvent.Pre is fired change to Event to RenderPlayerEvent.Post
    • you can use BiomeLoadingEvent, loop through the Features you get from the Event and remove the Feature if it's the AmethystGeode Feature
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.