From 69d47921916599a3af0ed0528bbf1a1d4bc1b704 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 03:29:47 +0100 Subject: [PATCH 01/19] WIP collection deep cloning. Starting with PotionMeta --- .../server/item/metadata/PotionMeta.java | 17 +++++++--- .../server/potion/CustomPotionEffect.java | 33 ++++++++++++++++++- .../server/utils/clone/CloneUtils.java | 19 +++++++++++ 3 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/minestom/server/utils/clone/CloneUtils.java diff --git a/src/main/java/net/minestom/server/item/metadata/PotionMeta.java b/src/main/java/net/minestom/server/item/metadata/PotionMeta.java index bd7f60ff8..cb3b8f5b1 100644 --- a/src/main/java/net/minestom/server/item/metadata/PotionMeta.java +++ b/src/main/java/net/minestom/server/item/metadata/PotionMeta.java @@ -4,7 +4,9 @@ import net.minestom.server.chat.ChatColor; import net.minestom.server.potion.CustomPotionEffect; import net.minestom.server.potion.PotionType; import net.minestom.server.registry.Registries; +import net.minestom.server.utils.clone.CloneUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jglrxavpok.hephaistos.nbt.NBTCompound; import org.jglrxavpok.hephaistos.nbt.NBTList; import org.jglrxavpok.hephaistos.nbt.NBTTypes; @@ -22,7 +24,9 @@ import java.util.concurrent.CopyOnWriteArrayList; public class PotionMeta extends ItemMeta { private PotionType potionType; - private final List customPotionEffects = new CopyOnWriteArrayList<>(); + + // Not final because of #clone() + private List customPotionEffects = new CopyOnWriteArrayList<>(); private boolean hasColor; private byte red, green, blue; @@ -32,6 +36,7 @@ public class PotionMeta extends ItemMeta { * * @return the potion type */ + @Nullable public PotionType getPotionType() { return potionType; } @@ -41,15 +46,16 @@ public class PotionMeta extends ItemMeta { * * @param potionType the new potion type */ - public void setPotionType(PotionType potionType) { + public void setPotionType(@Nullable PotionType potionType) { this.potionType = potionType; } /** * Get a list of {@link CustomPotionEffect}. * - * @return the custom potion effects + * @return the custom potion effect list */ + @NotNull public List getCustomPotionEffects() { return customPotionEffects; } @@ -75,7 +81,8 @@ public class PotionMeta extends ItemMeta { @Override public boolean hasNbt() { - return potionType != null; + return potionType != null || + !customPotionEffects.isEmpty(); } @Override @@ -155,7 +162,7 @@ public class PotionMeta extends ItemMeta { public ItemMeta clone() { PotionMeta potionMeta = (PotionMeta) super.clone(); potionMeta.potionType = potionType; - potionMeta.customPotionEffects.addAll(customPotionEffects); + potionMeta.customPotionEffects = CloneUtils.cloneCopyOnWriteArrayList(customPotionEffects); potionMeta.hasColor = hasColor; potionMeta.red = red; diff --git a/src/main/java/net/minestom/server/potion/CustomPotionEffect.java b/src/main/java/net/minestom/server/potion/CustomPotionEffect.java index 450f00919..d84daa1f1 100644 --- a/src/main/java/net/minestom/server/potion/CustomPotionEffect.java +++ b/src/main/java/net/minestom/server/potion/CustomPotionEffect.java @@ -1,9 +1,16 @@ package net.minestom.server.potion; +import net.minestom.server.utils.clone.PublicCloneable; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + /** * Represents a custom effect in {@link net.minestom.server.item.metadata.PotionMeta}. + *

+ * This is an immutable class. */ -public class CustomPotionEffect { +public class CustomPotionEffect implements PublicCloneable { private final byte id; private final byte amplifier; @@ -45,4 +52,28 @@ public class CustomPotionEffect { public boolean showIcon() { return showIcon; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CustomPotionEffect that = (CustomPotionEffect) o; + return id == that.id && amplifier == that.amplifier && duration == that.duration && ambient == that.ambient && showParticles == that.showParticles && showIcon == that.showIcon; + } + + @Override + public int hashCode() { + return Objects.hash(id, amplifier, duration, ambient, showParticles, showIcon); + } + + @NotNull + @Override + public CustomPotionEffect clone() { + try { + return (CustomPotionEffect) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + throw new IllegalStateException("Weird thing happened"); + } + } } diff --git a/src/main/java/net/minestom/server/utils/clone/CloneUtils.java b/src/main/java/net/minestom/server/utils/clone/CloneUtils.java new file mode 100644 index 000000000..26689dfc0 --- /dev/null +++ b/src/main/java/net/minestom/server/utils/clone/CloneUtils.java @@ -0,0 +1,19 @@ +package net.minestom.server.utils.clone; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public final class CloneUtils { + + @NotNull + public static CopyOnWriteArrayList cloneCopyOnWriteArrayList(@NotNull List list) { + CopyOnWriteArrayList result = new CopyOnWriteArrayList<>(); + for (T element : list) { + result.add((T) element.clone()); + } + return result; + } + +} From a3613bff89f3c76f1f1cd14fe1405515696e7c65 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 03:40:07 +0100 Subject: [PATCH 02/19] Use CloneUtils for deep copy --- .../server/item/metadata/CompassMeta.java | 3 ++- .../server/item/metadata/CrossbowMeta.java | 7 +++--- .../server/item/metadata/MapMeta.java | 23 +++++++++++++++---- .../item/metadata/WritableBookMeta.java | 5 +--- .../server/utils/clone/CloneUtils.java | 6 +++++ 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/minestom/server/item/metadata/CompassMeta.java b/src/main/java/net/minestom/server/item/metadata/CompassMeta.java index 8a0e007a9..da5424d51 100644 --- a/src/main/java/net/minestom/server/item/metadata/CompassMeta.java +++ b/src/main/java/net/minestom/server/item/metadata/CompassMeta.java @@ -1,6 +1,7 @@ package net.minestom.server.item.metadata; import net.minestom.server.utils.Position; +import net.minestom.server.utils.clone.CloneUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jglrxavpok.hephaistos.nbt.NBTCompound; @@ -95,7 +96,7 @@ public class CompassMeta extends ItemMeta { CompassMeta compassMeta = (CompassMeta) super.clone(); compassMeta.lodestoneTracked = lodestoneTracked; compassMeta.lodestoneDimension = lodestoneDimension; - compassMeta.lodestonePosition = lodestonePosition != null ? lodestonePosition.clone() : null; + compassMeta.lodestonePosition = CloneUtils.optionalClone(lodestonePosition); return compassMeta; } diff --git a/src/main/java/net/minestom/server/item/metadata/CrossbowMeta.java b/src/main/java/net/minestom/server/item/metadata/CrossbowMeta.java index 075f69427..72ba1c539 100644 --- a/src/main/java/net/minestom/server/item/metadata/CrossbowMeta.java +++ b/src/main/java/net/minestom/server/item/metadata/CrossbowMeta.java @@ -4,6 +4,7 @@ import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; import net.minestom.server.registry.Registries; import net.minestom.server.utils.NBTUtils; +import net.minestom.server.utils.clone.CloneUtils; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import org.jglrxavpok.hephaistos.nbt.NBTCompound; @@ -183,9 +184,9 @@ public class CrossbowMeta extends ItemMeta { public ItemMeta clone() { CrossbowMeta crossbowMeta = (CrossbowMeta) super.clone(); crossbowMeta.triple = triple; - crossbowMeta.projectile1 = projectile1 == null ? null : projectile1.clone(); - crossbowMeta.projectile2 = projectile2 == null ? null : projectile2.clone(); - crossbowMeta.projectile3 = projectile3 == null ? null : projectile3.clone(); + crossbowMeta.projectile1 = CloneUtils.optionalClone(projectile1); + crossbowMeta.projectile2 = CloneUtils.optionalClone(projectile2); + crossbowMeta.projectile3 = CloneUtils.optionalClone(projectile3); crossbowMeta.charged = charged; diff --git a/src/main/java/net/minestom/server/item/metadata/MapMeta.java b/src/main/java/net/minestom/server/item/metadata/MapMeta.java index 64993e97e..e16aef362 100644 --- a/src/main/java/net/minestom/server/item/metadata/MapMeta.java +++ b/src/main/java/net/minestom/server/item/metadata/MapMeta.java @@ -1,19 +1,21 @@ package net.minestom.server.item.metadata; import net.minestom.server.chat.ChatColor; +import net.minestom.server.utils.clone.CloneUtils; +import net.minestom.server.utils.clone.PublicCloneable; import org.jetbrains.annotations.NotNull; import org.jglrxavpok.hephaistos.nbt.NBTCompound; import org.jglrxavpok.hephaistos.nbt.NBTList; import org.jglrxavpok.hephaistos.nbt.NBTTypes; -import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; public class MapMeta extends ItemMeta { private int mapId; private int mapScaleDirection = 1; - private List decorations = new ArrayList<>(); + private List decorations = new CopyOnWriteArrayList<>(); private ChatColor mapColor = ChatColor.NO_COLOR; public MapMeta() { @@ -198,18 +200,18 @@ public class MapMeta extends ItemMeta { MapMeta mapMeta = (MapMeta) super.clone(); mapMeta.setMapId(mapId); mapMeta.setMapScaleDirection(mapScaleDirection); - mapMeta.decorations.addAll(decorations); + mapMeta.decorations = CloneUtils.cloneCopyOnWriteArrayList(decorations); mapMeta.setMapColor(mapColor); return mapMeta; } - public static class MapDecoration { + public static class MapDecoration implements PublicCloneable { private final String id; private final byte type; private final byte x, z; private final double rotation; - public MapDecoration(String id, byte type, byte x, byte z, double rotation) { + public MapDecoration(@NotNull String id, byte type, byte x, byte z, double rotation) { this.id = id; this.type = type; this.x = x; @@ -262,6 +264,17 @@ public class MapMeta extends ItemMeta { public double getRotation() { return rotation; } + + @NotNull + @Override + public MapDecoration clone() { + try { + return (MapDecoration) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + throw new IllegalStateException("Something weird happened"); + } + } } } diff --git a/src/main/java/net/minestom/server/item/metadata/WritableBookMeta.java b/src/main/java/net/minestom/server/item/metadata/WritableBookMeta.java index f5d74f5c5..3958baf59 100644 --- a/src/main/java/net/minestom/server/item/metadata/WritableBookMeta.java +++ b/src/main/java/net/minestom/server/item/metadata/WritableBookMeta.java @@ -69,9 +69,6 @@ public class WritableBookMeta extends ItemMeta { @NotNull @Override public ItemMeta clone() { - WritableBookMeta writableBookMeta = (WritableBookMeta) super.clone(); - writableBookMeta.pages.addAll(pages); - - return writableBookMeta; + return super.clone(); } } diff --git a/src/main/java/net/minestom/server/utils/clone/CloneUtils.java b/src/main/java/net/minestom/server/utils/clone/CloneUtils.java index 26689dfc0..f0f9f58fc 100644 --- a/src/main/java/net/minestom/server/utils/clone/CloneUtils.java +++ b/src/main/java/net/minestom/server/utils/clone/CloneUtils.java @@ -1,12 +1,18 @@ package net.minestom.server.utils.clone; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public final class CloneUtils { + @Nullable + public static T optionalClone(@Nullable T object) { + return object != null ? (T) object.clone() : null; + } + @NotNull public static CopyOnWriteArrayList cloneCopyOnWriteArrayList(@NotNull List list) { CopyOnWriteArrayList result = new CopyOnWriteArrayList<>(); From 0658d1659cd8c64a7b9aaf8a2d5598817e63aee3 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 04:21:26 +0100 Subject: [PATCH 03/19] Renamed ChunkSupplier#createChunk --- .../java/net/minestom/server/instance/InstanceContainer.java | 2 +- .../minestom/server/instance/MinestomBasicChunkLoader.java | 2 +- .../java/net/minestom/server/utils/chunk/ChunkSupplier.java | 2 +- .../java/net/minestom/server/utils/clone/CloneUtils.java | 5 +++++ 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/instance/InstanceContainer.java b/src/main/java/net/minestom/server/instance/InstanceContainer.java index 4a5a83dd1..dd6c891d4 100644 --- a/src/main/java/net/minestom/server/instance/InstanceContainer.java +++ b/src/main/java/net/minestom/server/instance/InstanceContainer.java @@ -539,7 +539,7 @@ public class InstanceContainer extends Instance { chunkGenerator.fillBiomes(biomes, chunkX, chunkZ); } - final Chunk chunk = chunkSupplier.getChunk(biomes, chunkX, chunkZ); + final Chunk chunk = chunkSupplier.createChunk(biomes, chunkX, chunkZ); Check.notNull(chunk, "Chunks supplied by a ChunkSupplier cannot be null."); cacheChunk(chunk); diff --git a/src/main/java/net/minestom/server/instance/MinestomBasicChunkLoader.java b/src/main/java/net/minestom/server/instance/MinestomBasicChunkLoader.java index 50ee59561..2469eb14b 100644 --- a/src/main/java/net/minestom/server/instance/MinestomBasicChunkLoader.java +++ b/src/main/java/net/minestom/server/instance/MinestomBasicChunkLoader.java @@ -77,7 +77,7 @@ public class MinestomBasicChunkLoader implements IChunkLoader { // Found, load from result bytes BinaryReader reader = new BinaryReader(bytes); // Create the chunk object using the instance's ChunkSupplier to support multiple implementations - Chunk chunk = instanceContainer.getChunkSupplier().getChunk(null, chunkX, chunkZ); + Chunk chunk = instanceContainer.getChunkSupplier().createChunk(null, chunkX, chunkZ); // Execute the callback once all blocks are placed (allow for multithreaded implementations) chunk.readChunk(reader, callback); return true; diff --git a/src/main/java/net/minestom/server/utils/chunk/ChunkSupplier.java b/src/main/java/net/minestom/server/utils/chunk/ChunkSupplier.java index 56d11b687..1c33308be 100644 --- a/src/main/java/net/minestom/server/utils/chunk/ChunkSupplier.java +++ b/src/main/java/net/minestom/server/utils/chunk/ChunkSupplier.java @@ -20,5 +20,5 @@ public interface ChunkSupplier { * @return a newly {@link Chunk} object, cannot be null */ @NotNull - Chunk getChunk(@Nullable Biome[] biomes, int chunkX, int chunkZ); + Chunk createChunk(@Nullable Biome[] biomes, int chunkX, int chunkZ); } diff --git a/src/main/java/net/minestom/server/utils/clone/CloneUtils.java b/src/main/java/net/minestom/server/utils/clone/CloneUtils.java index f0f9f58fc..3990fb722 100644 --- a/src/main/java/net/minestom/server/utils/clone/CloneUtils.java +++ b/src/main/java/net/minestom/server/utils/clone/CloneUtils.java @@ -6,6 +6,11 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +/** + * Convenient interface to deep-copy single object or collections. + *

+ * Most of the methods require object to implement the {@link PublicCloneable} interface. + */ public final class CloneUtils { @Nullable From e1a886aa3ab89a91c06ca035a99bcf1ca9f89e46 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 05:39:28 +0100 Subject: [PATCH 04/19] Fix SetSlotPacket --- .../minestom/server/inventory/Inventory.java | 12 ++++--- .../server/inventory/PlayerInventory.java | 16 ++++++---- .../server/listener/WindowListener.java | 32 ------------------- .../packet/server/play/SetSlotPacket.java | 15 +++++++++ 4 files changed, 31 insertions(+), 44 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/Inventory.java b/src/main/java/net/minestom/server/inventory/Inventory.java index 6f60e6019..9390ce1ba 100644 --- a/src/main/java/net/minestom/server/inventory/Inventory.java +++ b/src/main/java/net/minestom/server/inventory/Inventory.java @@ -304,11 +304,13 @@ public class Inventory implements InventoryModifier, InventoryClickHandler, View if (!isViewer(player)) return; - SetSlotPacket setSlotPacket = new SetSlotPacket(); - setSlotPacket.windowId = -1; - setSlotPacket.slot = -1; - setSlotPacket.itemStack = cursorItem; - player.getPlayerConnection().sendPacket(setSlotPacket); + final ItemStack currentCursorItem = cursorPlayersItem.get(player); + final boolean similar = currentCursorItem != null && currentCursorItem.isSimilar(cursorItem); + + if (!similar) { + final SetSlotPacket setSlotPacket = SetSlotPacket.createCursorPacket(cursorItem); + player.getPlayerConnection().sendPacket(setSlotPacket); + } this.cursorPlayersItem.put(player, cursorItem); } diff --git a/src/main/java/net/minestom/server/inventory/PlayerInventory.java b/src/main/java/net/minestom/server/inventory/PlayerInventory.java index 7395c0578..c414cc3a1 100644 --- a/src/main/java/net/minestom/server/inventory/PlayerInventory.java +++ b/src/main/java/net/minestom/server/inventory/PlayerInventory.java @@ -221,7 +221,8 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler * @param slot the slot to refresh */ public void refreshSlot(short slot) { - sendSlotRefresh((short) convertToPacketSlot(slot), getItemStack(slot)); + final int packetSlot = convertToPacketSlot(slot); + sendSlotRefresh((short) packetSlot, getItemStack(slot)); } /** @@ -240,12 +241,13 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler * @param cursorItem the new cursor item */ public void setCursorItem(@NotNull ItemStack cursorItem) { + final boolean similar = this.cursorItem.isSimilar(cursorItem); this.cursorItem = cursorItem; - SetSlotPacket setSlotPacket = new SetSlotPacket(); - setSlotPacket.windowId = -1; - setSlotPacket.slot = -1; - setSlotPacket.itemStack = cursorItem; - player.getPlayerConnection().sendPacket(setSlotPacket); + + if (!similar) { + final SetSlotPacket setSlotPacket = SetSlotPacket.createCursorPacket(cursorItem); + player.getPlayerConnection().sendPacket(setSlotPacket); + } } /** @@ -340,7 +342,7 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler */ protected void sendSlotRefresh(short slot, ItemStack itemStack) { SetSlotPacket setSlotPacket = new SetSlotPacket(); - setSlotPacket.windowId = (byte) (MathUtils.isBetween(slot, 35, INVENTORY_SIZE) ? 0 : -2); + setSlotPacket.windowId = 0; setSlotPacket.slot = slot; setSlotPacket.itemStack = itemStack; player.getPlayerConnection().sendPacket(setSlotPacket); diff --git a/src/main/java/net/minestom/server/listener/WindowListener.java b/src/main/java/net/minestom/server/listener/WindowListener.java index dd58b9aea..dd65f33af 100644 --- a/src/main/java/net/minestom/server/listener/WindowListener.java +++ b/src/main/java/net/minestom/server/listener/WindowListener.java @@ -4,12 +4,9 @@ import net.minestom.server.entity.Player; import net.minestom.server.event.inventory.InventoryCloseEvent; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryClickHandler; -import net.minestom.server.inventory.PlayerInventory; -import net.minestom.server.item.ItemStack; import net.minestom.server.network.packet.client.play.ClientClickWindowPacket; import net.minestom.server.network.packet.client.play.ClientCloseWindow; import net.minestom.server.network.packet.client.play.ClientWindowConfirmationPacket; -import net.minestom.server.network.packet.server.play.SetSlotPacket; import net.minestom.server.network.packet.server.play.WindowConfirmationPacket; public class WindowListener { @@ -80,8 +77,6 @@ public class WindowListener { break; } - refreshCursorItem(player, inventory); - WindowConfirmationPacket windowConfirmationPacket = new WindowConfirmationPacket(); windowConfirmationPacket.windowId = windowId; windowConfirmationPacket.actionNumber = actionNumber; @@ -90,33 +85,6 @@ public class WindowListener { player.getPlayerConnection().sendPacket(windowConfirmationPacket); } - /** - * @param player the player to refresh the cursor item - * @param inventory the player open inventory, null if not any (could be player inventory) - */ - private static void refreshCursorItem(Player player, Inventory inventory) { - PlayerInventory playerInventory = player.getInventory(); - - ItemStack cursorItem; - if (inventory != null) { - cursorItem = inventory.getCursorItem(player); - } else { - cursorItem = playerInventory.getCursorItem(); - } - - // Error occurred while retrieving the cursor item, stop here - if (cursorItem == null) { - return; - } - - SetSlotPacket setSlotPacket = new SetSlotPacket(); - setSlotPacket.windowId = -1; - setSlotPacket.slot = -1; - setSlotPacket.itemStack = cursorItem; - - player.getPlayerConnection().sendPacket(setSlotPacket); - } - public static void closeWindowListener(ClientCloseWindow packet, Player player) { // if windowId == 0 then it is player's inventory, meaning that they hadn't been any open inventory packet InventoryCloseEvent inventoryCloseEvent = new InventoryCloseEvent(player, player.getOpenInventory()); diff --git a/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java index aef5e4947..71148bd7d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/SetSlotPacket.java @@ -23,4 +23,19 @@ public class SetSlotPacket implements ServerPacket { public int getId() { return ServerPacketIdentifier.SET_SLOT; } + + /** + * Returns a {@link SetSlotPacket} used to change a player cursor item. + * + * @param cursorItem the cursor item + * @return a set slot packet to change a player cursor item + */ + @NotNull + public static SetSlotPacket createCursorPacket(@NotNull ItemStack cursorItem) { + SetSlotPacket setSlotPacket = new SetSlotPacket(); + setSlotPacket.windowId = -1; + setSlotPacket.slot = -1; + setSlotPacket.itemStack = cursorItem; + return setSlotPacket; + } } From bf10f0d3f7bdf7f917db99d2138b26dae740fcf2 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 05:47:18 +0100 Subject: [PATCH 05/19] Fixed thread crash when clicking in a non interactive inventory slot (-1) --- .../java/net/minestom/server/inventory/PlayerInventory.java | 4 ++-- .../java/net/minestom/server/listener/WindowListener.java | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/PlayerInventory.java b/src/main/java/net/minestom/server/inventory/PlayerInventory.java index c414cc3a1..0d36098d9 100644 --- a/src/main/java/net/minestom/server/inventory/PlayerInventory.java +++ b/src/main/java/net/minestom/server/inventory/PlayerInventory.java @@ -301,8 +301,8 @@ public class PlayerInventory implements InventoryModifier, InventoryClickHandler // Refresh slot update(); - //problem with ghost item when clicking on a slot which has a different internal id - //refreshSlot(slot); + // FIXME: replace update() to refreshSlot, currently not possible because our inventory click handling is not exactly the same as what the client expects + //refreshSlot((short) slot); } protected void setItemStackInternal(int slot, ItemStack itemStack) { diff --git a/src/main/java/net/minestom/server/listener/WindowListener.java b/src/main/java/net/minestom/server/listener/WindowListener.java index dd65f33af..f1a747264 100644 --- a/src/main/java/net/minestom/server/listener/WindowListener.java +++ b/src/main/java/net/minestom/server/listener/WindowListener.java @@ -32,6 +32,11 @@ public class WindowListener { boolean successful = false; + // prevent click in a non interactive slot (why does it exist?) + if (slot == -1) { + return; + } + switch (mode) { case 0: switch (button) { From 9b9dab56eb8ab2e9bb0265da68c44636a68e7f01 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 05:52:35 +0100 Subject: [PATCH 06/19] Fix ghost cursor item when canceling an inventory click --- .../server/listener/WindowListener.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/net/minestom/server/listener/WindowListener.java b/src/main/java/net/minestom/server/listener/WindowListener.java index f1a747264..39cdd441d 100644 --- a/src/main/java/net/minestom/server/listener/WindowListener.java +++ b/src/main/java/net/minestom/server/listener/WindowListener.java @@ -4,9 +4,12 @@ import net.minestom.server.entity.Player; import net.minestom.server.event.inventory.InventoryCloseEvent; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryClickHandler; +import net.minestom.server.inventory.PlayerInventory; +import net.minestom.server.item.ItemStack; import net.minestom.server.network.packet.client.play.ClientClickWindowPacket; import net.minestom.server.network.packet.client.play.ClientCloseWindow; import net.minestom.server.network.packet.client.play.ClientWindowConfirmationPacket; +import net.minestom.server.network.packet.server.play.SetSlotPacket; import net.minestom.server.network.packet.server.play.WindowConfirmationPacket; public class WindowListener { @@ -82,6 +85,11 @@ public class WindowListener { break; } + // Prevent the player from picking a ghost item in cursor + if (!successful) { + refreshCursorItem(player, inventory); + } + WindowConfirmationPacket windowConfirmationPacket = new WindowConfirmationPacket(); windowConfirmationPacket.windowId = windowId; windowConfirmationPacket.actionNumber = actionNumber; @@ -106,4 +114,28 @@ public class WindowListener { // Empty } + /** + * @param player the player to refresh the cursor item + * @param inventory the player open inventory, null if not any (could be player inventory) + */ + private static void refreshCursorItem(Player player, Inventory inventory) { + PlayerInventory playerInventory = player.getInventory(); + + ItemStack cursorItem; + if (inventory != null) { + cursorItem = inventory.getCursorItem(player); + } else { + cursorItem = playerInventory.getCursorItem(); + } + + // Error occurred while retrieving the cursor item, stop here + if (cursorItem == null) { + return; + } + + final SetSlotPacket setSlotPacket = SetSlotPacket.createCursorPacket(cursorItem); + + player.getPlayerConnection().sendPacket(setSlotPacket); + } + } From 5c9fd9294ae59ead19be4edff6def6a33c4bf1ae Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 06:04:58 +0100 Subject: [PATCH 07/19] Fix PreClickEvent canceling being ignored when the inventory condition doesn't cancel --- .../server/inventory/click/InventoryClickProcessor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java index 083e95927..b140a1e83 100644 --- a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java +++ b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java @@ -521,9 +521,9 @@ public class InventoryClickProcessor { cursor = inventoryPreClickEvent.getCursorItem(); clicked = inventoryPreClickEvent.getClickedItem(); - clickResult.setCancel(inventoryPreClickEvent.isCancelled()); if (inventoryPreClickEvent.isCancelled()) { clickResult.setRefresh(true); + clickResult.setCancel(true); } } @@ -542,9 +542,9 @@ public class InventoryClickProcessor { clickResult.setCursor(cursor); clickResult.setClicked(clicked); - clickResult.setCancel(result.isCancel()); if (result.isCancel()) { clickResult.setRefresh(true); + clickResult.setCancel(true); } } From 69adb673948f8d0ce654ea08be9d979d120eb9a5 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 06:21:59 +0100 Subject: [PATCH 08/19] Compute the tags packet only once to improve performance on high connection traffic --- .../net/minestom/server/entity/Player.java | 18 +++++++++--------- .../network/packet/server/play/TagsPacket.java | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index d49e7892b..15ef8999f 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -23,7 +23,6 @@ import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.ItemUpdateStateEvent; import net.minestom.server.event.item.PickupExperienceEvent; import net.minestom.server.event.player.*; -import net.minestom.server.gamedata.tags.TagManager; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.block.CustomBlock; @@ -299,18 +298,19 @@ public class Player extends LivingEntity implements CommandSender { } // Recipes end - // Send server tags - TagsPacket tags = new TagsPacket(); - TagManager tagManager = MinecraftServer.getTagManager(); - tagManager.addRequiredTagsToPacket(tags); + // Tags start + { + TagsPacket tags = TagsPacket.getRequiredTagsPacket(); - UpdateTagListEvent event = new UpdateTagListEvent(tags); - callEvent(UpdateTagListEvent.class, event); + UpdateTagListEvent event = new UpdateTagListEvent(tags); + callEvent(UpdateTagListEvent.class, event); - getPlayerConnection().sendPacket(tags); + this.playerConnection.sendPacket(tags); + } + // Tags end // Some client update - playerConnection.sendPacket(getPropertiesPacket()); // Send default properties + this.playerConnection.sendPacket(getPropertiesPacket()); // Send default properties refreshHealth(); // Heal and send health packet refreshAbilities(); // Send abilities packet getInventory().update(); diff --git a/src/main/java/net/minestom/server/network/packet/server/play/TagsPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/TagsPacket.java index ffc1ed317..7c6e34c6d 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/TagsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/TagsPacket.java @@ -1,5 +1,6 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.MinecraftServer; import net.minestom.server.gamedata.tags.Tag; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; @@ -20,6 +21,12 @@ public class TagsPacket implements ServerPacket { public List fluidTags = new LinkedList<>(); public List entityTags = new LinkedList<>(); + private static final TagsPacket REQUIRED_TAGS_PACKET = new TagsPacket(); + + static { + MinecraftServer.getTagManager().addRequiredTagsToPacket(REQUIRED_TAGS_PACKET); + } + @Override public void write(@NotNull BinaryWriter writer) { writeTags(writer, blockTags, name -> Registries.getBlock(name).ordinal()); @@ -48,4 +55,15 @@ public class TagsPacket implements ServerPacket { public int getId() { return ServerPacketIdentifier.TAGS; } + + /** + * Gets the {@link TagsPacket} sent to every {@link net.minestom.server.entity.Player} + * on login. + * + * @return the default tags packet + */ + @NotNull + public static TagsPacket getRequiredTagsPacket() { + return REQUIRED_TAGS_PACKET; + } } From 604d10a06ceade3bbd48917732daf974158b2fd9 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 08:55:29 +0100 Subject: [PATCH 09/19] Fix WritableBookMeta cloning --- .../minestom/server/item/metadata/WritableBookMeta.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/item/metadata/WritableBookMeta.java b/src/main/java/net/minestom/server/item/metadata/WritableBookMeta.java index 3958baf59..0ed54453f 100644 --- a/src/main/java/net/minestom/server/item/metadata/WritableBookMeta.java +++ b/src/main/java/net/minestom/server/item/metadata/WritableBookMeta.java @@ -19,6 +19,7 @@ public class WritableBookMeta extends ItemMeta { * * @return a modifiable {@link ArrayList} containing the book pages */ + @NotNull public ArrayList getPages() { return pages; } @@ -28,7 +29,7 @@ public class WritableBookMeta extends ItemMeta { * * @param pages the pages list */ - public void setPages(ArrayList pages) { + public void setPages(@NotNull ArrayList pages) { this.pages = pages; } @@ -69,6 +70,8 @@ public class WritableBookMeta extends ItemMeta { @NotNull @Override public ItemMeta clone() { - return super.clone(); + WritableBookMeta writableBookMeta = (WritableBookMeta) super.clone(); + writableBookMeta.pages = new ArrayList<>(pages); + return writableBookMeta; } } From 26762bec1742f3c27f52a2569369c68df5dc6679 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 09:11:20 +0100 Subject: [PATCH 10/19] Use pooled direct buffer in GroupedPacketHandler when preferred --- .../network/netty/codec/GroupedPacketHandler.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/network/netty/codec/GroupedPacketHandler.java b/src/main/java/net/minestom/server/network/netty/codec/GroupedPacketHandler.java index a8b1db122..50a17a60b 100644 --- a/src/main/java/net/minestom/server/network/netty/codec/GroupedPacketHandler.java +++ b/src/main/java/net/minestom/server/network/netty/codec/GroupedPacketHandler.java @@ -11,7 +11,17 @@ public class GroupedPacketHandler extends MessageToByteEncoder { protected void encode(ChannelHandlerContext ctx, FramedPacket msg, ByteBuf out) { final ByteBuf packet = msg.body; - out.writeBytes(packet.retainedSlice()); + out.setBytes(0, packet, 0, packet.writerIndex()); + out.writerIndex(packet.writerIndex()); + } + + @Override + protected ByteBuf allocateBuffer(ChannelHandlerContext ctx, FramedPacket msg, boolean preferDirect) { + if (preferDirect) { + return ctx.alloc().directBuffer(msg.body.writerIndex()); + } else { + return ctx.alloc().heapBuffer(msg.body.writerIndex()); + } } } From b9a0a761c4b63e45a8676074cd73fe5724a3c98d Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 09:30:09 +0100 Subject: [PATCH 11/19] Fixed CommandManager#execute not throwing NPE --- .../server/command/CommandManager.java | 38 ++++++++++--------- .../server/command/builder/Arguments.java | 2 +- .../command/builder/CommandDispatcher.java | 14 ++++++- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/minestom/server/command/CommandManager.java b/src/main/java/net/minestom/server/command/CommandManager.java index 5e713453d..75eb3f7ba 100644 --- a/src/main/java/net/minestom/server/command/CommandManager.java +++ b/src/main/java/net/minestom/server/command/CommandManager.java @@ -202,27 +202,29 @@ public final class CommandManager { } // Process the command - try { + + { // Check for rich-command - this.dispatcher.execute(sender, command); - return true; - } catch (NullPointerException e) { - // Check for legacy-command - final String[] splitCommand = command.split(" "); - final String commandName = splitCommand[0]; - final CommandProcessor commandProcessor = commandProcessorMap.get(commandName.toLowerCase()); - if (commandProcessor == null) { - if (unknownCommandCallback != null) { - this.unknownCommandCallback.apply(sender, command); + final boolean result = this.dispatcher.execute(sender, command); + if (result) { + return true; + } else { + // Check for legacy-command + final String[] splitCommand = command.split(" "); + final String commandName = splitCommand[0]; + final CommandProcessor commandProcessor = commandProcessorMap.get(commandName.toLowerCase()); + if (commandProcessor == null) { + if (unknownCommandCallback != null) { + this.unknownCommandCallback.apply(sender, command); + } + return false; } - return false; + + // Execute the legacy-command + final String[] args = command.substring(command.indexOf(" ") + 1).split(" "); + + return commandProcessor.process(sender, commandName, args); } - - // Execute the legacy-command - final String[] args = command.substring(command.indexOf(" ") + 1).split(" "); - - return commandProcessor.process(sender, commandName, args); - } } diff --git a/src/main/java/net/minestom/server/command/builder/Arguments.java b/src/main/java/net/minestom/server/command/builder/Arguments.java index 82784a2d4..35fd337a8 100644 --- a/src/main/java/net/minestom/server/command/builder/Arguments.java +++ b/src/main/java/net/minestom/server/command/builder/Arguments.java @@ -148,7 +148,7 @@ public final class Arguments { public Object getObject(@NotNull String id) { return args.computeIfAbsent(id, s -> { throw new NullPointerException( - "The argument with the id " + id + " has no value assigned, be sure to check your arguments id, your syntax, and that you do not change the argument id dynamically."); + "The argument with the id '" + id + "' has no value assigned, be sure to check your arguments id, your syntax, and that you do not change the argument id dynamically."); }); } diff --git a/src/main/java/net/minestom/server/command/builder/CommandDispatcher.java b/src/main/java/net/minestom/server/command/builder/CommandDispatcher.java index f3368380c..e200e2f31 100644 --- a/src/main/java/net/minestom/server/command/builder/CommandDispatcher.java +++ b/src/main/java/net/minestom/server/command/builder/CommandDispatcher.java @@ -75,9 +75,19 @@ public class CommandDispatcher { return findCommandResult(command, args); } - public void execute(@NotNull CommandSender source, @NotNull String commandString) { + /** + * Check if the command exists, and execute it. + * + * @param source the command source + * @param commandString the command with the argument(s) + * @return true if the command executed successfully, false if the command doesn't exist + */ + public boolean execute(@NotNull CommandSender source, @NotNull String commandString) { CommandResult result = parse(commandString); - result.execute(source, commandString); + if (result != null) { + result.execute(source, commandString); + } + return result != null; } @NotNull From b808497c9b6edfef6916bdeff01af77f89cad69f Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 09:55:53 +0100 Subject: [PATCH 12/19] GroupedPacketHandler cleanup --- .../server/network/netty/codec/GroupedPacketHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/network/netty/codec/GroupedPacketHandler.java b/src/main/java/net/minestom/server/network/netty/codec/GroupedPacketHandler.java index 50a17a60b..cbc7e5a48 100644 --- a/src/main/java/net/minestom/server/network/netty/codec/GroupedPacketHandler.java +++ b/src/main/java/net/minestom/server/network/netty/codec/GroupedPacketHandler.java @@ -17,10 +17,11 @@ public class GroupedPacketHandler extends MessageToByteEncoder { @Override protected ByteBuf allocateBuffer(ChannelHandlerContext ctx, FramedPacket msg, boolean preferDirect) { + final int size = msg.body.writerIndex(); if (preferDirect) { - return ctx.alloc().directBuffer(msg.body.writerIndex()); + return ctx.alloc().directBuffer(size, size); } else { - return ctx.alloc().heapBuffer(msg.body.writerIndex()); + return ctx.alloc().heapBuffer(size, size); } } From 74b8674a158d02382f5de51edc4a7dba0da4bee0 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 13:18:24 +0100 Subject: [PATCH 13/19] Netty write cleanup and allocator options --- .../server/network/netty/NettyServer.java | 60 ++++++++++++------- .../network/player/NettyPlayerConnection.java | 12 ++-- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/main/java/net/minestom/server/network/netty/NettyServer.java b/src/main/java/net/minestom/server/network/netty/NettyServer.java index 931226a32..6cbe9fa75 100644 --- a/src/main/java/net/minestom/server/network/netty/NettyServer.java +++ b/src/main/java/net/minestom/server/network/netty/NettyServer.java @@ -93,34 +93,54 @@ public final class NettyServer { Class channel; final int workerThreadCount = MinecraftServer.getNettyThreadCount(); - if (IOUring.isAvailable()) { - boss = new IOUringEventLoopGroup(2); - worker = new IOUringEventLoopGroup(workerThreadCount); + // Find boss/worker event group + { + if (IOUring.isAvailable()) { + boss = new IOUringEventLoopGroup(2); + worker = new IOUringEventLoopGroup(workerThreadCount); - channel = IOUringServerSocketChannel.class; + channel = IOUringServerSocketChannel.class; - LOGGER.info("Using io_uring"); - } else if (Epoll.isAvailable()) { - boss = new EpollEventLoopGroup(2); - worker = new EpollEventLoopGroup(workerThreadCount); + LOGGER.info("Using io_uring"); + } else if (Epoll.isAvailable()) { + boss = new EpollEventLoopGroup(2); + worker = new EpollEventLoopGroup(workerThreadCount); - channel = EpollServerSocketChannel.class; + channel = EpollServerSocketChannel.class; - LOGGER.info("Using epoll"); - } else if (KQueue.isAvailable()) { - boss = new KQueueEventLoopGroup(2); - worker = new KQueueEventLoopGroup(workerThreadCount); + LOGGER.info("Using epoll"); + } else if (KQueue.isAvailable()) { + boss = new KQueueEventLoopGroup(2); + worker = new KQueueEventLoopGroup(workerThreadCount); - channel = KQueueServerSocketChannel.class; + channel = KQueueServerSocketChannel.class; - LOGGER.info("Using kqueue"); - } else { - boss = new NioEventLoopGroup(2); - worker = new NioEventLoopGroup(workerThreadCount); + LOGGER.info("Using kqueue"); + } else { + boss = new NioEventLoopGroup(2); + worker = new NioEventLoopGroup(workerThreadCount); - channel = NioServerSocketChannel.class; + channel = NioServerSocketChannel.class; - LOGGER.info("Using NIO"); + LOGGER.info("Using NIO"); + } + } + + // Add default allocator settings + { + if (System.getProperty("io.netty.allocator.numDirectArenas") == null) { + System.setProperty("io.netty.allocator.numDirectArenas", String.valueOf(workerThreadCount)); + } + + if (System.getProperty("io.netty.allocator.numHeapArenas") == null) { + System.setProperty("io.netty.allocator.numHeapArenas", String.valueOf(workerThreadCount)); + } + + if (System.getProperty("io.netty.allocator.maxOrder") == null) { + // The default page size is 8192 bytes, a bit shift of 5 makes it 262KB + // largely enough for this kind of server + System.setProperty("io.netty.allocator.maxOrder", "5"); + } } bootstrap = new ServerBootstrap() diff --git a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java index 7b0ecaefc..738918558 100644 --- a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java +++ b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java @@ -145,27 +145,31 @@ public class NettyPlayerConnection extends PlayerConnection { @NotNull public ChannelFuture write(@NotNull Object message) { + ChannelFuture channelFuture = channel.write(message); + if (MinecraftServer.shouldProcessNettyErrors()) { - return channel.write(message).addListener(future -> { + return channelFuture.addListener(future -> { if (!future.isSuccess()) { future.cause().printStackTrace(); } }); } else { - return channel.write(message); + return channelFuture; } } @NotNull public ChannelFuture writeAndFlush(@NotNull Object message) { + ChannelFuture channelFuture = channel.writeAndFlush(message); + if (MinecraftServer.shouldProcessNettyErrors()) { - return channel.writeAndFlush(message).addListener(future -> { + return channelFuture.addListener(future -> { if (!future.isSuccess()) { future.cause().printStackTrace(); } }); } else { - return channel.writeAndFlush(message); + return channelFuture; } } From 892c1d58066046a8139b41c46ddafd6c182e2801 Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 13:27:38 +0100 Subject: [PATCH 14/19] Reduce chunk Map operation --- src/main/java/net/minestom/server/instance/Instance.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index 633897870..426ff1c2b 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -930,7 +930,6 @@ public abstract class Instance implements BlockModifier, EventHandler, DataConta synchronized (entitiesLock) { Set entities = getEntitiesInChunk(chunkIndex); entities.add(entity); - this.chunkEntities.put(chunkIndex, entities); this.entities.add(entity); if (entity instanceof Player) { @@ -958,11 +957,6 @@ public abstract class Instance implements BlockModifier, EventHandler, DataConta final long chunkIndex = ChunkUtils.getChunkIndex(chunk.getChunkX(), chunk.getChunkZ()); Set entities = getEntitiesInChunk(chunkIndex); entities.remove(entity); - if (entities.isEmpty()) { - this.chunkEntities.remove(chunkIndex); - } else { - this.chunkEntities.put(chunkIndex, entities); - } this.entities.remove(entity); if (entity instanceof Player) { From 7bcca8ff9f6901d98c183661f9a430eccbec47cd Mon Sep 17 00:00:00 2001 From: themode Date: Tue, 15 Dec 2020 13:41:42 +0100 Subject: [PATCH 15/19] Rename the walkingSpeed ability to fieldViewModifier, the movement speed attribute should be used instead for speed --- .../minestom/server/entity/LivingEntity.java | 5 +--- .../net/minestom/server/entity/Player.java | 25 ++++++------------- .../server/play/PlayerAbilitiesPacket.java | 4 +-- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/main/java/net/minestom/server/entity/LivingEntity.java b/src/main/java/net/minestom/server/entity/LivingEntity.java index 4f3c7c4c0..aa3045f8c 100644 --- a/src/main/java/net/minestom/server/entity/LivingEntity.java +++ b/src/main/java/net/minestom/server/entity/LivingEntity.java @@ -515,10 +515,7 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { property.instance = instances[i]; property.attribute = instances[i].getAttribute(); - if (getEntityType() == EntityType.PLAYER && instances[i].getAttribute().equals(Attributes.MOVEMENT_SPEED)) - property.value = ((Player) this).getWalkingSpeed(); - else - property.value = value; + property.value = value; properties[i] = property; } diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 15ef8999f..2d7a9fb72 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -3,7 +3,6 @@ package net.minestom.server.entity; import com.google.common.collect.Queues; import net.minestom.server.MinecraftServer; import net.minestom.server.advancements.AdvancementTab; -import net.minestom.server.attribute.Attribute; import net.minestom.server.attribute.AttributeInstance; import net.minestom.server.attribute.Attributes; import net.minestom.server.bossbar.BossBar; @@ -183,7 +182,7 @@ public class Player extends LivingEntity implements CommandSender { private boolean allowFlying; private boolean instantBreak; private float flyingSpeed = 0.05f; - private float walkingSpeed = 0.1f; + private float fieldViewModifier = 0.1f; // Statistics private final Map statisticValueMap = new Hashtable<>(); @@ -216,6 +215,7 @@ public class Player extends LivingEntity implements CommandSender { this.dimensionType = DimensionType.OVERWORLD; this.levelFlat = true; refreshPosition(0, 0, 0); + getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.1f); // FakePlayer init its connection there playerConnectionInit(); @@ -323,14 +323,6 @@ public class Player extends LivingEntity implements CommandSender { this.playerConnection.setPlayer(this); } - @Override - public float getAttributeValue(@NotNull Attribute attribute) { - if (attribute == Attributes.MOVEMENT_SPEED) { - return walkingSpeed; - } - return super.getAttributeValue(attribute); - } - @Override public void update(long time) { // Network tick @@ -2139,12 +2131,12 @@ public class Player extends LivingEntity implements CommandSender { refreshAbilities(); } - public float getWalkingSpeed() { - return walkingSpeed; + public float getFieldViewModifier() { + return fieldViewModifier; } - public void setWalkingSpeed(float walkingSpeed) { - this.walkingSpeed = walkingSpeed; + public void setFieldViewModifier(float fieldViewModifier) { + this.fieldViewModifier = fieldViewModifier; refreshAbilities(); } @@ -2170,8 +2162,7 @@ public class Player extends LivingEntity implements CommandSender { } /** - * Sends to the player a {@link PlayerAbilitiesPacket} with all the updated fields - * (walkingSpeed set to 0.1). + * Sends to the player a {@link PlayerAbilitiesPacket} with all the updated fields. */ protected void refreshAbilities() { PlayerAbilitiesPacket playerAbilitiesPacket = new PlayerAbilitiesPacket(); @@ -2180,7 +2171,7 @@ public class Player extends LivingEntity implements CommandSender { playerAbilitiesPacket.allowFlying = allowFlying; playerAbilitiesPacket.instantBreak = instantBreak; playerAbilitiesPacket.flyingSpeed = flyingSpeed; - playerAbilitiesPacket.walkingSpeed = 0.1f; + playerAbilitiesPacket.fieldViewModifier = fieldViewModifier; playerConnection.sendPacket(playerAbilitiesPacket); } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PlayerAbilitiesPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PlayerAbilitiesPacket.java index 5aa879c74..e5c8f58a1 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PlayerAbilitiesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PlayerAbilitiesPacket.java @@ -15,7 +15,7 @@ public class PlayerAbilitiesPacket implements ServerPacket { // Options public float flyingSpeed; - public float walkingSpeed; + public float fieldViewModifier; @Override public void write(@NotNull BinaryWriter writer) { @@ -31,7 +31,7 @@ public class PlayerAbilitiesPacket implements ServerPacket { writer.writeByte(flags); writer.writeFloat(flyingSpeed); - writer.writeFloat(walkingSpeed); + writer.writeFloat(fieldViewModifier); } @Override From 7750934a3f825a8c77f7a40b19bb4e9133e14b55 Mon Sep 17 00:00:00 2001 From: themode Date: Wed, 16 Dec 2020 00:13:40 +0100 Subject: [PATCH 16/19] Small cleanup --- src/main/java/net/minestom/server/entity/Player.java | 3 +-- .../server/listener/PlayerPositionListener.java | 12 ++++++++++-- .../minestom/server/network/netty/NettyServer.java | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 2d7a9fb72..1f47344cc 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -193,7 +193,7 @@ public class Player extends LivingEntity implements CommandSender { // Tick related private final PlayerTickEvent playerTickEvent = new PlayerTickEvent(this); - public Player(UUID uuid, String username, PlayerConnection playerConnection) { + public Player(@NotNull UUID uuid, @NotNull String username, @NotNull PlayerConnection playerConnection) { super(EntityType.PLAYER); this.uuid = uuid; // Override Entity#uuid defined in the constructor this.username = username; @@ -214,7 +214,6 @@ public class Player extends LivingEntity implements CommandSender { this.gameMode = GameMode.SURVIVAL; this.dimensionType = DimensionType.OVERWORLD; this.levelFlat = true; - refreshPosition(0, 0, 0); getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.1f); // FakePlayer init its connection there diff --git a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java index ac06dc586..1170a0bb8 100644 --- a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java @@ -3,6 +3,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; import net.minestom.server.event.player.PlayerMoveEvent; import net.minestom.server.instance.Chunk; +import net.minestom.server.instance.Instance; import net.minestom.server.network.packet.client.play.ClientPlayerPacket; import net.minestom.server.network.packet.client.play.ClientPlayerPositionAndRotationPacket; import net.minestom.server.network.packet.client.play.ClientPlayerPositionPacket; @@ -52,6 +53,13 @@ public class PlayerPositionListener { private static void processMovement(@NotNull Player player, float x, float y, float z, float yaw, float pitch, boolean onGround) { + final Instance instance = player.getInstance(); + + // Prevent moving before the player spawned, probably a modified client (or high latency?) + if (instance == null) { + return; + } + // Prevent the player from moving during a teleport final float distance = player.getPosition().getDistance(x, y, z); final int chunkRange = player.getChunkRange() * Chunk.CHUNK_SECTION_SIZE; @@ -60,12 +68,12 @@ public class PlayerPositionListener { } // Try to move in an unloaded chunk, prevent it - if (!ChunkUtils.isLoaded(player.getInstance(), x, z)) { + if (!ChunkUtils.isLoaded(instance, x, z)) { player.teleport(player.getPosition()); return; } - final Position currentPosition = player.getPosition().copy(); + final Position currentPosition = player.getPosition().clone(); Position newPosition = new Position(x, y, z, yaw, pitch); final Position cachedPosition = newPosition.clone(); diff --git a/src/main/java/net/minestom/server/network/netty/NettyServer.java b/src/main/java/net/minestom/server/network/netty/NettyServer.java index 6cbe9fa75..7fd3277ba 100644 --- a/src/main/java/net/minestom/server/network/netty/NettyServer.java +++ b/src/main/java/net/minestom/server/network/netty/NettyServer.java @@ -138,7 +138,7 @@ public final class NettyServer { if (System.getProperty("io.netty.allocator.maxOrder") == null) { // The default page size is 8192 bytes, a bit shift of 5 makes it 262KB - // largely enough for this kind of server + // largely enough for this type of server System.setProperty("io.netty.allocator.maxOrder", "5"); } } From 5224eecdd19ef8950060ac9c6081f2900433ac92 Mon Sep 17 00:00:00 2001 From: themode Date: Wed, 16 Dec 2020 03:21:59 +0100 Subject: [PATCH 17/19] Event unification (type-specific event, CancellableEvent is now an interface) --- .../net/minestom/server/entity/Player.java | 2 +- .../server/event/CancellableEvent.java | 16 +++------- .../minestom/server/event/EntityEvent.java | 23 +++++++++++++ .../minestom/server/event/InstanceEvent.java | 23 +++++++++++++ .../minestom/server/event/InventoryEvent.java | 23 +++++++++++++ .../minestom/server/event/PlayerEvent.java | 23 +++++++++++++ .../event/entity/EntityAttackEvent.java | 15 ++------- .../event/entity/EntityDamageEvent.java | 26 +++++++++------ .../server/event/entity/EntityDeathEvent.java | 17 ++-------- .../server/event/entity/EntityFireEvent.java | 30 ++++++++--------- .../event/entity/EntityItemMergeEvent.java | 24 ++++++++++---- .../server/event/entity/EntitySpawnEvent.java | 8 ++--- .../server/event/entity/EntityTickEvent.java | 12 ++----- .../event/entity/EntityVelocityEvent.java | 19 +++++++++-- .../server/event/handler/EventHandler.java | 4 ++- .../instance/AddEntityToInstanceEvent.java | 24 +++++++------- .../instance/InstanceChunkLoadEvent.java | 17 ++-------- .../instance/InstanceChunkUnloadEvent.java | 17 ++-------- .../event/instance/InstanceTickEvent.java | 17 ++-------- .../RemoveEntityFromInstanceEvent.java | 24 +++++++------- .../event/inventory/InventoryClickEvent.java | 19 +++-------- .../event/inventory/InventoryCloseEvent.java | 19 +++-------- .../event/inventory/InventoryOpenEvent.java | 21 +++++++++--- .../inventory/InventoryPreClickEvent.java | 31 ++++++++++-------- .../server/event/item/ItemDropEvent.java | 15 ++++++++- .../event/item/PickupExperienceEvent.java | 15 ++++++++- .../server/event/item/PickupItemEvent.java | 15 ++++++++- .../event/player/AdvancementTabEvent.java | 17 ++-------- .../event/player/PlayerAddItemStackEvent.java | 32 ++++++++++--------- .../event/player/PlayerBlockBreakEvent.java | 29 +++++++++-------- .../player/PlayerBlockInteractEvent.java | 28 ++++++++-------- .../event/player/PlayerBlockPlaceEvent.java | 28 ++++++++-------- .../player/PlayerChangeHeldSlotEvent.java | 30 +++++++++-------- .../server/event/player/PlayerChatEvent.java | 30 +++++++++-------- .../event/player/PlayerChunkLoadEvent.java | 17 ++-------- .../event/player/PlayerChunkUnloadEvent.java | 17 ++-------- .../event/player/PlayerCommandEvent.java | 30 +++++++++-------- .../event/player/PlayerDisconnectEvent.java | 18 ++--------- .../server/event/player/PlayerEatEvent.java | 17 ++-------- .../player/PlayerEntityInteractEvent.java | 17 ++-------- .../player/PlayerHandAnimationEvent.java | 30 +++++++++-------- .../player/PlayerItemAnimationEvent.java | 29 +++++++++-------- .../server/event/player/PlayerLoginEvent.java | 17 ++-------- .../server/event/player/PlayerMoveEvent.java | 30 +++++++++-------- .../player/PlayerPluginMessageEvent.java | 17 ++-------- .../event/player/PlayerPreEatEvent.java | 28 ++++++++-------- .../event/player/PlayerPreLoginEvent.java | 17 ++-------- .../player/PlayerResourcePackStatusEvent.java | 17 ++-------- .../event/player/PlayerRespawnEvent.java | 17 ++-------- .../event/player/PlayerSetItemStackEvent.java | 27 ++++++++-------- .../player/PlayerSettingsChangeEvent.java | 9 +++--- .../event/player/PlayerSkinInitEvent.java | 17 ++-------- .../server/event/player/PlayerSpawnEvent.java | 21 ++++++------ .../event/player/PlayerStartDiggingEvent.java | 28 ++++++++-------- .../event/player/PlayerStartFlyingEvent.java | 19 ++--------- .../event/player/PlayerStopFlyingEvent.java | 18 ++--------- .../event/player/PlayerSwapItemEvent.java | 28 ++++++++-------- .../server/event/player/PlayerTickEvent.java | 18 ++--------- .../event/player/PlayerUseItemEvent.java | 28 ++++++++-------- .../player/PlayerUseItemOnBlockEvent.java | 17 ++-------- .../inventory/InventoryClickHandler.java | 2 +- .../click/InventoryClickProcessor.java | 4 +-- .../server/listener/ChatMessageListener.java | 2 +- .../server/listener/WindowListener.java | 2 +- src/test/java/demo/PlayerInit.java | 23 +++++++++---- 65 files changed, 614 insertions(+), 660 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/EntityEvent.java create mode 100644 src/main/java/net/minestom/server/event/InstanceEvent.java create mode 100644 src/main/java/net/minestom/server/event/InventoryEvent.java create mode 100644 src/main/java/net/minestom/server/event/PlayerEvent.java diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 1f47344cc..a7a5473ac 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -1852,7 +1852,7 @@ public class Player extends LivingEntity implements CommandSender { public boolean openInventory(@NotNull Inventory inventory) { Check.notNull(inventory, "Inventory cannot be null, use Player#closeInventory() to close current"); - InventoryOpenEvent inventoryOpenEvent = new InventoryOpenEvent(this, inventory); + InventoryOpenEvent inventoryOpenEvent = new InventoryOpenEvent(inventory, this); callCancellableEvent(InventoryOpenEvent.class, inventoryOpenEvent, () -> { diff --git a/src/main/java/net/minestom/server/event/CancellableEvent.java b/src/main/java/net/minestom/server/event/CancellableEvent.java index c0d0e20f5..e04d9ea5b 100644 --- a/src/main/java/net/minestom/server/event/CancellableEvent.java +++ b/src/main/java/net/minestom/server/event/CancellableEvent.java @@ -3,26 +3,20 @@ package net.minestom.server.event; /** * Represents an {@link Event} which can be cancelled. */ -public class CancellableEvent extends Event { - - private boolean cancelled; +public interface CancellableEvent { /** * Gets if the {@link Event} should be cancelled or not. * - * @return true if the {@link Event} should be cancelled + * @return true if the event should be cancelled */ - public boolean isCancelled() { - return cancelled; - } + boolean isCancelled(); /** * Marks the {@link Event} as cancelled or not. * - * @param cancel true if the {@link Event} should be cancelled, false otherwise + * @param cancel true if the event should be cancelled, false otherwise */ - public void setCancelled(boolean cancel) { - this.cancelled = cancel; - } + void setCancelled(boolean cancel); } diff --git a/src/main/java/net/minestom/server/event/EntityEvent.java b/src/main/java/net/minestom/server/event/EntityEvent.java new file mode 100644 index 000000000..49485c1e2 --- /dev/null +++ b/src/main/java/net/minestom/server/event/EntityEvent.java @@ -0,0 +1,23 @@ +package net.minestom.server.event; + +import net.minestom.server.entity.Entity; +import org.jetbrains.annotations.NotNull; + +public class EntityEvent extends Event { + + protected final Entity entity; + + public EntityEvent(@NotNull Entity entity) { + this.entity = entity; + } + + /** + * Gets the entity of this event. + * + * @return the entity + */ + @NotNull + public Entity getEntity() { + return entity; + } +} diff --git a/src/main/java/net/minestom/server/event/InstanceEvent.java b/src/main/java/net/minestom/server/event/InstanceEvent.java new file mode 100644 index 000000000..fc7ba05da --- /dev/null +++ b/src/main/java/net/minestom/server/event/InstanceEvent.java @@ -0,0 +1,23 @@ +package net.minestom.server.event; + +import net.minestom.server.instance.Instance; +import org.jetbrains.annotations.NotNull; + +public class InstanceEvent extends Event { + + protected final Instance instance; + + public InstanceEvent(@NotNull Instance instance) { + this.instance = instance; + } + + /** + * Gets the instance. + * + * @return instance + */ + @NotNull + public Instance getInstance() { + return instance; + } +} \ No newline at end of file diff --git a/src/main/java/net/minestom/server/event/InventoryEvent.java b/src/main/java/net/minestom/server/event/InventoryEvent.java new file mode 100644 index 000000000..ada529220 --- /dev/null +++ b/src/main/java/net/minestom/server/event/InventoryEvent.java @@ -0,0 +1,23 @@ +package net.minestom.server.event; + +import net.minestom.server.inventory.Inventory; +import org.jetbrains.annotations.Nullable; + +public class InventoryEvent extends Event { + + protected Inventory inventory; + + public InventoryEvent(@Nullable Inventory inventory) { + this.inventory = inventory; + } + + /** + * Gets the inventory. + * + * @return the inventory, null if this is a player's inventory + */ + @Nullable + public Inventory getInventory() { + return inventory; + } +} \ No newline at end of file diff --git a/src/main/java/net/minestom/server/event/PlayerEvent.java b/src/main/java/net/minestom/server/event/PlayerEvent.java new file mode 100644 index 000000000..21185ebbe --- /dev/null +++ b/src/main/java/net/minestom/server/event/PlayerEvent.java @@ -0,0 +1,23 @@ +package net.minestom.server.event; + +import net.minestom.server.entity.Player; +import org.jetbrains.annotations.NotNull; + +public class PlayerEvent extends Event { + + protected final Player player; + + public PlayerEvent(@NotNull Player player) { + this.player = player; + } + + /** + * Gets the player. + * + * @return the player + */ + @NotNull + public Player getPlayer() { + return player; + } +} diff --git a/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java b/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java index f23f527f1..13b2a8ebc 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java @@ -1,31 +1,22 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; +import net.minestom.server.event.EntityEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player does a left click on an entity or with * {@link net.minestom.server.entity.EntityCreature#attack(Entity)}. */ -public class EntityAttackEvent extends Event { +public class EntityAttackEvent extends EntityEvent { - private final Entity source; private final Entity target; public EntityAttackEvent(@NotNull Entity source, @NotNull Entity target) { - this.source = source; + super(source); this.target = target; } - /** - * @return the source of the attack - */ - @NotNull - public Entity getSource() { - return source; - } - /** * @return the target of the attack */ diff --git a/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java b/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java index 256632fd4..69e10ffc4 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java @@ -3,31 +3,29 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.LivingEntity; import net.minestom.server.entity.damage.DamageType; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.EntityEvent; import org.jetbrains.annotations.NotNull; /** * Called with {@link LivingEntity#damage(DamageType, float)}. */ -public class EntityDamageEvent extends CancellableEvent { +public class EntityDamageEvent extends EntityEvent implements CancellableEvent { - private final LivingEntity entity; private final DamageType damageType; private float damage; + private boolean cancelled; + public EntityDamageEvent(@NotNull LivingEntity entity, @NotNull DamageType damageType, float damage) { - this.entity = entity; + super(entity); this.damageType = damageType; this.damage = damage; } - /** - * Gets the damaged entity. - * - * @return the damaged entity - */ @NotNull + @Override public LivingEntity getEntity() { - return entity; + return (LivingEntity) entity; } /** @@ -57,4 +55,14 @@ public class EntityDamageEvent extends CancellableEvent { public void setDamage(float damage) { this.damage = damage; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancelled; + } } diff --git a/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java b/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java index cb18c8981..7bb3c7b7a 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java @@ -1,25 +1,14 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; +import net.minestom.server.event.EntityEvent; import org.jetbrains.annotations.NotNull; -public class EntityDeathEvent extends Event { +public class EntityDeathEvent extends EntityEvent { - private final Entity entity; // TODO cause public EntityDeathEvent(@NotNull Entity entity) { - this.entity = entity; - } - - /** - * Get the killed entity, - * - * @return the entity that died - */ - @NotNull - public Entity getEntity() { - return entity; + super(entity); } } diff --git a/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java b/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java index 17b760710..8a1355af3 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java @@ -2,28 +2,19 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.EntityEvent; import net.minestom.server.utils.time.TimeUnit; -import org.jetbrains.annotations.NotNull; -public class EntityFireEvent extends CancellableEvent { +public class EntityFireEvent extends EntityEvent implements CancellableEvent { - private final Entity entity; private int duration; private TimeUnit timeUnit; - public EntityFireEvent(Entity entity, int duration, TimeUnit timeUnit) { - this.entity = entity; - setFireTime(duration, timeUnit); - } + private boolean cancelled; - /** - * Gets the entity who got in fire. - * - * @return the entity - */ - @NotNull - public Entity getEntity() { - return entity; + public EntityFireEvent(Entity entity, int duration, TimeUnit timeUnit) { + super(entity); + setFireTime(duration, timeUnit); } public long getFireTime(TimeUnit timeUnit) { @@ -43,4 +34,13 @@ public class EntityFireEvent extends CancellableEvent { this.timeUnit = timeUnit; } + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java b/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java index cb234c3cc..09a155e84 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java @@ -2,21 +2,22 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.ItemEntity; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.EntityEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; /** * Called when two {@link ItemEntity} are merging their {@link ItemStack} together to form a sole entity. */ -public class EntityItemMergeEvent extends CancellableEvent { +public class EntityItemMergeEvent extends EntityEvent implements CancellableEvent { - private final ItemEntity source; private final ItemEntity merged; - private ItemStack result; + private boolean cancelled; + public EntityItemMergeEvent(@NotNull ItemEntity source, @NotNull ItemEntity merged, @NotNull ItemStack result) { - this.source = source; + super(source); this.merged = merged; this.result = result; } @@ -29,8 +30,9 @@ public class EntityItemMergeEvent extends CancellableEvent { * @return the source ItemEntity */ @NotNull - public ItemEntity getSource() { - return source; + @Override + public ItemEntity getEntity() { + return (ItemEntity) entity; } /** @@ -63,4 +65,14 @@ public class EntityItemMergeEvent extends CancellableEvent { public void setResult(@NotNull ItemStack result) { this.result = result; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java b/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java index fc2c69836..a53b66ee4 100644 --- a/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java @@ -1,20 +1,19 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; +import net.minestom.server.event.EntityEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called when a new instance is set for an entity. */ -public class EntitySpawnEvent extends Event { +public class EntitySpawnEvent extends EntityEvent { - private final Entity entity; private final Instance spawnInstance; public EntitySpawnEvent(@NotNull Entity entity, @NotNull Instance spawnInstance) { - this.entity = entity; + super(entity); this.spawnInstance = spawnInstance; } @@ -24,6 +23,7 @@ public class EntitySpawnEvent extends Event { * @return the entity */ @NotNull + @Override public Entity getEntity() { return entity; } diff --git a/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java b/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java index 5abc288fe..0e81c3313 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java @@ -1,23 +1,17 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; +import net.minestom.server.event.EntityEvent; import org.jetbrains.annotations.NotNull; /** * Called when an entity ticks itself. * Same event instance used for all tick events for the same entity. */ -public class EntityTickEvent extends Event { - - private final Entity entity; +public class EntityTickEvent extends EntityEvent { public EntityTickEvent(@NotNull Entity entity) { - this.entity = entity; + super(entity); } - @NotNull - public Entity getEntity() { - return entity; - } } diff --git a/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java b/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java index fa09f1176..ae0024f99 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java @@ -2,19 +2,21 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.EntityEvent; import net.minestom.server.utils.Vector; import org.jetbrains.annotations.NotNull; /** * Called when a velocity is applied to an entity using {@link Entity#setVelocity(Vector)}. */ -public class EntityVelocityEvent extends CancellableEvent { +public class EntityVelocityEvent extends EntityEvent implements CancellableEvent { - private final Entity entity; private Vector velocity; + private boolean cancelled; + public EntityVelocityEvent(@NotNull Entity entity, @NotNull Vector velocity) { - this.entity = entity; + super(entity); this.velocity = velocity; } @@ -24,6 +26,7 @@ public class EntityVelocityEvent extends CancellableEvent { * @return the entity */ @NotNull + @Override public Entity getEntity() { return entity; } @@ -46,4 +49,14 @@ public class EntityVelocityEvent extends CancellableEvent { public void setVelocity(@NotNull Vector velocity) { this.velocity = velocity; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/handler/EventHandler.java b/src/main/java/net/minestom/server/event/handler/EventHandler.java index 25fbe91eb..eaec31f87 100644 --- a/src/main/java/net/minestom/server/event/handler/EventHandler.java +++ b/src/main/java/net/minestom/server/event/handler/EventHandler.java @@ -122,7 +122,9 @@ public interface EventHandler { * @param the event type * @see #callEvent(Class, Event) */ - default void callCancellableEvent(@NotNull Class eventClass, @NotNull E event, @NotNull Runnable successCallback) { + default void callCancellableEvent(@NotNull Class eventClass, + @NotNull E event, + @NotNull Runnable successCallback) { callEvent(eventClass, event); if (!event.isCancelled()) { successCallback.run(); diff --git a/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java b/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java index 21da230b0..861d6f891 100644 --- a/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java +++ b/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event.instance; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; @@ -9,13 +10,14 @@ import org.jetbrains.annotations.NotNull; * Called by an Instance when an entity is added to it. * Can be used attach data. */ -public class AddEntityToInstanceEvent extends CancellableEvent { +public class AddEntityToInstanceEvent extends InstanceEvent implements CancellableEvent { - private final Instance instance; private final Entity entity; + private boolean cancelled; + public AddEntityToInstanceEvent(@NotNull Instance instance, @NotNull Entity entity) { - this.instance = instance; + super(instance); this.entity = entity; } @@ -29,13 +31,13 @@ public class AddEntityToInstanceEvent extends CancellableEvent { return entity; } - /** - * Instance in which the entity is being added - * - * @return instance in which the entity is being added - */ - @NotNull - public Instance getInstance() { - return instance; + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; } } diff --git a/src/main/java/net/minestom/server/event/instance/InstanceChunkLoadEvent.java b/src/main/java/net/minestom/server/event/instance/InstanceChunkLoadEvent.java index 3fe385778..c102d75b1 100644 --- a/src/main/java/net/minestom/server/event/instance/InstanceChunkLoadEvent.java +++ b/src/main/java/net/minestom/server/event/instance/InstanceChunkLoadEvent.java @@ -1,33 +1,22 @@ package net.minestom.server.event.instance; -import net.minestom.server.event.Event; +import net.minestom.server.event.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called when a chunk in an instance is loaded. */ -public class InstanceChunkLoadEvent extends Event { +public class InstanceChunkLoadEvent extends InstanceEvent { - private final Instance instance; private final int chunkX, chunkZ; public InstanceChunkLoadEvent(@NotNull Instance instance, int chunkX, int chunkZ) { - this.instance = instance; + super(instance); this.chunkX = chunkX; this.chunkZ = chunkZ; } - /** - * Gets the instance where the chunk has been loaded. - * - * @return the instance - */ - @NotNull - public Instance getInstance() { - return instance; - } - /** * Gets the chunk X. * diff --git a/src/main/java/net/minestom/server/event/instance/InstanceChunkUnloadEvent.java b/src/main/java/net/minestom/server/event/instance/InstanceChunkUnloadEvent.java index f354d67ee..306aaf107 100644 --- a/src/main/java/net/minestom/server/event/instance/InstanceChunkUnloadEvent.java +++ b/src/main/java/net/minestom/server/event/instance/InstanceChunkUnloadEvent.java @@ -1,33 +1,22 @@ package net.minestom.server.event.instance; -import net.minestom.server.event.Event; +import net.minestom.server.event.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called when a chunk in an instance is unloaded. */ -public class InstanceChunkUnloadEvent extends Event { +public class InstanceChunkUnloadEvent extends InstanceEvent { - private final Instance instance; private final int chunkX, chunkZ; public InstanceChunkUnloadEvent(@NotNull Instance instance, int chunkX, int chunkZ) { - this.instance = instance; + super(instance); this.chunkX = chunkX; this.chunkZ = chunkZ; } - /** - * Gets the instance where the chunk has been unloaded. - * - * @return the instance - */ - @NotNull - public Instance getInstance() { - return instance; - } - /** * Gets the chunk X. * diff --git a/src/main/java/net/minestom/server/event/instance/InstanceTickEvent.java b/src/main/java/net/minestom/server/event/instance/InstanceTickEvent.java index 26b67b619..eef4c67a6 100644 --- a/src/main/java/net/minestom/server/event/instance/InstanceTickEvent.java +++ b/src/main/java/net/minestom/server/event/instance/InstanceTickEvent.java @@ -1,20 +1,19 @@ package net.minestom.server.event.instance; -import net.minestom.server.event.Event; +import net.minestom.server.event.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called when an instance processes a tick. */ -public class InstanceTickEvent extends Event { +public class InstanceTickEvent extends InstanceEvent { private final int duration; - private final Instance instance; public InstanceTickEvent(@NotNull Instance instance, long time, long lastTickAge) { + super(instance); this.duration = (int) (time - lastTickAge); - this.instance = instance; } /** @@ -25,14 +24,4 @@ public class InstanceTickEvent extends Event { public int getDuration() { return duration; } - - /** - * Gets the instance of the event. - * - * @return the instance - */ - @NotNull - public Instance getInstance() { - return instance; - } } \ No newline at end of file diff --git a/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java b/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java index 55f83bc4f..fe180ffea 100644 --- a/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java +++ b/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java @@ -2,19 +2,21 @@ package net.minestom.server.event.instance; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called by an Instance when an entity is removed from it. */ -public class RemoveEntityFromInstanceEvent extends CancellableEvent { +public class RemoveEntityFromInstanceEvent extends InstanceEvent implements CancellableEvent { - private final Instance instance; private final Entity entity; + private boolean cancelled; + public RemoveEntityFromInstanceEvent(@NotNull Instance instance, @NotNull Entity entity) { - this.instance = instance; + super(instance); this.entity = entity; } @@ -28,13 +30,13 @@ public class RemoveEntityFromInstanceEvent extends CancellableEvent { return entity; } - /** - * Instance from which the entity is being removed. - * - * @return instance from which the entity is being removed - */ - @NotNull - public Instance getInstance() { - return instance; + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; } } diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryClickEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryClickEvent.java index f3c3ce4a6..b7e9a89bb 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryClickEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryClickEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.InventoryEvent; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.click.ClickType; import net.minestom.server.item.ItemStack; @@ -12,20 +12,19 @@ import org.jetbrains.annotations.Nullable; * Called after {@link InventoryPreClickEvent}, this event cannot be cancelled and items related to the click * are already moved. */ -public class InventoryClickEvent extends Event { +public class InventoryClickEvent extends InventoryEvent { private final Player player; - private final Inventory inventory; private final int slot; private final ClickType clickType; private final ItemStack clickedItem; private final ItemStack cursorItem; - public InventoryClickEvent(@NotNull Player player, Inventory inventory, + public InventoryClickEvent(@Nullable Inventory inventory, @NotNull Player player, int slot, @NotNull ClickType clickType, @NotNull ItemStack clicked, @NotNull ItemStack cursor) { + super(inventory); this.player = player; - this.inventory = inventory; this.slot = slot; this.clickType = clickType; this.clickedItem = clicked; @@ -42,16 +41,6 @@ public class InventoryClickEvent extends Event { return player; } - /** - * Can be null if the clicked inventory is the player one. - * - * @return the inventory where the click happened, null if this is the player's inventory - */ - @Nullable - public Inventory getInventory() { - return inventory; - } - /** * Gets the clicked slot number. * diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryCloseEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryCloseEvent.java index 81b94df32..881d64e07 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryCloseEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryCloseEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.InventoryEvent; import net.minestom.server.inventory.Inventory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -9,15 +9,14 @@ import org.jetbrains.annotations.Nullable; /** * Called when an {@link Inventory} is closed by a player. */ -public class InventoryCloseEvent extends Event { +public class InventoryCloseEvent extends InventoryEvent { private final Player player; - private final Inventory inventory; private Inventory newInventory; - public InventoryCloseEvent(@NotNull Player player, @Nullable Inventory inventory) { + public InventoryCloseEvent(@Nullable Inventory inventory, @NotNull Player player) { + super(inventory); this.player = player; - this.inventory = inventory; } /** @@ -30,16 +29,6 @@ public class InventoryCloseEvent extends Event { return player; } - /** - * Gets the closed inventory. - * - * @return the closed inventory, null if this is the player inventory - */ - @Nullable - public Inventory getInventory() { - return inventory; - } - /** * Gets the new inventory to open. * diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java index 574aa4a1f..6b02eb717 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.InventoryEvent; import net.minestom.server.inventory.Inventory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -11,14 +12,15 @@ import org.jetbrains.annotations.Nullable; *

* Executed by {@link Player#openInventory(Inventory)}. */ -public class InventoryOpenEvent extends CancellableEvent { +public class InventoryOpenEvent extends InventoryEvent implements CancellableEvent { private final Player player; - private Inventory inventory; - public InventoryOpenEvent(@NotNull Player player, @Nullable Inventory inventory) { + private boolean cancelled; + + public InventoryOpenEvent(@Nullable Inventory inventory, @NotNull Player player) { + super(inventory); this.player = player; - this.inventory = inventory; } /** @@ -37,6 +39,7 @@ public class InventoryOpenEvent extends CancellableEvent { * @return the inventory to open, null to just close the current inventory if any */ @Nullable + @Override public Inventory getInventory() { return inventory; } @@ -51,4 +54,14 @@ public class InventoryOpenEvent extends CancellableEvent { public void setInventory(@Nullable Inventory inventory) { this.inventory = inventory; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java index 54f42bc89..ca4733b38 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.InventoryEvent; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.click.ClickType; import net.minestom.server.item.ItemStack; @@ -11,20 +12,22 @@ import org.jetbrains.annotations.Nullable; /** * Called before {@link InventoryClickEvent}, used to potentially cancel the click. */ -public class InventoryPreClickEvent extends CancellableEvent { +public class InventoryPreClickEvent extends InventoryEvent implements CancellableEvent { private final Player player; - private final Inventory inventory; private final int slot; private final ClickType clickType; private ItemStack clickedItem; private ItemStack cursorItem; - public InventoryPreClickEvent(@NotNull Player player, @Nullable Inventory inventory, + private boolean cancelled; + + public InventoryPreClickEvent(@Nullable Inventory inventory, + @NotNull Player player, int slot, @NotNull ClickType clickType, @NotNull ItemStack clicked, @NotNull ItemStack cursor) { + super(inventory); this.player = player; - this.inventory = inventory; this.slot = slot; this.clickType = clickType; this.clickedItem = clicked; @@ -41,16 +44,6 @@ public class InventoryPreClickEvent extends CancellableEvent { return player; } - /** - * Can be null if the clicked inventory is the player one. - * - * @return the inventory where the click happened, null if this is the player's inventory - */ - @Nullable - public Inventory getInventory() { - return inventory; - } - /** * Gets the clicked slot number. * @@ -107,4 +100,14 @@ public class InventoryPreClickEvent extends CancellableEvent { public void setCursorItem(@NotNull ItemStack cursorItem) { this.cursorItem = cursorItem; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java index d6bcee6e6..4ec4591ab 100644 --- a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java +++ b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java @@ -2,14 +2,17 @@ package net.minestom.server.event.item; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.Event; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class ItemDropEvent extends CancellableEvent { +public class ItemDropEvent extends Event implements CancellableEvent { private final Player player; private final ItemStack itemStack; + private boolean cancelled; + public ItemDropEvent(@NotNull Player player, @NotNull ItemStack itemStack) { this.player = player; this.itemStack = itemStack; @@ -24,4 +27,14 @@ public class ItemDropEvent extends CancellableEvent { public ItemStack getItemStack() { return itemStack; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java b/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java index 9bb212a02..a1fa19188 100644 --- a/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java +++ b/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java @@ -2,13 +2,16 @@ package net.minestom.server.event.item; import net.minestom.server.entity.ExperienceOrb; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.Event; import org.jetbrains.annotations.NotNull; -public class PickupExperienceEvent extends CancellableEvent { +public class PickupExperienceEvent extends Event implements CancellableEvent { private final ExperienceOrb experienceOrb; private short experienceCount; + private boolean cancelled; + public PickupExperienceEvent(@NotNull ExperienceOrb experienceOrb) { this.experienceOrb = experienceOrb; this.experienceCount = experienceOrb.getExperienceCount(); @@ -26,4 +29,14 @@ public class PickupExperienceEvent extends CancellableEvent { public void setExperienceCount(short experienceCount) { this.experienceCount = experienceCount; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/item/PickupItemEvent.java b/src/main/java/net/minestom/server/event/item/PickupItemEvent.java index 48e44bc16..b4ce28234 100644 --- a/src/main/java/net/minestom/server/event/item/PickupItemEvent.java +++ b/src/main/java/net/minestom/server/event/item/PickupItemEvent.java @@ -2,14 +2,17 @@ package net.minestom.server.event.item; import net.minestom.server.entity.LivingEntity; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.Event; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class PickupItemEvent extends CancellableEvent { +public class PickupItemEvent extends Event implements CancellableEvent { private final LivingEntity livingEntity; private final ItemStack itemStack; + private boolean cancelled; + public PickupItemEvent(@NotNull LivingEntity livingEntity, @NotNull ItemStack itemStack) { this.livingEntity = livingEntity; this.itemStack = itemStack; @@ -24,4 +27,14 @@ public class PickupItemEvent extends CancellableEvent { public ItemStack getItemStack() { return itemStack; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java b/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java index ea725ac49..6270b9887 100644 --- a/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java +++ b/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java @@ -2,35 +2,24 @@ package net.minestom.server.event.player; import net.minestom.server.advancements.AdvancementAction; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a {@link Player} opens the advancement screens or switch the tab * and when he closes the screen. */ -public class AdvancementTabEvent extends Event { +public class AdvancementTabEvent extends PlayerEvent { - private final Player player; private final AdvancementAction action; private final String tabId; public AdvancementTabEvent(@NotNull Player player, @NotNull AdvancementAction action, @NotNull String tabId) { - this.player = player; + super(player); this.action = action; this.tabId = tabId; } - /** - * Gets the {@link Player} responsible for the event. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the action. * diff --git a/src/main/java/net/minestom/server/event/player/PlayerAddItemStackEvent.java b/src/main/java/net/minestom/server/event/player/PlayerAddItemStackEvent.java index 48d181eef..3adbb1e6f 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerAddItemStackEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerAddItemStackEvent.java @@ -2,30 +2,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; /** * Called as a result of {@link net.minestom.server.inventory.PlayerInventory#addItemStack(ItemStack)}. */ -public class PlayerAddItemStackEvent extends CancellableEvent { +public class PlayerAddItemStackEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private ItemStack itemStack; - public PlayerAddItemStackEvent(@NotNull Player player, @NotNull ItemStack itemStack) { - this.player = player; - this.itemStack = itemStack; - } + private boolean cancelled; - /** - * Gets the player who has an item stack added to his inventory. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; + public PlayerAddItemStackEvent(@NotNull Player player, @NotNull ItemStack itemStack) { + super(player); + this.itemStack = itemStack; } /** @@ -44,6 +36,16 @@ public class PlayerAddItemStackEvent extends CancellableEvent { * @param itemStack the new item stack */ public void setItemStack(@NotNull ItemStack itemStack) { - this.itemStack =itemStack; + this.itemStack = itemStack; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java index f4918f2d2..c9dee8793 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java @@ -2,14 +2,13 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.instance.block.CustomBlock; import net.minestom.server.utils.BlockPosition; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class PlayerBlockBreakEvent extends CancellableEvent { - - private final Player player; +public class PlayerBlockBreakEvent extends PlayerEvent implements CancellableEvent { private final BlockPosition blockPosition; @@ -19,10 +18,12 @@ public class PlayerBlockBreakEvent extends CancellableEvent { private short resultBlockStateId; private short resultCustomBlockId; + private boolean cancelled; + public PlayerBlockBreakEvent(@NotNull Player player, @NotNull BlockPosition blockPosition, short blockStateId, @Nullable CustomBlock customBlock, short resultBlockStateId, short resultCustomBlockId) { - this.player = player; + super(player); this.blockPosition = blockPosition; @@ -33,16 +34,6 @@ public class PlayerBlockBreakEvent extends CancellableEvent { this.resultCustomBlockId = resultCustomBlockId; } - /** - * Gets the player who breaks the block. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the block position. * @@ -113,4 +104,14 @@ public class PlayerBlockBreakEvent extends CancellableEvent { public void setResultCustomBlockId(short resultCustomBlockId) { this.resultCustomBlockId = resultCustomBlockId; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java index 233a03901..da1075a34 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.instance.block.BlockFace; import net.minestom.server.utils.BlockPosition; import org.jetbrains.annotations.NotNull; @@ -10,9 +11,8 @@ import org.jetbrains.annotations.NotNull; * Called when a player interacts with a block (right-click). * This is also called when a block is placed. */ -public class PlayerBlockInteractEvent extends CancellableEvent { +public class PlayerBlockInteractEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private final BlockPosition blockPosition; private final Player.Hand hand; private final BlockFace blockFace; @@ -23,24 +23,16 @@ public class PlayerBlockInteractEvent extends CancellableEvent { */ private boolean blocksItemUse; + private boolean cancelled; + public PlayerBlockInteractEvent(@NotNull Player player, @NotNull BlockPosition blockPosition, @NotNull Player.Hand hand, @NotNull BlockFace blockFace) { - this.player = player; + super(player); this.blockPosition = blockPosition; this.hand = hand; this.blockFace = blockFace; } - /** - * Gets the player who interacted with the block. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets if the event should block the item use. * @@ -83,4 +75,14 @@ public class PlayerBlockInteractEvent extends CancellableEvent { public BlockFace getBlockFace() { return blockFace; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java index 5db541ece..49594df1c 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java @@ -3,6 +3,7 @@ package net.minestom.server.event.player; import net.minestom.server.MinecraftServer; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.instance.block.BlockManager; import net.minestom.server.instance.block.CustomBlock; import net.minestom.server.utils.BlockPosition; @@ -11,11 +12,10 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player tries placing a block. */ -public class PlayerBlockPlaceEvent extends CancellableEvent { +public class PlayerBlockPlaceEvent extends PlayerEvent implements CancellableEvent { private static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); - private final Player player; private short blockStateId; private short customBlockId; private final BlockPosition blockPosition; @@ -23,9 +23,11 @@ public class PlayerBlockPlaceEvent extends CancellableEvent { private boolean consumeBlock; + private boolean cancelled; + public PlayerBlockPlaceEvent(@NotNull Player player, short blockStateId, short customBlockId, @NotNull BlockPosition blockPosition, @NotNull Player.Hand hand) { - this.player = player; + super(player); this.blockStateId = blockStateId; this.customBlockId = customBlockId; this.blockPosition = blockPosition; @@ -102,16 +104,6 @@ public class PlayerBlockPlaceEvent extends CancellableEvent { this.blockStateId = blockStateId; } - /** - * Gets the player who is placing the block. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the block position. * @@ -149,4 +141,14 @@ public class PlayerBlockPlaceEvent extends CancellableEvent { public boolean doesConsumeBlock() { return consumeBlock; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java index 4ef36cfec..d3c0a0c48 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; @@ -9,24 +10,15 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player change his held slot (by pressing 1-9 keys). */ -public class PlayerChangeHeldSlotEvent extends CancellableEvent { +public class PlayerChangeHeldSlotEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private byte slot; - public PlayerChangeHeldSlotEvent(@NotNull Player player, byte slot) { - this.player = player; - this.slot = slot; - } + private boolean cancelled; - /** - * Gets the player who changed his held slot. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; + public PlayerChangeHeldSlotEvent(@NotNull Player player, byte slot) { + super(player); + this.slot = slot; } /** @@ -48,4 +40,14 @@ public class PlayerChangeHeldSlotEvent extends CancellableEvent { Check.argCondition(!MathUtils.isBetween(slot, 0, 8), "The held slot needs to be between 0 and 8"); this.slot = slot; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java index 4f87a08cc..66af6d837 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java @@ -3,6 +3,7 @@ package net.minestom.server.event.player; import net.minestom.server.chat.RichMessage; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -14,15 +15,16 @@ import java.util.function.Function; * Called every time a {@link Player} write and send something in the chat. * The event can be cancelled to do not send anything, and the format can be changed. */ -public class PlayerChatEvent extends CancellableEvent { +public class PlayerChatEvent extends PlayerEvent implements CancellableEvent { - private final Player sender; private final Collection recipients; private String message; private Function chatFormat; - public PlayerChatEvent(@NotNull Player sender, @NotNull Collection recipients, @NotNull String message) { - this.sender = sender; + private boolean cancelled; + + public PlayerChatEvent(@NotNull Player player, @NotNull Collection recipients, @NotNull String message) { + super(player); this.recipients = new ArrayList<>(recipients); this.message = message; } @@ -36,16 +38,6 @@ public class PlayerChatEvent extends CancellableEvent { this.chatFormat = chatFormat; } - /** - * Gets the message sender. - * - * @return the sender - */ - @NotNull - public Player getSender() { - return sender; - } - /** * Those are the players who will receive the message. *

@@ -88,4 +80,14 @@ public class PlayerChatEvent extends CancellableEvent { public Function getChatFormatFunction() { return chatFormat; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java index bb66cfb14..b312ae85d 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java @@ -1,33 +1,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player receive a new chunk data. */ -public class PlayerChunkLoadEvent extends Event { +public class PlayerChunkLoadEvent extends PlayerEvent { - private final Player player; private final int chunkX, chunkZ; public PlayerChunkLoadEvent(@NotNull Player player, int chunkX, int chunkZ) { - this.player = player; + super(player); this.chunkX = chunkX; this.chunkZ = chunkZ; } - /** - * Gets the player. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the chunk X. * diff --git a/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java index 137fb7f99..e8ab23be5 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** @@ -9,27 +9,16 @@ import org.jetbrains.annotations.NotNull; *

* Could be used to unload the chunk internally in order to save memory. */ -public class PlayerChunkUnloadEvent extends Event { +public class PlayerChunkUnloadEvent extends PlayerEvent { - private final Player player; private final int chunkX, chunkZ; public PlayerChunkUnloadEvent(@NotNull Player player, int chunkX, int chunkZ) { - this.player = player; + super(player); this.chunkX = chunkX; this.chunkZ = chunkZ; } - /** - * Gets the player. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the chunk X. * diff --git a/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java b/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java index 0309c67ea..6e977c067 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java @@ -2,29 +2,21 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called every time a player send a message starting by '/'. */ -public class PlayerCommandEvent extends CancellableEvent { +public class PlayerCommandEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private String command; - public PlayerCommandEvent(@NotNull Player player, @NotNull String command) { - this.player = player; - this.command = command; - } + private boolean cancelled; - /** - * Gets the player who sent the command. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; + public PlayerCommandEvent(@NotNull Player player, @NotNull String command) { + super(player); + this.command = command; } /** @@ -45,4 +37,14 @@ public class PlayerCommandEvent extends CancellableEvent { public void setCommand(@NotNull String command) { this.command = command; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java b/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java index 5f8778c04..93335cbb3 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java @@ -1,27 +1,15 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player disconnect. */ -public class PlayerDisconnectEvent extends Event { - - private final Player player; +public class PlayerDisconnectEvent extends PlayerEvent { public PlayerDisconnectEvent(@NotNull Player player) { - this.player = player; - } - - /** - * Gets the player who is disconnecting. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; + super(player); } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java index 516017f53..527b4c56f 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java @@ -1,33 +1,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; /** * Called when a player is finished eating. */ -public class PlayerEatEvent extends Event { +public class PlayerEatEvent extends PlayerEvent { - private final Player player; private final ItemStack foodItem; public PlayerEatEvent(@NotNull Player player, @NotNull ItemStack foodItem) { - this.player = player; + super(player); this.foodItem = foodItem; } - /** - * Gets the player who is finished eating. - * - * @return the concerned player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the food item that has been eaten. * diff --git a/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java b/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java index 385e7c6a0..d5c8da5e9 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java @@ -2,34 +2,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a {@link Player} interacts (right-click) with an {@link Entity}. */ -public class PlayerEntityInteractEvent extends Event { +public class PlayerEntityInteractEvent extends PlayerEvent { - private final Player player; private final Entity entityTarget; private final Player.Hand hand; public PlayerEntityInteractEvent(@NotNull Player player, @NotNull Entity entityTarget, @NotNull Player.Hand hand) { - this.player = player; + super(player); this.entityTarget = entityTarget; this.hand = hand; } - /** - * Gets the {@link Player} who is interacting. - * - * @return the {@link Player} - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the {@link Entity} with who {@link #getPlayer()} is interacting. * diff --git a/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java b/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java index 67ee657af..7d9ba9d21 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java @@ -2,29 +2,21 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when the player swings his hand. */ -public class PlayerHandAnimationEvent extends CancellableEvent { +public class PlayerHandAnimationEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private final Player.Hand hand; - public PlayerHandAnimationEvent(@NotNull Player player, @NotNull Player.Hand hand) { - this.player = player; - this.hand = hand; - } + private boolean cancelled; - /** - * The player who is swinging his arm. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; + public PlayerHandAnimationEvent(@NotNull Player player, @NotNull Player.Hand hand) { + super(player); + this.hand = hand; } /** @@ -36,4 +28,14 @@ public class PlayerHandAnimationEvent extends CancellableEvent { public Player.Hand getHand() { return hand; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java b/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java index cf4f9792b..335108736 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** @@ -9,24 +10,15 @@ import org.jetbrains.annotations.NotNull; * * @see ItemAnimationType */ -public class PlayerItemAnimationEvent extends CancellableEvent { +public class PlayerItemAnimationEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private final ItemAnimationType armAnimationType; - public PlayerItemAnimationEvent(@NotNull Player player, @NotNull ItemAnimationType armAnimationType) { - this.player = player; - this.armAnimationType = armAnimationType; - } + private boolean cancelled; - /** - * Gets the {@link Player} who is responsible for the animation. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; + public PlayerItemAnimationEvent(@NotNull Player player, @NotNull ItemAnimationType armAnimationType) { + super(player); + this.armAnimationType = armAnimationType; } /** @@ -47,4 +39,13 @@ public class PlayerItemAnimationEvent extends CancellableEvent { EAT } + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java b/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java index 57bc94523..817e8a94c 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,23 +16,12 @@ import org.jetbrains.annotations.Nullable; *

* WARNING: defining the spawning instance is MANDATORY. */ -public class PlayerLoginEvent extends Event { +public class PlayerLoginEvent extends PlayerEvent { - private final Player player; private Instance spawningInstance; public PlayerLoginEvent(@NotNull Player player) { - this.player = player; - } - - /** - * Gets the player who is logging. - * - * @return the player who is logging - */ - @NotNull - public Player getPlayer() { - return player; + super(player); } /** diff --git a/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java b/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java index 1ec41a584..2190a7dbe 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java @@ -2,30 +2,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; /** * Called when a player is modifying his position. */ -public class PlayerMoveEvent extends CancellableEvent { +public class PlayerMoveEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private Position newPosition; - public PlayerMoveEvent(@NotNull Player player, @NotNull Position newPosition) { - this.player = player; - this.newPosition = newPosition; - } + private boolean cancelled; - /** - * Gets the player who is moving. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; + public PlayerMoveEvent(@NotNull Player player, @NotNull Position newPosition) { + super(player); + this.newPosition = newPosition; } /** @@ -46,4 +38,14 @@ public class PlayerMoveEvent extends CancellableEvent { public void setNewPosition(@NotNull Position newPosition) { this.newPosition = newPosition; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java index 3f7a74e68..6f14dd180 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java @@ -1,34 +1,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player send {@link net.minestom.server.network.packet.client.play.ClientPluginMessagePacket}. */ -public class PlayerPluginMessageEvent extends Event { +public class PlayerPluginMessageEvent extends PlayerEvent { - private final Player player; private final String identifier; private final byte[] message; public PlayerPluginMessageEvent(@NotNull Player player, @NotNull String identifier, @NotNull byte[] message) { - this.player = player; + super(player); this.identifier = identifier; this.message = message; } - /** - * Gets the player who sent the message. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the message identifier. * diff --git a/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java index a2c06c4bb..a4f61f447 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -10,28 +11,19 @@ import org.jetbrains.annotations.NotNull; * or to cancel its processing, cancelling the event means that the player will * continue the animation indefinitely. */ -public class PlayerPreEatEvent extends CancellableEvent { +public class PlayerPreEatEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private final ItemStack foodItem; private long eatingTime; + private boolean cancelled; + public PlayerPreEatEvent(@NotNull Player player, @NotNull ItemStack foodItem, long eatingTime) { - this.player = player; + super(player); this.foodItem = foodItem; this.eatingTime = eatingTime; } - /** - * The player who is trying to eat. - * - * @return the concerned player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * The food item which will be eaten. * @@ -61,4 +53,14 @@ public class PlayerPreEatEvent extends CancellableEvent { public void setEatingTime(long eatingTime) { this.eatingTime = eatingTime; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerPreLoginEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPreLoginEvent.java index 1db457ab3..dfcb4d03f 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerPreLoginEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerPreLoginEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; @@ -11,28 +11,17 @@ import java.util.UUID; * Called before the player initialization, it can be used to kick the player before any connection * or to change his final username/uuid. */ -public class PlayerPreLoginEvent extends Event { +public class PlayerPreLoginEvent extends PlayerEvent { - private final Player player; private String username; private UUID playerUuid; public PlayerPreLoginEvent(@NotNull Player player, @NotNull String username, @NotNull UUID playerUuid) { - this.player = player; + super(player); this.username = username; this.playerUuid = playerUuid; } - /** - * Gets the player who is trying to connect. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the player username. * diff --git a/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java b/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java index 2ad6e5068..1d367e846 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java @@ -1,33 +1,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.resourcepack.ResourcePackStatus; import org.jetbrains.annotations.NotNull; /** * Called when a player warns the server of a resource pack status. */ -public class PlayerResourcePackStatusEvent extends Event { +public class PlayerResourcePackStatusEvent extends PlayerEvent { - private final Player player; private final ResourcePackStatus status; public PlayerResourcePackStatusEvent(@NotNull Player player, @NotNull ResourcePackStatus status) { - this.player = player; + super(player); this.status = status; } - /** - * Gets the player who send a resource pack status. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the resource pack status. * diff --git a/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java b/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java index 00039316c..598a9d729 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; @@ -9,26 +9,15 @@ import org.jetbrains.annotations.NotNull; * Called when {@link Player#respawn()} is executed (for custom respawn or as a result of * {@link net.minestom.server.network.packet.client.play.ClientStatusPacket} */ -public class PlayerRespawnEvent extends Event { +public class PlayerRespawnEvent extends PlayerEvent { - private final Player player; private Position respawnPosition; public PlayerRespawnEvent(@NotNull Player player) { - this.player = player; + super(player); this.respawnPosition = player.getRespawnPoint(); } - /** - * Gets the player who is respawning. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the respawn position. *

diff --git a/src/main/java/net/minestom/server/event/player/PlayerSetItemStackEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSetItemStackEvent.java index fd1cbe7d8..f0e9e0574 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSetItemStackEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSetItemStackEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -9,28 +10,19 @@ import org.jetbrains.annotations.NotNull; * Called as a result of {@link net.minestom.server.inventory.PlayerInventory#setItemStack(int, ItemStack)} * and player click in his inventory. */ -public class PlayerSetItemStackEvent extends CancellableEvent { +public class PlayerSetItemStackEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private int slot; private ItemStack itemStack; + private boolean cancelled; + public PlayerSetItemStackEvent(@NotNull Player player, int slot, @NotNull ItemStack itemStack) { - this.player = player; + super(player); this.slot = slot; this.itemStack = itemStack; } - /** - * Gets the player who has an item stack set to his inventory. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the slot where the item will be set. * @@ -68,4 +60,13 @@ public class PlayerSetItemStackEvent extends CancellableEvent { this.itemStack = itemStack; } + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java index 357c4cb94..d876c4d4d 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java @@ -1,18 +1,16 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called after the player signals the server that his settings has been modified. */ -public class PlayerSettingsChangeEvent extends Event { - - private final Player player; +public class PlayerSettingsChangeEvent extends PlayerEvent { public PlayerSettingsChangeEvent(@NotNull Player player) { - this.player = player; + super(player); } /** @@ -23,6 +21,7 @@ public class PlayerSettingsChangeEvent extends Event { * @return the player */ @NotNull + @Override public Player getPlayer() { return player; } diff --git a/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java index 7cdf377f8..d8cb40644 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java @@ -2,33 +2,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.entity.PlayerSkin; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Called at the player connection to initialize his skin. */ -public class PlayerSkinInitEvent extends Event { +public class PlayerSkinInitEvent extends PlayerEvent { - private final Player player; private PlayerSkin skin; public PlayerSkinInitEvent(@NotNull Player player, @Nullable PlayerSkin currentSkin) { - this.player = player; + super(player); this.skin = currentSkin; } - /** - * Gets the player whose the skin is getting initialized. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the spawning skin of the player. * diff --git a/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java index 4d27ddf4f..6c4f393a2 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java @@ -1,33 +1,32 @@ package net.minestom.server.event.player; -import org.jetbrains.annotations.NotNull; - import net.minestom.server.entity.Player; -import net.minestom.server.event.entity.EntitySpawnEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.instance.Instance; +import org.jetbrains.annotations.NotNull; /** * Called when a new instance is set for a player. */ -public class PlayerSpawnEvent extends EntitySpawnEvent { +public class PlayerSpawnEvent extends PlayerEvent { + private final Instance spawnInstance; private final boolean firstSpawn; public PlayerSpawnEvent(@NotNull Player player, @NotNull Instance spawnInstance, boolean firstSpawn) { - super(player, spawnInstance); + super(player); + this.spawnInstance = spawnInstance; this.firstSpawn = firstSpawn; } /** - * Gets the player who spawned. - *

- * Shortcut for casting {@link #getEntity()}. + * Gets the entity new instance. * - * @return + * @return the instance */ @NotNull - public Player getPlayer() { - return (Player) getEntity(); + public Instance getSpawnInstance() { + return spawnInstance; } /** diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java index 60e107820..a8b00c515 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.utils.BlockPosition; import org.jetbrains.annotations.NotNull; @@ -13,30 +14,21 @@ import org.jetbrains.annotations.NotNull; * (could be because of high latency or a modified client) so cancelling {@link PlayerBlockBreakEvent} is also necessary. * Could be fixed in future Minestom version. */ -public class PlayerStartDiggingEvent extends CancellableEvent { +public class PlayerStartDiggingEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private final BlockPosition blockPosition; private final int blockStateId; private final int customBlockId; + private boolean cancelled; + public PlayerStartDiggingEvent(@NotNull Player player, @NotNull BlockPosition blockPosition, int blockStateId, int customBlockId) { - this.player = player; + super(player); this.blockPosition = blockPosition; this.blockStateId = blockStateId; this.customBlockId = customBlockId; } - /** - * Gets the {@link Player} who started digging the block. - * - * @return the {@link Player} - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the {@link BlockPosition}. * @@ -64,4 +56,14 @@ public class PlayerStartDiggingEvent extends CancellableEvent { public int getCustomBlockId() { return customBlockId; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java index 074de112f..aefdf9ee0 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java @@ -1,28 +1,15 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player start flying. */ -public class PlayerStartFlyingEvent extends Event { - - private final Player player; +public class PlayerStartFlyingEvent extends PlayerEvent { public PlayerStartFlyingEvent(@NotNull Player player) { - this.player = player; + super(player); } - - /** - * Gets the player who started flying. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java index 84d2b3f9d..027de80c9 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java @@ -1,27 +1,15 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player stop flying. */ -public class PlayerStopFlyingEvent extends Event { - - private final Player player; +public class PlayerStopFlyingEvent extends PlayerEvent { public PlayerStopFlyingEvent(@NotNull Player player) { - this.player = player; - } - - /** - * Gets the player who stopped flying. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; + super(player); } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java index 3785874ec..2aff53cb0 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java @@ -2,34 +2,26 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; /** * Called when a player is trying to swap his main and off hand item. */ -public class PlayerSwapItemEvent extends CancellableEvent { +public class PlayerSwapItemEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private ItemStack mainHandItem; private ItemStack offHandItem; + private boolean cancelled; + public PlayerSwapItemEvent(@NotNull Player player, @NotNull ItemStack mainHandItem, @NotNull ItemStack offHandItem) { - this.player = player; + super(player); this.mainHandItem = mainHandItem; this.offHandItem = offHandItem; } - /** - * Gets the player who is trying to swap his hands item. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the item which will be in player main hand after the event. * @@ -67,4 +59,14 @@ public class PlayerSwapItemEvent extends CancellableEvent { public void setOffHandItem(@NotNull ItemStack offHandItem) { this.offHandItem = offHandItem; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java b/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java index 88c5f5d63..1872fa2da 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java @@ -1,27 +1,15 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called at each player tick. */ -public class PlayerTickEvent extends Event { - - private final Player player; +public class PlayerTickEvent extends PlayerEvent { public PlayerTickEvent(@NotNull Player player) { - this.player = player; - } - - /** - * Gets the player. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; + super(player); } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java index 07389079a..d32567e45 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java @@ -2,34 +2,26 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; /** * Event when an item is used without clicking on a block. */ -public class PlayerUseItemEvent extends CancellableEvent { +public class PlayerUseItemEvent extends PlayerEvent implements CancellableEvent { - private final Player player; private final Player.Hand hand; private final ItemStack itemStack; + private boolean cancelled; + public PlayerUseItemEvent(@NotNull Player player, @NotNull Player.Hand hand, @NotNull ItemStack itemStack) { - this.player = player; + super(player); this.hand = hand; this.itemStack = itemStack; } - /** - * Gets the player who used an item. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets which hand the player used. * @@ -49,4 +41,14 @@ public class PlayerUseItemEvent extends CancellableEvent { public ItemStack getItemStack() { return itemStack; } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java b/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java index 6bec50bf5..88dbcfb32 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.PlayerEvent; import net.minestom.server.item.ItemStack; import net.minestom.server.utils.BlockPosition; import net.minestom.server.utils.Direction; @@ -10,9 +10,8 @@ import org.jetbrains.annotations.NotNull; /** * Used when a player is clicking on a block with an item (but is not a block in item form). */ -public class PlayerUseItemOnBlockEvent extends Event { +public class PlayerUseItemOnBlockEvent extends PlayerEvent { - private final Player player; private final Player.Hand hand; private final ItemStack itemStack; private final BlockPosition position; @@ -21,23 +20,13 @@ public class PlayerUseItemOnBlockEvent extends Event { public PlayerUseItemOnBlockEvent(@NotNull Player player, @NotNull Player.Hand hand, @NotNull ItemStack itemStack, @NotNull BlockPosition position, @NotNull Direction blockFace) { - this.player = player; + super(player); this.hand = hand; this.itemStack = itemStack; this.position = position; this.blockFace = blockFace; } - /** - * Gets the player who used an item while clicking on a block. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } - /** * Gets the position of the interacted block. * diff --git a/src/main/java/net/minestom/server/inventory/InventoryClickHandler.java b/src/main/java/net/minestom/server/inventory/InventoryClickHandler.java index 0cbef79e0..03c588a7a 100644 --- a/src/main/java/net/minestom/server/inventory/InventoryClickHandler.java +++ b/src/main/java/net/minestom/server/inventory/InventoryClickHandler.java @@ -77,7 +77,7 @@ public interface InventoryClickHandler { default void callClickEvent(@NotNull Player player, Inventory inventory, int slot, @NotNull ClickType clickType, @NotNull ItemStack clicked, @NotNull ItemStack cursor) { - InventoryClickEvent inventoryClickEvent = new InventoryClickEvent(player, inventory, slot, clickType, clicked, cursor); + InventoryClickEvent inventoryClickEvent = new InventoryClickEvent(inventory, player, slot, clickType, clicked, cursor); player.callEvent(InventoryClickEvent.class, inventoryClickEvent); } diff --git a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java index b140a1e83..6c4caa498 100644 --- a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java +++ b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java @@ -516,7 +516,7 @@ public class InventoryClickProcessor { // PreClickEvent { - InventoryPreClickEvent inventoryPreClickEvent = new InventoryPreClickEvent(player, inventory, slot, clickType, clicked, cursor); + InventoryPreClickEvent inventoryPreClickEvent = new InventoryPreClickEvent(inventory, player, slot, clickType, clicked, cursor); player.callEvent(InventoryPreClickEvent.class, inventoryPreClickEvent); cursor = inventoryPreClickEvent.getCursorItem(); clicked = inventoryPreClickEvent.getClickedItem(); @@ -567,7 +567,7 @@ public class InventoryClickProcessor { private void callClickEvent(@NotNull Player player, @Nullable Inventory inventory, int slot, @NotNull ClickType clickType, ItemStack clicked, ItemStack cursor) { - InventoryClickEvent inventoryClickEvent = new InventoryClickEvent(player, inventory, slot, clickType, clicked, cursor); + InventoryClickEvent inventoryClickEvent = new InventoryClickEvent(inventory, player, slot, clickType, clicked, cursor); player.callEvent(InventoryClickEvent.class, inventoryClickEvent); } diff --git a/src/main/java/net/minestom/server/listener/ChatMessageListener.java b/src/main/java/net/minestom/server/listener/ChatMessageListener.java index 395deda3f..da341207d 100644 --- a/src/main/java/net/minestom/server/listener/ChatMessageListener.java +++ b/src/main/java/net/minestom/server/listener/ChatMessageListener.java @@ -70,7 +70,7 @@ public class ChatMessageListener { } private static RichMessage buildDefaultChatMessage(PlayerChatEvent chatEvent) { - final String username = chatEvent.getSender().getUsername(); + final String username = chatEvent.getPlayer().getUsername(); final ColoredText usernameText = ColoredText.of(String.format("<%s>", username)); diff --git a/src/main/java/net/minestom/server/listener/WindowListener.java b/src/main/java/net/minestom/server/listener/WindowListener.java index 39cdd441d..c007c6a06 100644 --- a/src/main/java/net/minestom/server/listener/WindowListener.java +++ b/src/main/java/net/minestom/server/listener/WindowListener.java @@ -100,7 +100,7 @@ public class WindowListener { public static void closeWindowListener(ClientCloseWindow packet, Player player) { // if windowId == 0 then it is player's inventory, meaning that they hadn't been any open inventory packet - InventoryCloseEvent inventoryCloseEvent = new InventoryCloseEvent(player, player.getOpenInventory()); + InventoryCloseEvent inventoryCloseEvent = new InventoryCloseEvent(player.getOpenInventory(), player); player.callEvent(InventoryCloseEvent.class, inventoryCloseEvent); player.closeInventory(); diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index dfd66805b..73d870828 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -21,15 +21,16 @@ import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.CustomBlock; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryType; +import net.minestom.server.inventory.PlayerInventory; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; import net.minestom.server.network.ConnectionManager; -import net.minestom.server.network.packet.server.play.EffectPacket; import net.minestom.server.network.packet.server.play.PlayerListHeaderAndFooterPacket; import net.minestom.server.ping.ResponseDataConsumer; import net.minestom.server.utils.PacketUtils; import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; +import net.minestom.server.utils.inventory.PlayerInventoryUtils; import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.world.DimensionType; @@ -113,7 +114,7 @@ public class PlayerInit { GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { - final Entity source = event.getSource(); + final Entity source = event.getEntity(); final Entity entity = event.getTarget(); if (entity instanceof EntityCreature) { EntityCreature creature = (EntityCreature) entity; @@ -202,17 +203,27 @@ public class PlayerInit { player.getInventory().addInventoryCondition((p, slot, clickType, inventoryConditionResult) -> { if (slot == -999) return; - ItemStack itemStack = p.getInventory().getItemStack(slot); - System.out.println("test " + itemStack.getIdentifier() + " " + itemStack.getData()); + //ItemStack itemStack = p.getInventory().getItemStack(slot); + //System.out.println("test " + itemStack.getIdentifier() + " " + itemStack.getData()); }); }); globalEventHandler.addEventCallback(PlayerSpawnEvent.class, event -> { final Player player = event.getPlayer(); - player.setGameMode(GameMode.CREATIVE); + player.setGameMode(GameMode.SURVIVAL); + PlayerInventory inventory = player.getInventory(); ItemStack itemStack = new ItemStack(Material.STONE, (byte) 64); - player.getInventory().addItemStack(itemStack); + inventory.addItemStack(itemStack); + + { + ItemStack item = new ItemStack(Material.DIAMOND_CHESTPLATE, (byte) 1); + inventory.setChestplate(item); + item.setDisplayName(ColoredText.of("test")); + + inventory.refreshSlot((short) PlayerInventoryUtils.CHESTPLATE_SLOT); + + } //player.getInventory().addItemStack(new ItemStack(Material.STONE, (byte) 32)); }); From ed46bd0dc2681a3220a280c3dfa6a7e3d938ac25 Mon Sep 17 00:00:00 2001 From: themode Date: Wed, 16 Dec 2020 03:51:13 +0100 Subject: [PATCH 18/19] Annotation in InventoryClickProcessor --- .../server/inventory/click/InventoryClickProcessor.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java index 6c4caa498..c6b2eb5f5 100644 --- a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java +++ b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java @@ -491,6 +491,7 @@ public class InventoryClickProcessor { return clickResult; } + @NotNull private InventoryClickResult startCondition(@NotNull InventoryClickResult clickResult, @Nullable Inventory inventory, @NotNull Player player, int slot, @NotNull ClickType clickType, ItemStack clicked, ItemStack cursor) { @@ -559,6 +560,7 @@ public class InventoryClickProcessor { return clickResult; } + @NotNull private InventoryClickResult startCondition(@Nullable Inventory inventory, @NotNull Player player, int slot, @NotNull ClickType clickType, ItemStack clicked, ItemStack cursor) { final InventoryClickResult clickResult = new InventoryClickResult(clicked, cursor); From 8b515e868624f3a407bc8258e859c930b17bcf5c Mon Sep 17 00:00:00 2001 From: themode Date: Thu, 17 Dec 2020 00:47:52 +0100 Subject: [PATCH 19/19] Fix DARK_CYAN color --- src/main/java/net/minestom/server/chat/ChatColor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/chat/ChatColor.java b/src/main/java/net/minestom/server/chat/ChatColor.java index 794d92363..60b6f935c 100644 --- a/src/main/java/net/minestom/server/chat/ChatColor.java +++ b/src/main/java/net/minestom/server/chat/ChatColor.java @@ -32,7 +32,7 @@ public final class ChatColor { public static final ChatColor BLACK = fromRGB((byte) 0, (byte) 0, (byte) 0, 0, "black"); public static final ChatColor DARK_BLUE = fromRGB((byte) 0, (byte) 0, (byte) 170, 1, "dark_blue"); public static final ChatColor DARK_GREEN = fromRGB((byte) 0, (byte) 170, (byte) 0, 2, "dark_green"); - public static final ChatColor DARK_CYAN = fromRGB((byte) 0, (byte) 170, (byte) 170, 3, "dark_cyan"); + public static final ChatColor DARK_CYAN = fromRGB((byte) 0, (byte) 170, (byte) 170, 3, "dark_aqua"); public static final ChatColor DARK_RED = fromRGB((byte) 170, (byte) 0, (byte) 0, 4, "dark_red"); public static final ChatColor PURPLE = fromRGB((byte) 170, (byte) 0, (byte) 170, 5, "dark_purple"); public static final ChatColor GOLD = fromRGB((byte) 255, (byte) 170, (byte) 0, 6, "gold");