From 2f6205b577eaeb3fab0c6191c6f519782f71c091 Mon Sep 17 00:00:00 2001 From: Felix Cravic Date: Fri, 24 Apr 2020 17:43:35 +0200 Subject: [PATCH] Added ItemUpdateStateEvent + batch file clean --- src/main/java/fr/themode/demo/PlayerInit.java | 2 +- .../server/event/ItemUpdateStateEvent.java | 25 +++++++++++++++++++ .../server/instance/InstanceContainer.java | 7 +++--- .../server/instance/batch/BlockBatch.java | 1 - .../server/instance/batch/ChunkBatch.java | 5 +++- .../net/minestom/server/item/Material.java | 12 +++++++++ .../listener/PlayerDiggingListener.java | 25 +++++++++++++++---- 7 files changed, 65 insertions(+), 12 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/ItemUpdateStateEvent.java diff --git a/src/main/java/fr/themode/demo/PlayerInit.java b/src/main/java/fr/themode/demo/PlayerInit.java index abce74e26..f6e3293ad 100644 --- a/src/main/java/fr/themode/demo/PlayerInit.java +++ b/src/main/java/fr/themode/demo/PlayerInit.java @@ -148,7 +148,7 @@ public class PlayerInit { }); player.setEventCallback(PlayerSpawnEvent.class, event -> { - player.setGameMode(GameMode.SURVIVAL); + player.setGameMode(GameMode.CREATIVE); player.teleport(new Position(0, 75, 0)); ItemStack item = new ItemStack((short) 1, (byte) 43); diff --git a/src/main/java/net/minestom/server/event/ItemUpdateStateEvent.java b/src/main/java/net/minestom/server/event/ItemUpdateStateEvent.java new file mode 100644 index 000000000..eb27019e9 --- /dev/null +++ b/src/main/java/net/minestom/server/event/ItemUpdateStateEvent.java @@ -0,0 +1,25 @@ +package net.minestom.server.event; + +import net.minestom.server.item.ItemStack; + +public class ItemUpdateStateEvent extends Event { + + private ItemStack itemStack; + private boolean handAnimation; + + public ItemUpdateStateEvent(ItemStack itemStack) { + this.itemStack = itemStack; + } + + public ItemStack getItemStack() { + return itemStack; + } + + public void setHandAnimation(boolean handAnimation) { + this.handAnimation = handAnimation; + } + + public boolean hasHandAnimation() { + return handAnimation; + } +} diff --git a/src/main/java/net/minestom/server/instance/InstanceContainer.java b/src/main/java/net/minestom/server/instance/InstanceContainer.java index b5c695d8c..c8b71ec85 100644 --- a/src/main/java/net/minestom/server/instance/InstanceContainer.java +++ b/src/main/java/net/minestom/server/instance/InstanceContainer.java @@ -22,7 +22,6 @@ import java.io.File; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; /** @@ -37,7 +36,7 @@ public class InstanceContainer extends Instance { private ChunkGenerator chunkGenerator; private Map chunks = new ConcurrentHashMap<>(); - private AtomicBoolean autoChunkLoad = new AtomicBoolean(false); + private boolean autoChunkLoad; protected InstanceContainer(UUID uniqueId, File folder) { super(uniqueId); @@ -331,12 +330,12 @@ public class InstanceContainer extends Instance { @Override public void enableAutoChunkLoad(boolean enable) { - this.autoChunkLoad.set(enable); + this.autoChunkLoad = enable; } @Override public boolean hasEnabledAutoChunkLoad() { - return autoChunkLoad.get(); + return autoChunkLoad; } protected void addSharedInstance(SharedInstance sharedInstance) { diff --git a/src/main/java/net/minestom/server/instance/batch/BlockBatch.java b/src/main/java/net/minestom/server/instance/batch/BlockBatch.java index 2d4ec22fa..5664338a9 100644 --- a/src/main/java/net/minestom/server/instance/batch/BlockBatch.java +++ b/src/main/java/net/minestom/server/instance/batch/BlockBatch.java @@ -72,7 +72,6 @@ public class BlockBatch implements InstanceBatch { }); if (isLast) { - // data.clear(); if (callback != null) callback.run(); } diff --git a/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java b/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java index 6a7ae8a03..142e2eef8 100644 --- a/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java +++ b/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java @@ -19,7 +19,10 @@ public class ChunkBatch implements InstanceBatch { private InstanceContainer instance; private Chunk chunk; - private List dataList = Collections.synchronizedList(new ArrayList<>()); + // Give it the max capacity by default (avoid resizing) + private List dataList = + Collections.synchronizedList(new ArrayList<>( + Chunk.CHUNK_SIZE_X * Chunk.CHUNK_SIZE_Y * Chunk.CHUNK_SIZE_Z)); public ChunkBatch(InstanceContainer instance, Chunk chunk) { this.instance = instance; diff --git a/src/main/java/net/minestom/server/item/Material.java b/src/main/java/net/minestom/server/item/Material.java index 06b58b6ac..48a0c0525 100644 --- a/src/main/java/net/minestom/server/item/Material.java +++ b/src/main/java/net/minestom/server/item/Material.java @@ -980,6 +980,18 @@ public enum Material { } } + public boolean hasState() { + switch (this) { + case BOW: + case TRIDENT: + case CROSSBOW: + case SHIELD: + return true; + } + + return isFood(); + } + public short getId() { return materialId; } diff --git a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java index 23d5c4dfd..6a2faeed5 100644 --- a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java @@ -2,12 +2,14 @@ package net.minestom.server.listener; import net.minestom.server.entity.GameMode; import net.minestom.server.entity.Player; +import net.minestom.server.event.ItemUpdateStateEvent; import net.minestom.server.event.PlayerStartDiggingEvent; import net.minestom.server.event.PlayerSwapItemEvent; import net.minestom.server.instance.Instance; import net.minestom.server.instance.block.CustomBlock; import net.minestom.server.inventory.PlayerInventory; import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; import net.minestom.server.network.packet.client.play.ClientPlayerDiggingPacket; import net.minestom.server.network.packet.server.play.AcknowledgePlayerDiggingPacket; import net.minestom.server.network.packet.server.play.EntityEffectPacket; @@ -19,6 +21,10 @@ public class PlayerDiggingListener { public static void playerDiggingListener(ClientPlayerDiggingPacket packet, Player player) { ClientPlayerDiggingPacket.Status status = packet.status; BlockPosition blockPosition = packet.blockPosition; + + PlayerInventory playerInventory = player.getInventory(); + ItemStack mainHand = playerInventory.getItemInMainHand(); + ItemStack offHand = playerInventory.getItemInOffHand(); switch (status) { case STARTED_DIGGING: if (player.getGameMode() == GameMode.CREATIVE) { @@ -79,14 +85,23 @@ public class PlayerDiggingListener { dropItem(player, droppedItemStack2, handItem); break; case UPDATE_ITEM_STATE: - player.refreshActiveHand(false, false, false); + Material mainHandMat = Material.fromId(mainHand.getMaterialId()); + Material offHandMat = Material.fromId(offHand.getMaterialId()); + boolean isOffhand = offHandMat.hasState(); + + ItemStack updatedItem = isOffhand ? offHand : + mainHandMat.hasState() ? mainHand : null; + if (updatedItem == null) // No item with state, cancel + return; + + ItemUpdateStateEvent itemUpdateStateEvent = new ItemUpdateStateEvent(updatedItem); + player.callEvent(ItemUpdateStateEvent.class, itemUpdateStateEvent); + + player.refreshActiveHand(itemUpdateStateEvent.hasHandAnimation(), isOffhand, false); player.sendPacketToViewers(player.getMetadataPacket()); break; case SWAP_ITEM_HAND: - PlayerInventory playerInventory = player.getInventory(); - ItemStack mainHand = playerInventory.getItemInMainHand().clone(); - ItemStack offHand = playerInventory.getItemInOffHand().clone(); - PlayerSwapItemEvent swapItemEvent = new PlayerSwapItemEvent(offHand, mainHand); + PlayerSwapItemEvent swapItemEvent = new PlayerSwapItemEvent(offHand.clone(), mainHand.clone()); player.callCancellableEvent(PlayerSwapItemEvent.class, swapItemEvent, () -> { playerInventory.setItemInMainHand(swapItemEvent.getMainHandItem()); playerInventory.setItemInOffHand(swapItemEvent.getOffHandItem());