From 25bc8caeab73e9fed456442da3d62b417530ee8e Mon Sep 17 00:00:00 2001 From: CreepyCre Date: Tue, 9 Feb 2021 23:34:40 +0100 Subject: [PATCH] fix RiftConfigurationToolItem counter --- .../DimensionalDoorsClientInitializer.java | 26 +++++++-- .../item/RiftConfigurationToolItem.java | 39 ++++++++++++- .../PlayerInventorySlotUpdateS2CPacket.java | 55 +++++++++++++++++++ .../dimdev/dimdoors/world/level/Counter.java | 29 ++++++++-- .../pockets/generators/private/default.json | 2 +- .../pockets/generators/public/default.json | 2 + 6 files changed, 138 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/dimdev/dimdoors/network/s2c/PlayerInventorySlotUpdateS2CPacket.java diff --git a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsClientInitializer.java b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsClientInitializer.java index 414685db..15df5ddb 100644 --- a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsClientInitializer.java +++ b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsClientInitializer.java @@ -1,26 +1,27 @@ package org.dimdev.dimdoors; +import net.minecraft.nbt.CompoundTag; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dimdev.dimdoors.block.ModBlocks; import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes; import org.dimdev.dimdoors.client.ModSkyRendering; import org.dimdev.dimdoors.entity.ModEntityTypes; import org.dimdev.dimdoors.entity.MonolithEntity; import org.dimdev.dimdoors.fluid.ModFluids; +import org.dimdev.dimdoors.network.s2c.PlayerInventorySlotUpdateS2CPacket; import org.dimdev.dimdoors.particle.ModParticleTypes; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.network.PacketByteBuf; - import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; -import net.fabricmc.fabric.api.networking.v1.PacketSender; + +import java.io.IOException; @Environment(EnvType.CLIENT) public class DimensionalDoorsClientInitializer implements ClientModInitializer { + private static final Logger LOGGER = LogManager.getLogger(); @Override public void onInitializeClient() { ModEntityTypes.initClient(); @@ -31,5 +32,18 @@ public class DimensionalDoorsClientInitializer implements ClientModInitializer { ModParticleTypes.initClient(); ClientPlayNetworking.registerGlobalReceiver(DimensionalDoorsInitializer.MONOLITH_PARTICLE_PACKET, (client, networkHandler, buf, sender) -> MonolithEntity.spawnParticles(buf, client)); + + // TODO: change this to a normal Receiver with the inventory network handler attached. Will have to register/ unregister when a player joins/ leaves a world + ClientPlayNetworking.registerGlobalReceiver(PlayerInventorySlotUpdateS2CPacket.ID, (minecraftClient, clientPlayNetworkHandler, packetByteBuf, packetSender) -> { + PlayerInventorySlotUpdateS2CPacket packet = new PlayerInventorySlotUpdateS2CPacket(); + try { + packet.read(packetByteBuf); + minecraftClient.player.inventory.setStack(packet.getSlot(), packet.getStack()); + // TODO: remove commented out debug code + //LOGGER.info("Synced slot " + packet.getSlot() + " with item stack " + packet.getStack().toTag(new CompoundTag())); + } catch (IOException e) { + LOGGER.error(e); + } + }); } } diff --git a/src/main/java/org/dimdev/dimdoors/item/RiftConfigurationToolItem.java b/src/main/java/org/dimdev/dimdoors/item/RiftConfigurationToolItem.java index 7b16d47e..69016220 100644 --- a/src/main/java/org/dimdev/dimdoors/item/RiftConfigurationToolItem.java +++ b/src/main/java/org/dimdev/dimdoors/item/RiftConfigurationToolItem.java @@ -1,8 +1,15 @@ package org.dimdev.dimdoors.item; +import java.io.IOException; import java.util.List; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.hit.BlockHitResult; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.dimdev.dimdoors.DimensionalDoorsInitializer; import org.dimdev.dimdoors.block.entity.RiftBlockEntity; @@ -20,6 +27,7 @@ import net.minecraft.util.hit.HitResult; import net.minecraft.world.World; import net.fabricmc.api.Environment; +import org.dimdev.dimdoors.network.s2c.PlayerInventorySlotUpdateS2CPacket; import org.dimdev.dimdoors.rift.targets.IdMarker; import org.dimdev.dimdoors.util.EntityUtils; import org.dimdev.dimdoors.world.level.Counter; @@ -27,6 +35,7 @@ import org.dimdev.dimdoors.world.level.Counter; import static net.fabricmc.api.EnvType.CLIENT; public class RiftConfigurationToolItem extends Item { + private static final Logger LOGGER = LogManager.getLogger(); public static final String ID = "rift_configuration_tool"; @@ -55,7 +64,8 @@ public class RiftConfigurationToolItem extends Item { EntityUtils.chat(player, Text.of("Id: " + ((IdMarker) rift.getDestination()).getId())); } else { int id = counter.increment(); - EntityUtils.chat(player, Text.of("Rift stripped of data and set to target id: : " + id)); + sync(stack, player, hand); + EntityUtils.chat(player, Text.of("Rift stripped of data and set to target id: " + id)); rift.setDestination(new IdMarker(id)); } @@ -63,7 +73,8 @@ public class RiftConfigurationToolItem extends Item { return new TypedActionResult<>(ActionResult.SUCCESS, stack); } else { if(player.isSneaking()) { - counter.clear(); + counter.set(-1); + sync(stack, player, hand); EntityUtils.chat(player, Text.of("Counter has been reset.")); } else { EntityUtils.chat(player, Text.of("Current Count: " + counter.count())); @@ -81,4 +92,28 @@ public class RiftConfigurationToolItem extends Item { list.add(new TranslatableText(this.getTranslationKey() + ".info")); } } + + @Override + public ItemStack getDefaultStack() { + ItemStack defaultStack = super.getDefaultStack(); + Counter.get(defaultStack).set(-1); + return defaultStack; + } + + private void sync(ItemStack stack, PlayerEntity player, Hand hand) { + ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player; + PlayerInventorySlotUpdateS2CPacket packet; + if (hand == Hand.OFF_HAND) { + packet = new PlayerInventorySlotUpdateS2CPacket(45, stack); + } else { + packet = new PlayerInventorySlotUpdateS2CPacket(serverPlayer.inventory.selectedSlot, stack); + } + PacketByteBuf buf = PacketByteBufs.create(); + try { + packet.write(buf); + ServerPlayNetworking.send(serverPlayer, PlayerInventorySlotUpdateS2CPacket.ID, buf); + } catch (IOException e) { + LOGGER.error(e); + } + } } diff --git a/src/main/java/org/dimdev/dimdoors/network/s2c/PlayerInventorySlotUpdateS2CPacket.java b/src/main/java/org/dimdev/dimdoors/network/s2c/PlayerInventorySlotUpdateS2CPacket.java new file mode 100644 index 00000000..ba1d2cd1 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/network/s2c/PlayerInventorySlotUpdateS2CPacket.java @@ -0,0 +1,55 @@ +package org.dimdev.dimdoors.network.s2c; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.item.ItemStack; +import net.minecraft.network.Packet; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.listener.ClientPlayPacketListener; +import net.minecraft.util.Identifier; + +import java.io.IOException; + +// TODO: replace ClientPlayPackListener +public class PlayerInventorySlotUpdateS2CPacket implements Packet { + public static Identifier ID = new Identifier("dimdoors:player_inventory_slot_update"); + + private int slot; + private ItemStack stack; + + public PlayerInventorySlotUpdateS2CPacket() { + this.stack = ItemStack.EMPTY; + } + + public PlayerInventorySlotUpdateS2CPacket(int slot, ItemStack stack) { + this.slot = slot; + this.stack = stack; + } + + @Override + public void read(PacketByteBuf buf) throws IOException { + slot = buf.readInt(); + stack = buf.readItemStack(); + } + + @Override + public void write(PacketByteBuf buf) throws IOException { + buf.writeInt(slot); + buf.writeItemStack(stack); + } + + @Override + public void apply(ClientPlayPacketListener listener) { + // TODO: write method + } + + @Environment(EnvType.CLIENT) + public int getSlot() { + return slot; + } + + @Environment(EnvType.CLIENT) + public ItemStack getStack() { + return stack; + } +} diff --git a/src/main/java/org/dimdev/dimdoors/world/level/Counter.java b/src/main/java/org/dimdev/dimdoors/world/level/Counter.java index 61b25fd1..ce2a30f1 100644 --- a/src/main/java/org/dimdev/dimdoors/world/level/Counter.java +++ b/src/main/java/org/dimdev/dimdoors/world/level/Counter.java @@ -7,18 +7,16 @@ import dev.onyxstudios.cca.api.v3.item.ItemComponent; public class Counter extends ItemComponent { public Counter(ItemStack stack) { super(stack, DimensionalDoorsComponents.COUNTER_COMPONENT_KEY); - - if(!this.hasTag("counter")) { - this.putInt("counter", -1); - } + if (!this.hasTag("counter")) + this.putInt("counter", 0); } public int count() { return getInt("counter"); } - public void clear() { - this.putInt("counter", -1); + public void set(int value) { + this.putInt("counter", omitZero(value)); } public int increment() { @@ -30,4 +28,23 @@ public class Counter extends ItemComponent { public static Counter get(T provider) { return DimensionalDoorsComponents.COUNTER_COMPONENT_KEY.get(provider); } + + @Override + protected void putInt(String key, int value) { + super.putInt(key, omitZero(value)); + } + + + @Override + protected int getInt(String key) { + return withZero(super.getInt(key)); + } + + private int omitZero(int value) { + return value >= 0 ? value + 1 : value; + } + + private int withZero(int value) { + return value > 0 ? value - 1 : value; + } } diff --git a/src/main/resources/data/dimdoors/pockets/generators/private/default.json b/src/main/resources/data/dimdoors/pockets/generators/private/default.json index a99d4b04..92567594 100644 --- a/src/main/resources/data/dimdoors/pockets/generators/private/default.json +++ b/src/main/resources/data/dimdoors/pockets/generators/private/default.json @@ -17,7 +17,7 @@ "type": "dimdoors:shell" }, { - "door_type": "dimdoors:iron_dimensional_door", + "door_type": "dimdoors:quartz_dimensional_door", "x": "width/2", "facing": "north", "y": "5", diff --git a/src/main/resources/data/dimdoors/pockets/generators/public/default.json b/src/main/resources/data/dimdoors/pockets/generators/public/default.json index d1946027..0989314c 100644 --- a/src/main/resources/data/dimdoors/pockets/generators/public/default.json +++ b/src/main/resources/data/dimdoors/pockets/generators/public/default.json @@ -35,6 +35,8 @@ "id": 0 } ], + "offset_x": "5", "offset_y": "5", + "offset_z": "5", "height": "5 + 16 * min(15, public_size)" }