NindyBun Posted June 21, 2021 Posted June 21, 2021 (edited) So I have a FontRenderer that displays the Fuel value of my tool, on a singleplayer world the text updates fine but once I go on the server the same text does not update. So I'm assuming that I would have to send the server packet to the client, problem is how would I do that if I need a ServerPlayerEntity. My Font renderer: https://github.com/NindyBun/BurnerGun_1.16.5/blob/master/src/main/java/com/nindybun/burnergun/client/renderer/FuelValueRenderer.java package com.nindybun.burnergun.client.renderer; import com.nindybun.burnergun.common.BurnerGun; import com.nindybun.burnergun.common.items.upgrades.Upgrade; import com.nindybun.burnergun.common.network.PacketHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.annotation.Nonnull; import java.awt.*; @Mod.EventBusSubscriber(modid = BurnerGun.MOD_ID, value = Dist.CLIENT) public class FuelValueRenderer { private static final Logger LOGGER = LogManager.getLogger(); private static final int base_buffer = com.nindybun.burnergun.common.items.Burner_Gun.BurnerGun.base_use_buffer; private static final int base_heat_buffer = com.nindybun.burnergun.common.items.Burner_Gun.BurnerGun.base_heat_buffer; @SubscribeEvent public static void renderOverlay(@Nonnull RenderGameOverlayEvent.Post event){ if (event.getType() == RenderGameOverlayEvent.ElementType.ALL){ ItemStack stack = ItemStack.EMPTY; PlayerEntity player = Minecraft.getInstance().player; if (player.getMainHandItem().getItem() instanceof com.nindybun.burnergun.common.items.Burner_Gun.BurnerGun) stack = player.getMainHandItem(); else if (player.getOffhandItem().getItem() instanceof com.nindybun.burnergun.common.items.Burner_Gun.BurnerGun) stack = player.getOffhandItem(); if (stack.getItem() instanceof com.nindybun.burnergun.common.items.Burner_Gun.BurnerGun) renderFuel(event, stack); } } public static void renderFuel(RenderGameOverlayEvent event, ItemStack stack){ FontRenderer fontRenderer = Minecraft.getInstance().font; IItemHandler handler = stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).orElse(null); int level = stack.getTag().getInt("FuelValue"); int hLevel = stack.getTag().getInt("HeatValue"); Color color; if (level > base_buffer*3/4) color = Color.GREEN; else if (level > base_buffer*1/4 && level <= base_buffer*3/4) color = Color.ORANGE; else color = Color.RED; if (hLevel > base_heat_buffer*3/4) color = Color.RED; else if (hLevel > base_heat_buffer*1/4 && hLevel <= base_heat_buffer*3/4) color = Color.ORANGE; else color = Color.GREEN; //fontRenderer.drawString(event.getMatrixStack(), "Fuel level: "+level, 6, event.getWindow().getScaledHeight()-12, Color.WHITE.getRGB()); if (!handler.getStackInSlot(0).getItem().equals(Upgrade.UNIFUEL.getCard().getItem()) && !handler.getStackInSlot(0).getItem().equals(Upgrade.REACTOR.getCard().getItem())){ fontRenderer.draw(event.getMatrixStack(), "Fuel level: ", 6, event.getWindow().getGuiScaledHeight()-12, Color.WHITE.getRGB()); fontRenderer.draw(event.getMatrixStack(), level+"", 61, event.getWindow().getGuiScaledHeight()-12, color.getRGB()); }else if (handler.getStackInSlot(0).getItem().equals(Upgrade.REACTOR.getCard().getItem())){ double heat = (double)hLevel/base_heat_buffer*100; String heatString = heat+""; int deci = heatString.lastIndexOf("."); heatString = heatString.substring(0, deci+2); fontRenderer.draw(event.getMatrixStack(), "Heat level: ", 6, event.getWindow().getGuiScaledHeight()-12, Color.WHITE.getRGB()); fontRenderer.draw(event.getMatrixStack(), heatString+"%", 61, event.getWindow().getGuiScaledHeight()-12, color.getRGB()); } } } My packet handler package com.nindybun.burnergun.common.network; import com.nindybun.burnergun.common.BurnerGun; import com.nindybun.burnergun.common.network.packets.PacketOpenAutoFuelGui; import com.nindybun.burnergun.common.network.packets.PacketOpenBurnerGunGui; import com.nindybun.burnergun.common.network.packets.PacketOpenTrashGui; import com.nindybun.burnergun.common.network.packets.PacketOpenUpgradeBagGui; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.network.NetworkDirection; import net.minecraftforge.fml.network.NetworkRegistry; import net.minecraftforge.fml.network.simple.SimpleChannel; public class PacketHandler { private static final String PROTOCOL_VERSION = "2"; private static int index = 0; public static final SimpleChannel INSTANCE = NetworkRegistry.ChannelBuilder .named(new ResourceLocation(BurnerGun.MOD_ID, "main")) .clientAcceptedVersions(PROTOCOL_VERSION::equals) .serverAcceptedVersions(PROTOCOL_VERSION::equals) .networkProtocolVersion(() -> PROTOCOL_VERSION) .simpleChannel(); public static void register(){ int id = 0; INSTANCE.registerMessage(id++, PacketOpenBurnerGunGui.class, PacketOpenBurnerGunGui::encode, PacketOpenBurnerGunGui::decode, PacketOpenBurnerGunGui.Handler::handle); INSTANCE.registerMessage(id++, PacketOpenAutoFuelGui.class, PacketOpenAutoFuelGui::encode, PacketOpenAutoFuelGui::decode, PacketOpenAutoFuelGui.Handler::handle); INSTANCE.registerMessage(id++, PacketOpenTrashGui.class, PacketOpenTrashGui::encode, PacketOpenTrashGui::decode, PacketOpenTrashGui.Handler::handle); INSTANCE.registerMessage(id++, PacketOpenUpgradeBagGui.class, PacketOpenUpgradeBagGui::encode, PacketOpenUpgradeBagGui::decode, PacketOpenUpgradeBagGui.Handler::handle); } public static void sendTo(Object msg, ServerPlayerEntity player) { if (!(player instanceof FakePlayer)) INSTANCE.sendTo(msg, player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); } public static void sendToServer(Object msg){ INSTANCE.sendToServer(msg); } } Yes I know, my coding is not the best looking. Edited June 21, 2021 by NindyBun Quote
NindyBun Posted June 21, 2021 Author Posted June 21, 2021 Quote PlayerEntity player = Minecraft.getInstance().player; Expand It might actually be this line that's causing the problem, but how else do I check if my itemstack is in a players hand so that I knows to draw the text? Quote
NindyBun Posted June 21, 2021 Author Posted June 21, 2021 On 6/21/2021 at 6:50 AM, NindyBun said: It might actually be this line that's causing the problem, but how else do I check if my itemstack is in a players hand so that I knows to draw the text? Expand So I figured out that when I try to get the nbt tag in the RenderGameOverlayEvent it doesn't show the updated values, only the values made when the item was created. Therefore how would I get the current updated tag when playing on the dedicated server? Quote
Draco18s Posted June 21, 2021 Posted June 21, 2021 (edited) On 6/21/2021 at 3:06 AM, NindyBun said: instanceof com.nindybun.burnergun.common.items.Burner_Gun.BurnerGun Expand You don't need a fully qualified name here if you just use an import statement. On 6/21/2021 at 9:33 PM, NindyBun said: Therefore how would I get the current updated tag when playing on the dedicated server? Expand You need to synchronize your data. Also, use a capability instead of NBTtags. NBT is for saving to disk, Capabilities are for runtime. On 6/21/2021 at 3:06 AM, NindyBun said: IItemHandler handler = stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).orElse(null); int level = stack.getTag().getInt("FuelValue"); Expand You aren't null-checking here. If you are absolutely sure your stack will have the capability, use orElseThrow(Exception). If you aren't sure, then use ifPresent(() -> {}) Edited June 21, 2021 by Draco18s 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.
NindyBun Posted June 22, 2021 Author Posted June 22, 2021 On 6/21/2021 at 9:53 PM, Draco18s said: You need to synchronize your data. Also, use a capability instead of NBTtags. NBT is for saving to disk, Capabilities are for runtime. Expand I've only ever used capability for messing with the itemstack's inventory so I don't exactly know how the process of using it for data goes, and I have read the documentation multiple times but I just can't wrap my head around it. To synchronize my data I would do that in the form of packets right? But what should I be sending and to where? Quote
NindyBun Posted June 22, 2021 Author Posted June 22, 2021 Okay, so I think I made the beginning of a capability but how do I set and get values? https://github.com/NindyBun/BurnerGun_1.16.5/tree/master/src/main/java/com/nindybun/burnergun/common/capabilities Quote
NindyBun Posted June 23, 2021 Author Posted June 23, 2021 https://github.com/NindyBun/BurnerGun_1.16.5/blob/master/src/main/java/com/nindybun/burnergun/common/items/GlitteringDiamond.java I was able to get the capability working but now I'm stuck on how to save the data... Quote
NindyBun Posted June 23, 2021 Author Posted June 23, 2021 (edited) On 6/23/2021 at 8:09 PM, NindyBun said: Nvm I got it working now Expand Scratch that. I have found one problem that is my fuel renderer is working as intended when the fuel level increases, but when it decreases the value doesn't change until I enter my world again. Why does that happen? https://github.com/NindyBun/BurnerGun_1.16.5/blob/master/src/main/java/com/nindybun/burnergun/client/renderer/FuelValueRenderer.java#L63 Edited June 23, 2021 by NindyBun Quote
NindyBun Posted June 24, 2021 Author Posted June 24, 2021 On 6/23/2021 at 9:11 PM, NindyBun said: Scratch that. I have found one problem that is my fuel renderer is working as intended when the fuel level increases, but when it decreases the value doesn't change until I enter my world again. Why does that happen? https://github.com/NindyBun/BurnerGun_1.16.5/blob/master/src/main/java/com/nindybun/burnergun/client/renderer/FuelValueRenderer.java#L63 Expand I continued messing with it and noticed that when the fuel value is above 500_000 which is half of the max buffer, the fuel renderer shows that it goes down, but when it gets below 500_000, I have to open my itemstack's gui to update it and I don't understand why it doesn't update by it self under 500_000. Quote
NindyBun Posted June 24, 2021 Author Posted June 24, 2021 https://github.com/NindyBun/BurnerGun_1.16.5/blob/master/src/main/java/com/nindybun/burnergun/common/network/packets/PacketFuelValue.java Okay...I got the fuel renderer to work properly after fixing the get/readsharetag but now when I try to play on a dedicated server, the fuel renderer doesn't work, I don't know if my packet handler is right. Quote
NindyBun Posted June 24, 2021 Author Posted June 24, 2021 On 6/24/2021 at 4:34 AM, NindyBun said: https://github.com/NindyBun/BurnerGun_1.16.5/blob/master/src/main/java/com/nindybun/burnergun/common/network/packets/PacketFuelValue.java Okay...I got the fuel renderer to work properly after fixing the get/readsharetag but now when I try to play on a dedicated server, the fuel renderer doesn't work, I don't know if my packet handler is right. Expand FINALLY, the whole problem was that I was accessing the wrong nbt tag in readShareTag this whole time. Quote
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.