Non résolu Probleme packet
-
Bonsoir, j’ai fait une machine ou il y a un bouton pour l’allumer, du coup j’ai un boolean dans mon tile entity et j’ai un packet qui est envoyé du gui quand on clique sur le bouton pour modifier cette valeur. Le probleme est que pour envoyer mon packet dans mon gui, j’utilise ZunCraft.network.sendToServer(new Packet(!this.tile.isOn(), this.tile.pos)); mais quand je print la valeur tile.isOn() depuis le gui, la valeur retourner est toujours false. J’ai mis un println dans mon packet pour voir si la valeur contenu dans l’IMessage et la valeur contenu dans le tileentity était les memes. J’ai mis un sysout de tile.isOn() et de message.isOn et sa confirme ce que je disais a propos du gui qui retourne faux tout le temps, le sysout tile.isOn renvoyait true et le sysout message.isOn renvoyait true aussi mais souvenez vous, quand j’envoi mon packet, j’envoi le contraire de tile.isOn() a savoir le contraire de false donc true. Pourtant j’ai visionner le tutoriel de robin et il n’avait pas ce probleme. Merci de votre aide ^^
Ma classe TileEntity:
public class TileEntityReactor extends TileEnergizedLockable implements IEnergyStorage, IEnergyReceiver, IEnergyProvider, ITickable { NonNullList<ItemStack> stacks = NonNullList.<ItemStack>withSize(1, ItemStack.EMPTY); private boolean isOn = false; public TileEntityReactor() { super(new EnergyStorage(2147483647)); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); isOn = nbt.getBoolean("IsOn"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("IsOn", isOn); return nbt; } @Override public int getField(int id) { switch (id) { } return 0; } @Override public void setField(int id, int value) { switch (id) { } } @Override public int getFieldCount() { return 0; } @Override public int getSizeInventory() { return this.stacks.size(); } @Override public ItemStack getStackInSlot(int index) { return this.stacks.get(index); } @Override public ItemStack decrStackSize(int index, int count) { return ItemStackHelper.getAndSplit(this.stacks, index, count); } @Override public ItemStack removeStackFromSlot(int index) { return ItemStackHelper.getAndRemove(stacks, index); } @Override public void setInventorySlotContents(int index, ItemStack stack) { this.stacks.set(index, stack); if (stack.getCount() > this.getInventoryStackLimit()) { stack.setCount(this.getInventoryStackLimit()); } } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isEmpty() { for (ItemStack stack : this.stacks) { if (!stack.isEmpty()) { return false; } } return true; } @Override public void clear() { for (int i = 0; i < this.stacks.size(); i++) { this.stacks.set(i, ItemStack.EMPTY); } } @Override public void openInventory(EntityPlayer player) { } @Override public void closeInventory(EntityPlayer player) { } @Override public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn) { return null; } @Override public String getGuiID() { return null; } public boolean isUsableByPlayer(EntityPlayer player) { return this.world.getTileEntity(this.pos) != this ? false : player .getDistanceSq((double) this.pos.getX() + 0.5D, (double) this.pos.getY() + 0.5D, (double) this.pos.getZ() + 0.5D) <= 64.0D; } @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return true; } @Override public boolean hasCustomName() { return false; } @Override public String getName() { return "Coucou"; } public boolean isOn() { return isOn; } public void setOn(boolean isOn) { this.isOn = isOn; } @Override public SPacketUpdateTileEntity getUpdatePacket() { NBTTagCompound nbtTagCompound = new NBTTagCompound(); this.writeToNBT(nbtTagCompound); return new SPacketUpdateTileEntity(pos, 0, nbtTagCompound); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { this.readFromNBT(pkt.getNbtCompound()); this.markDirty(); } @Override public void update() { if (!world.isRemote) { inputEnergy(); outputEnergy(); if (isOn()) { } } } @Override public int extractEnergy(EnumFacing enumFacing, int i, boolean b) { return this.extractEnergy(i, b); } @Override public int receiveEnergy(EnumFacing enumFacing, int i, boolean b) { return this.receiveEnergy(i, b); } @Override public int receiveEnergy(int i, boolean b) { return storage.receiveEnergy(i, b); } @Override public int extractEnergy(int i, boolean b) { return storage.extractEnergy(i, b); } @Override public int getEnergyStored() { return storage.getEnergyStored(); } @Override public int getMaxEnergyStored() { return storage.getMaxEnergyStored(); } @Override public boolean canConnectEnergy(EnumFacing enumFacing) { return true; } }
Ma classe gui:
public class GuiReactor extends GuiContainerBase { private TileEntityReactor tile; private static final ResourceLocation BACKGROUND_TEXTURE = new ResourceLocation(Constants.MODID, "textures/gui/container/reactor.png"); private boolean isOn; public GuiReactor(InventoryPlayer inventoryPlayer, TileEntityReactor tile) { super(new ContainerReactor(inventoryPlayer, tile)); this.tile = tile; this.ySize = 180; } @Override public void initGui() { super.initGui(); this.buttonList.add(new GuiButtonOn(guiLeft + 129, guiTop + 47)); } @Override protected void actionPerformed(GuiButton button) throws IOException { if (button.id == 0) { ZunCraft.network.sendToServer(new PacketSetOn(!tile.isOn(), tile.getPos())); } super.actionPerformed(button); } public void drawScreen(int mouseX, int mouseY, float partialTicks) { this.drawDefaultBackground(); super.drawScreen(mouseX, mouseY, partialTicks); this.renderHoveredToolTip(mouseX, mouseY); } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { this.mc.getTextureManager().bindTexture(BACKGROUND_TEXTURE); this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize); drawPowerJauge(guiLeft + 8, guiTop + 8); drawJauge(guiLeft + 146, guiTop + 8, 3000, 3000); drawJauge(guiLeft + 158, guiTop + 8, Integer.MAX_VALUE, this.tile.storage.getMaxEnergyStored()); drawString(fontRenderer, "Is Active: " + this.tile.isOn(), guiLeft + 38, guiTop + 46, 0xffffff); } public void drawPowerJauge(int x, int y) { int energy = Integer.MAX_VALUE / 2; int scaledEnergy = (int) (84f / this.tile.storage.getMaxEnergyStored() * energy); this.drawTexturedModalRect(x, y + (84 - scaledEnergy), 176, (84 - scaledEnergy), 28, scaledEnergy); addHoveringText("Coucou mec", x, y, x + 28, y + 84); } public void drawJauge(int x, int y, int value, int maxValue) { int barWidth = 8; int barHeight = 84; int scaledTemperature = (int) (80f / maxValue * value); this.drawTexturedModalRect(x - 1, y + (80 - scaledTemperature), 204, 0, 10, 4); addHoveringText(value + "°C / " + maxValue + "°C", x, y, x + barWidth, y + barHeight); } }
Ma classe packet:
public class PacketSetOn implements IMessage { private boolean isOn; private int x, y, z; public PacketSetOn() { } public PacketSetOn(boolean isOn, BlockPos pos) { this.isOn = isOn; this.x = pos.getX(); this.y = pos.getY(); this.z = pos.getZ(); } @Override public void fromBytes(ByteBuf buf) { isOn = buf.readBoolean(); x = buf.readInt(); y = buf.readInt(); z = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeBoolean(this.isOn); buf.writeInt(this.x); buf.writeInt(this.y); buf.writeInt(this.z); } public static class Handler implements IMessageHandler<PacketSetOn, IMessage> { @Override public IMessage onMessage(PacketSetOn message, MessageContext ctx) { EntityPlayerMP player = ctx.getServerHandler().player; TileEntity te = player.world.getTileEntity(new BlockPos(message.x, message.y, message.z)); if (te instanceof TileEntityReactor) { TileEntityReactor ter = ((TileEntityReactor) te); ter.setOn(message.isOn); System.out.println("Message: " + message.isOn); System.out.println("In Tile: " + ter.isOn()); ter.markDirty(); } return null; } } }
-
Le nbt tag isOn de la machine et dans quel état si ca se trouve ton paquet fait bien bouger les données mais les écrit jamais dans le nbt tag ?
Je suppose que tu utilise le nbt tag isOn pour stocker ta valeur dans le block j’ai lu ton code en diagonal j’avoue x) et donc si son état de départ est false et que ca change jamais puis que tu le lit ils seras toujours false