From f596a8fa846a671920e52c436f5cd4eb9299aa18 Mon Sep 17 00:00:00 2001 From: Felix Cravic Date: Mon, 20 Apr 2020 23:43:09 +0200 Subject: [PATCH] Update + fixed animations --- src/main/java/fr/themode/demo/PlayerInit.java | 4 +- .../fr/themode/minestom/entity/Entity.java | 2 +- .../themode/minestom/entity/LivingEntity.java | 4 +- .../fr/themode/minestom/entity/Player.java | 6 --- .../minestom/event/ArmAnimationEvent.java | 23 ++++++++++ .../themode/minestom/instance/Instance.java | 2 + .../minestom/instance/InstanceContainer.java | 18 ++++++++ .../minestom/instance/SharedInstance.java | 5 +++ .../fr/themode/minestom/item/Material.java | 43 ++++++++++++++++++- .../listener/PlayerDiggingListener.java | 6 +-- .../minestom/listener/UseItemListener.java | 24 ++++++++++- .../themode/minestom/net/PacketProcessor.java | 2 +- 12 files changed, 121 insertions(+), 18 deletions(-) create mode 100644 src/main/java/fr/themode/minestom/event/ArmAnimationEvent.java diff --git a/src/main/java/fr/themode/demo/PlayerInit.java b/src/main/java/fr/themode/demo/PlayerInit.java index b77fe91da..a38580fd6 100644 --- a/src/main/java/fr/themode/demo/PlayerInit.java +++ b/src/main/java/fr/themode/demo/PlayerInit.java @@ -103,7 +103,7 @@ public class PlayerInit { Vector velocity = player.getPosition().clone().getDirection().multiply(4); velocity.setY(3.5f); target.setVelocity(velocity, 150); - target.damage(1); + target.damage(5); player.sendMessage("ATTACK"); } }); @@ -142,7 +142,7 @@ public class PlayerInit { }); player.setEventCallback(PlayerSpawnEvent.class, event -> { - player.setGameMode(GameMode.SURVIVAL); + player.setGameMode(GameMode.CREATIVE); player.teleport(new Position(0, 75, 0)); /*Random random = new Random(); diff --git a/src/main/java/fr/themode/minestom/entity/Entity.java b/src/main/java/fr/themode/minestom/entity/Entity.java index c755d04d8..fd3de24bc 100644 --- a/src/main/java/fr/themode/minestom/entity/Entity.java +++ b/src/main/java/fr/themode/minestom/entity/Entity.java @@ -433,7 +433,7 @@ public abstract class Entity implements Viewable, DataContainer { EntityStatusPacket statusPacket = new EntityStatusPacket(); statusPacket.entityId = getEntityId(); statusPacket.status = status; - sendPacketToViewers(statusPacket); + sendPacketToViewersAndSelf(statusPacket); } public void setOnFire(boolean fire) { diff --git a/src/main/java/fr/themode/minestom/entity/LivingEntity.java b/src/main/java/fr/themode/minestom/entity/LivingEntity.java index 8d3f7c786..6dd250e0f 100644 --- a/src/main/java/fr/themode/minestom/entity/LivingEntity.java +++ b/src/main/java/fr/themode/minestom/entity/LivingEntity.java @@ -96,9 +96,9 @@ public abstract class LivingEntity extends Entity { } public void kill() { - this.isDead = true; // So the entity isn't killed over and over again - setHealth(0); + refreshIsDead(true); // So the entity isn't killed over and over again triggerStatus((byte) 3); // Start death animation status + setHealth(0); DeathEvent deathEvent = new DeathEvent(); callEvent(DeathEvent.class, deathEvent); } diff --git a/src/main/java/fr/themode/minestom/entity/Player.java b/src/main/java/fr/themode/minestom/entity/Player.java index 7281aca11..b4f3b5578 100644 --- a/src/main/java/fr/themode/minestom/entity/Player.java +++ b/src/main/java/fr/themode/minestom/entity/Player.java @@ -338,12 +338,6 @@ public class Player extends LivingEntity { } } - @Override - public void kill() { - super.kill(); - refreshIsDead(true); - } - public void sendBlockBreakAnimation(BlockPosition blockPosition, byte destroyStage) { BlockBreakAnimationPacket breakAnimationPacket = new BlockBreakAnimationPacket(); breakAnimationPacket.entityId = getEntityId() + 1; diff --git a/src/main/java/fr/themode/minestom/event/ArmAnimationEvent.java b/src/main/java/fr/themode/minestom/event/ArmAnimationEvent.java new file mode 100644 index 000000000..944811c52 --- /dev/null +++ b/src/main/java/fr/themode/minestom/event/ArmAnimationEvent.java @@ -0,0 +1,23 @@ +package fr.themode.minestom.event; + +public class ArmAnimationEvent extends CancellableEvent { + + private ArmAnimationType armAnimationType; + + public ArmAnimationEvent(ArmAnimationType armAnimationType) { + this.armAnimationType = armAnimationType; + } + + public ArmAnimationType getArmAnimationType() { + return armAnimationType; + } + + public enum ArmAnimationType { + BOW, + CROSSBOW, + TRIDENT, + SHIELD, + EAT + } + +} diff --git a/src/main/java/fr/themode/minestom/instance/Instance.java b/src/main/java/fr/themode/minestom/instance/Instance.java index cb8125194..2e7c316a4 100644 --- a/src/main/java/fr/themode/minestom/instance/Instance.java +++ b/src/main/java/fr/themode/minestom/instance/Instance.java @@ -53,6 +53,8 @@ public abstract class Instance implements BlockModifier, DataContainer { // Load only if auto chunk load is enabled public abstract void loadOptionalChunk(int chunkX, int chunkZ, Consumer callback); + public abstract void unloadChunk(int chunkX, int chunkZ); + public abstract Chunk getChunk(int chunkX, int chunkZ); public abstract void saveChunkToFolder(Chunk chunk, Runnable callback); diff --git a/src/main/java/fr/themode/minestom/instance/InstanceContainer.java b/src/main/java/fr/themode/minestom/instance/InstanceContainer.java index 97315b27b..41a65a50e 100644 --- a/src/main/java/fr/themode/minestom/instance/InstanceContainer.java +++ b/src/main/java/fr/themode/minestom/instance/InstanceContainer.java @@ -10,6 +10,7 @@ import fr.themode.minestom.instance.block.rule.BlockPlacementRule; import fr.themode.minestom.net.PacketWriterUtils; import fr.themode.minestom.net.packet.server.play.BlockChangePacket; import fr.themode.minestom.net.packet.server.play.ParticlePacket; +import fr.themode.minestom.net.packet.server.play.UnloadChunkPacket; import fr.themode.minestom.particle.Particle; import fr.themode.minestom.particle.ParticleCreator; import fr.themode.minestom.utils.BlockPosition; @@ -219,6 +220,23 @@ public class InstanceContainer extends Instance { } } + @Override + public void unloadChunk(int chunkX, int chunkZ) { + Chunk chunk = getChunk(chunkX, chunkZ); + long index = ChunkUtils.getChunkIndex(chunkX, chunkZ); + + UnloadChunkPacket unloadChunkPacket = new UnloadChunkPacket(); + unloadChunkPacket.chunkX = chunkX; + unloadChunkPacket.chunkZ = chunkZ; + chunk.sendPacketToViewers(unloadChunkPacket); + + for (Player viewer : chunk.getViewers()) { + chunk.removeViewer(viewer); + } + + this.chunks.remove(index); + } + @Override public Chunk getChunk(int chunkX, int chunkZ) { return chunks.get(ChunkUtils.getChunkIndex(chunkX, chunkZ)); diff --git a/src/main/java/fr/themode/minestom/instance/SharedInstance.java b/src/main/java/fr/themode/minestom/instance/SharedInstance.java index ad8ebbae6..ed0bce5de 100644 --- a/src/main/java/fr/themode/minestom/instance/SharedInstance.java +++ b/src/main/java/fr/themode/minestom/instance/SharedInstance.java @@ -43,6 +43,11 @@ public class SharedInstance extends Instance { instanceContainer.loadOptionalChunk(chunkX, chunkZ, callback); } + @Override + public void unloadChunk(int chunkX, int chunkZ) { + instanceContainer.unloadChunk(chunkX, chunkZ); + } + @Override public Chunk getChunk(int chunkX, int chunkZ) { return instanceContainer.getChunk(chunkX, chunkZ); diff --git a/src/main/java/fr/themode/minestom/item/Material.java b/src/main/java/fr/themode/minestom/item/Material.java index 85011cf93..f30a7cd1f 100644 --- a/src/main/java/fr/themode/minestom/item/Material.java +++ b/src/main/java/fr/themode/minestom/item/Material.java @@ -936,7 +936,48 @@ public enum Material { } public boolean isFood() { - return false; // TODO + switch (this) { + case APPLE: + case MUSHROOM_STEW: + case BREAD: + case PORKCHOP: + case COOKED_PORKCHOP: + case GOLDEN_APPLE: + case ENCHANTED_GOLDEN_APPLE: + case COD: + case SALMON: + case TROPICAL_FISH: + case PUFFERFISH: + case COOKED_COD: + case COOKED_SALMON: + case CAKE: + case COOKIE: + case MELON_SLICE: + case DRIED_KELP: + case BEEF: + case COOKED_BEEF: + case CHICKEN: + case COOKED_CHICKEN: + case ROTTEN_FLESH: + case SPIDER_EYE: + case CARROT: + case POTATO: + case BAKED_POTATO: + case POISONOUS_POTATO: + case PUMPKIN_PIE: + case RABBIT: + case COOKED_RABBIT: + case RABBIT_STEW: + case MUTTON: + case COOKED_MUTTON: + case BEETROOT: + case BEETROOT_SOUP: + case SWEET_BERRIES: + case HONEY_BOTTLE: + return true; + default: + return false; + } } public short getId() { diff --git a/src/main/java/fr/themode/minestom/listener/PlayerDiggingListener.java b/src/main/java/fr/themode/minestom/listener/PlayerDiggingListener.java index 1ecc46614..5f0d5966e 100644 --- a/src/main/java/fr/themode/minestom/listener/PlayerDiggingListener.java +++ b/src/main/java/fr/themode/minestom/listener/PlayerDiggingListener.java @@ -75,12 +75,12 @@ public class PlayerDiggingListener { ItemStack handItem = player.getInventory().getItemInMainHand(); handItem.setAmount((byte) (handItem.getAmount() - 1)); handItem = handItem.getAmount() <= 0 ? ItemStack.AIR_ITEM : handItem; + dropItem(player, droppedItemStack2, handItem); break; case UPDATE_ITEM_STATE: - // TODO check if is updatable item - //player.refreshActiveHand(false, false, false); - //player.sendPacketToViewers(player.getMetadataPacket()); + player.refreshActiveHand(false, false, false); + player.sendPacketToViewers(player.getMetadataPacket()); break; case SWAP_ITEM_HAND: PlayerInventory playerInventory = player.getInventory(); diff --git a/src/main/java/fr/themode/minestom/listener/UseItemListener.java b/src/main/java/fr/themode/minestom/listener/UseItemListener.java index 84d98acc4..341efb11c 100644 --- a/src/main/java/fr/themode/minestom/listener/UseItemListener.java +++ b/src/main/java/fr/themode/minestom/listener/UseItemListener.java @@ -1,6 +1,7 @@ package fr.themode.minestom.listener; import fr.themode.minestom.entity.Player; +import fr.themode.minestom.event.ArmAnimationEvent; import fr.themode.minestom.event.ArmorEquipEvent; import fr.themode.minestom.event.PlayerUseItemEvent; import fr.themode.minestom.inventory.PlayerInventory; @@ -64,8 +65,27 @@ public class UseItemListener { // TODO check if item in main or off hand is food or item with animation (bow/crossbow/riptide) // TODO in material enum? - //player.refreshActiveHand(true, false, false); - //player.sendPacketToViewers(player.getMetadataPacket()); + ArmAnimationEvent armAnimationEvent = null; + boolean offhand = hand == Player.Hand.OFF; + boolean riptideSpinAttack = false; + + if (material == Material.BOW) { + armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.BOW); + } else if (material == Material.CROSSBOW) { + armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.CROSSBOW); + } else if (material == Material.SHIELD) { + armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.SHIELD); + } else if (material == Material.TRIDENT) { + armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.TRIDENT); + } else if (material.isFood()) { + armAnimationEvent = new ArmAnimationEvent(ArmAnimationEvent.ArmAnimationType.EAT); + } + + if (armAnimationEvent != null) + player.callCancellableEvent(ArmAnimationEvent.class, armAnimationEvent, () -> { + player.refreshActiveHand(true, offhand, riptideSpinAttack); + player.sendPacketToViewers(player.getMetadataPacket()); + }); } } diff --git a/src/main/java/fr/themode/minestom/net/PacketProcessor.java b/src/main/java/fr/themode/minestom/net/PacketProcessor.java index 556c8f99e..21d35bd5c 100644 --- a/src/main/java/fr/themode/minestom/net/PacketProcessor.java +++ b/src/main/java/fr/themode/minestom/net/PacketProcessor.java @@ -43,7 +43,7 @@ public class PacketProcessor { PlayerConnection playerConnection = connectionPlayerConnectionMap.computeIfAbsent(channel, c -> new PlayerConnection(channel)); ConnectionState connectionState = playerConnection.getConnectionState(); //if (!printBlackList.contains(id)) { - // System.out.println("RECEIVED ID: 0x" + Integer.toHexString(id) + " State: " + connectionState); + //System.out.println("RECEIVED ID: 0x" + Integer.toHexString(id) + " State: " + connectionState); //} PacketReader packetReader = new PacketReader(buffer, length);