From a6f02789d826e9b77ae4dddf16b4535f26aba2b5 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Thu, 24 Oct 2024 08:35:03 +0200 Subject: [PATCH 01/26] Fix blocks only harvestable with tool not dropping item on last tool use (#108) --- .../java/net/minecraft/server/ItemInWorldManager.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraft/server/ItemInWorldManager.java b/src/main/java/net/minecraft/server/ItemInWorldManager.java index 0fa0f5b0..ff1824ad 100644 --- a/src/main/java/net/minecraft/server/ItemInWorldManager.java +++ b/src/main/java/net/minecraft/server/ItemInWorldManager.java @@ -177,6 +177,11 @@ public boolean c(int i, int j, int k) { boolean flag = this.b(i, j, k); ItemStack itemstack = this.player.G(); + if (flag && this.player.b(Block.byId[l])) { + Block.byId[l].a(this.world, this.player, i, j, k, i1); + ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); + } + if (itemstack != null) { itemstack.a(l, i, j, k, this.player); if (itemstack.count == 0) { @@ -185,11 +190,6 @@ public boolean c(int i, int j, int k) { } } - if (flag && this.player.b(Block.byId[l])) { - Block.byId[l].a(this.world, this.player, i, j, k, i1); - ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); - } - return flag; } From 8eeae13f5e66932fe77d0e562352ee3046e84d6c Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Wed, 30 Oct 2024 15:40:42 +0100 Subject: [PATCH 02/26] Fix Moving Piston Merge Transmutation (hopefully) --- src/main/java/net/minecraft/server/Block.java | 3 +++ .../net/minecraft/server/BlockRedstoneTorch.java | 12 ++++++------ src/main/java/net/minecraft/server/BlockTorch.java | 1 + src/main/java/net/minecraft/server/Chunk.java | 3 +-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java index 80d873a2..bf0e8300 100644 --- a/src/main/java/net/minecraft/server/Block.java +++ b/src/main/java/net/minecraft/server/Block.java @@ -299,6 +299,9 @@ public float getDamage(EntityHuman entityhuman) { public final void g(World world, int i, int j, int k, int l) { this.dropNaturally(world, i, j, k, l, 1.0F); + if (this instanceof BlockRedstoneTorch) { + world.setTypeId(i, j, k, 0); + } } public void dropNaturally(World world, int i, int j, int k, int l, float f) { diff --git a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java index ce9cff2f..bdc7d984 100644 --- a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java +++ b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java @@ -63,12 +63,12 @@ public void c(World world, int i, int j, int k) { public void remove(World world, int i, int j, int k) { if (this.isOn) { - world.applyPhysics(i, j - 1, k, this.id); - world.applyPhysics(i, j + 1, k, this.id); - world.applyPhysics(i - 1, j, k, this.id); - world.applyPhysics(i + 1, j, k, this.id); - world.applyPhysics(i, j, k - 1, this.id); - world.applyPhysics(i, j, k + 1, this.id); + if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i, j - 1, k, this.id); + if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i, j + 1, k, this.id); + if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i - 1, j, k, this.id); + if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i + 1, j, k, this.id); + if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i, j, k - 1, this.id); + if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i, j, k + 1, this.id); } } diff --git a/src/main/java/net/minecraft/server/BlockTorch.java b/src/main/java/net/minecraft/server/BlockTorch.java index 45e14a0e..4d1c6f6e 100644 --- a/src/main/java/net/minecraft/server/BlockTorch.java +++ b/src/main/java/net/minecraft/server/BlockTorch.java @@ -30,6 +30,7 @@ public boolean canPlace(World world, int i, int j, int k) { } public void postPlace(World world, int i, int j, int k, int l) { + if (world.getTypeId(i, j, k) != this.id) return; int i1 = world.getData(i, j, k); if (l == 1 && this.g(world, i, j - 1, k)) { diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java index a113dd38..09bf2944 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java @@ -233,11 +233,11 @@ public boolean a(int i, int j, int k, int l, int i1) { int i2 = this.z * 16 + k; this.b[i << 11 | k << 7 | j] = (byte) (b0 & 255); + this.e.a(i, j, k, i1); if (k1 != 0 && !this.world.isStatic) { Block.byId[k1].remove(this.world, l1, j, i2); } - this.e.a(i, j, k, i1); if (!this.world.worldProvider.e) { if (Block.q[b0 & 255] != 0) { if (j >= j1) { @@ -252,7 +252,6 @@ public boolean a(int i, int j, int k, int l, int i1) { this.world.a(EnumSkyBlock.BLOCK, l1, j, i2, l1, j, i2); this.c(i, k); - this.e.a(i, j, k, i1); if (l != 0) { Block.byId[l].c(this.world, l1, j, i2); } From 6ab7191209a0a08280f7b6052ede008e7a1f5801 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Wed, 30 Oct 2024 20:19:07 +0100 Subject: [PATCH 03/26] Remove unnecessary check --- src/main/java/net/minecraft/server/Block.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java index bf0e8300..80d873a2 100644 --- a/src/main/java/net/minecraft/server/Block.java +++ b/src/main/java/net/minecraft/server/Block.java @@ -299,9 +299,6 @@ public float getDamage(EntityHuman entityhuman) { public final void g(World world, int i, int j, int k, int l) { this.dropNaturally(world, i, j, k, l, 1.0F); - if (this instanceof BlockRedstoneTorch) { - world.setTypeId(i, j, k, 0); - } } public void dropNaturally(World world, int i, int j, int k, int l, float f) { From ef3e9067b2c53ecb0bc03bcd3ff42a722eebfcd5 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Thu, 31 Oct 2024 15:30:06 +0100 Subject: [PATCH 04/26] Fix a variety of exploits --- src/main/java/net/minecraft/server/BlockPiston.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/BlockPiston.java b/src/main/java/net/minecraft/server/BlockPiston.java index 37a55ecb..9bd01a71 100644 --- a/src/main/java/net/minecraft/server/BlockPiston.java +++ b/src/main/java/net/minecraft/server/BlockPiston.java @@ -340,7 +340,7 @@ private boolean i(World world, int i, int j, int k, int l) { } Block.byId[i2].g(world, i1, j1, k1, world.getData(i1, j1, k1)); - world.setTypeId(i1, j1, k1, 0); + world.setRawTypeId(i1, j1, k1, 0); } } From 9c5c70f8f7f17af74804d7be14c6a45039471b18 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Thu, 31 Oct 2024 20:24:54 +0100 Subject: [PATCH 05/26] Fix methods to obtain six-sided pistons --- src/main/java/net/minecraft/server/ItemBlock.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java index 34253666..0a0ddba2 100644 --- a/src/main/java/net/minecraft/server/ItemBlock.java +++ b/src/main/java/net/minecraft/server/ItemBlock.java @@ -101,6 +101,10 @@ public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int return true; } + if (this.id == 29 || this.id == 33) { + Block.byId[this.id].postPlace(world, i, j, k, l); + Block.byId[this.id].postPlace(world, i, j, k, entityhuman); + } world.update(i, j, k, this.id); // <-- world.setTypeIdAndData does this on success (tell the world) // CraftBukkit end From a6989c22b92dcf7a9490bdafc2b02f2f1aa576a9 Mon Sep 17 00:00:00 2001 From: 4ukai Date: Fri, 1 Nov 2024 05:52:34 +0200 Subject: [PATCH 06/26] Add chest open event --- .../event/inventory/ChestOpenedEvent.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/org/bukkit/event/inventory/ChestOpenedEvent.java diff --git a/src/main/java/org/bukkit/event/inventory/ChestOpenedEvent.java b/src/main/java/org/bukkit/event/inventory/ChestOpenedEvent.java new file mode 100644 index 00000000..1ac14967 --- /dev/null +++ b/src/main/java/org/bukkit/event/inventory/ChestOpenedEvent.java @@ -0,0 +1,34 @@ +package org.bukkit.event.inventory; + +import net.minecraft.server.ItemStack; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; + +public class ChestOpenedEvent extends Event implements Cancellable { + private boolean cancelled; + private Player player; + private ItemStack[] contents; + + public ChestOpenedEvent(Player player, ItemStack[] contents) { + super(Type.CHEST_OPENED); + this.player = player; + this.contents = contents; + } + + public Player getPlayer() { + return player; + } + + public ItemStack[] getContents() { + return contents; + } + + public boolean isCancelled() { + return cancelled; + } + + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} From cd2b0b3a250f03e0b0fbf4d015ea39333f856f5e Mon Sep 17 00:00:00 2001 From: 4ukai Date: Fri, 1 Nov 2024 05:52:34 +0200 Subject: [PATCH 07/26] Add chest open event --- .../net/minecraft/server/EntityPlayer.java | 8 ++++- src/main/java/org/bukkit/event/Event.java | 3 +- .../event/inventory/ChestOpenedEvent.java | 34 +++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/bukkit/event/inventory/ChestOpenedEvent.java diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java index 4f880608..46b439fe 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java @@ -7,8 +7,8 @@ import org.bukkit.craftbukkit.ChunkCompressionThread; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; +import org.bukkit.event.inventory.ChestOpenedEvent; import java.util.*; @@ -456,6 +456,12 @@ public void b(int i, int j, int k) { public void a(IInventory iinventory) { this.ai(); + // Poseidon start + ChestOpenedEvent event = new ChestOpenedEvent((org.bukkit.entity.Player) this.getBukkitEntity(), iinventory.getContents()); + this.world.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) return; + // Poseidon end + this.netServerHandler.sendPacket(new Packet100OpenWindow(this.bO, 0, iinventory.getName(), iinventory.getSize())); this.activeContainer = new ContainerChest(this.inventory, iinventory); this.activeContainer.windowId = this.bO; diff --git a/src/main/java/org/bukkit/event/Event.java b/src/main/java/org/bukkit/event/Event.java index 9bdaaec0..3d73d806 100644 --- a/src/main/java/org/bukkit/event/Event.java +++ b/src/main/java/org/bukkit/event/Event.java @@ -140,7 +140,7 @@ public enum Category { /** * Provides a lookup for all core events * - * @see org.bukkit.event. + * @see org.bukkit.event */ public enum Type { @@ -154,6 +154,7 @@ public enum Type { PACKET_RECEIVED(Category.PACKET), + CHEST_OPENED(Category.BLOCK), /** * Called when a player first starts their connection. Called before UUID is known. diff --git a/src/main/java/org/bukkit/event/inventory/ChestOpenedEvent.java b/src/main/java/org/bukkit/event/inventory/ChestOpenedEvent.java new file mode 100644 index 00000000..1ac14967 --- /dev/null +++ b/src/main/java/org/bukkit/event/inventory/ChestOpenedEvent.java @@ -0,0 +1,34 @@ +package org.bukkit.event.inventory; + +import net.minecraft.server.ItemStack; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; + +public class ChestOpenedEvent extends Event implements Cancellable { + private boolean cancelled; + private Player player; + private ItemStack[] contents; + + public ChestOpenedEvent(Player player, ItemStack[] contents) { + super(Type.CHEST_OPENED); + this.player = player; + this.contents = contents; + } + + public Player getPlayer() { + return player; + } + + public ItemStack[] getContents() { + return contents; + } + + public boolean isCancelled() { + return cancelled; + } + + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} From 1e43025dd331273e3805633bb043b79ee9add67b Mon Sep 17 00:00:00 2001 From: 4ukai Date: Fri, 1 Nov 2024 05:55:13 +0200 Subject: [PATCH 08/26] Small cleanup --- src/main/java/net/minecraft/server/IInventory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/IInventory.java b/src/main/java/net/minecraft/server/IInventory.java index bb6ce82f..67fc6924 100644 --- a/src/main/java/net/minecraft/server/IInventory.java +++ b/src/main/java/net/minecraft/server/IInventory.java @@ -18,5 +18,5 @@ public interface IInventory { boolean a_(EntityHuman entityhuman); - public abstract ItemStack[] getContents(); // CraftBukkit + ItemStack[] getContents(); // CraftBukkit } From a79ae35459a267c14bafc9c8ee6b70dd0968ab64 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Sun, 3 Nov 2024 21:38:12 +0100 Subject: [PATCH 09/26] Clean up if statements --- .../net/minecraft/server/BlockRedstoneTorch.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java index bdc7d984..34974e70 100644 --- a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java +++ b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java @@ -62,13 +62,13 @@ public void c(World world, int i, int j, int k) { } public void remove(World world, int i, int j, int k) { - if (this.isOn) { - if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i, j - 1, k, this.id); - if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i, j + 1, k, this.id); - if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i - 1, j, k, this.id); - if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i + 1, j, k, this.id); - if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i, j, k - 1, this.id); - if (world.getTypeId(i, j, k) == this.id) world.applyPhysics(i, j, k + 1, this.id); + if (this.isOn && world.getTypeId(i, j, k) == this.id) { + world.applyPhysics(i, j - 1, k, this.id); + world.applyPhysics(i, j + 1, k, this.id); + world.applyPhysics(i - 1, j, k, this.id); + world.applyPhysics(i + 1, j, k, this.id); + world.applyPhysics(i, j, k - 1, this.id); + world.applyPhysics(i, j, k + 1, this.id); } } From 9375bb8ea22592f6b14b62c22fe1ae39c3638746 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:25:56 +0100 Subject: [PATCH 10/26] Fix an oversight --- src/main/java/net/minecraft/server/ItemBlock.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java index 0a0ddba2..7a0a82ef 100644 --- a/src/main/java/net/minecraft/server/ItemBlock.java +++ b/src/main/java/net/minecraft/server/ItemBlock.java @@ -1,6 +1,7 @@ package net.minecraft.server; // CraftBukkit start +import org.bukkit.Bukkit; import org.bukkit.craftbukkit.block.CraftBlockState; import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.event.block.BlockPlaceEvent; @@ -101,16 +102,18 @@ public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int return true; } + // CraftBukkit end + if (this.id == 29 || this.id == 33) { Block.byId[this.id].postPlace(world, i, j, k, l); Block.byId[this.id].postPlace(world, i, j, k, entityhuman); + world.update(i, j, k, this.id); // <-- world.setTypeIdAndData does this on success (tell the world) + } else { + world.update(i, j, k, this.id); + Block.byId[this.id].postPlace(world, i, j, k, l); + Block.byId[this.id].postPlace(world, i, j, k, entityhuman); } - world.update(i, j, k, this.id); // <-- world.setTypeIdAndData does this on success (tell the world) - - // CraftBukkit end - Block.byId[this.id].postPlace(world, i, j, k, l); - Block.byId[this.id].postPlace(world, i, j, k, entityhuman); world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), block.stepSound.getName(), (block.stepSound.getVolume1() + 1.0F) / 2.0F, block.stepSound.getVolume2() * 0.8F); --itemstack.count; } From 2b0c45d8f4e71b6dfbb74c4dbd5f51c473ac6f64 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:26:52 +0100 Subject: [PATCH 11/26] oops --- src/main/java/net/minecraft/server/ItemBlock.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java index 7a0a82ef..04ee413d 100644 --- a/src/main/java/net/minecraft/server/ItemBlock.java +++ b/src/main/java/net/minecraft/server/ItemBlock.java @@ -1,7 +1,6 @@ package net.minecraft.server; // CraftBukkit start -import org.bukkit.Bukkit; import org.bukkit.craftbukkit.block.CraftBlockState; import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.event.block.BlockPlaceEvent; From f6d83a83c243b68c258e83803611af2d0ad17f14 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Sat, 23 Nov 2024 13:17:57 +0100 Subject: [PATCH 12/26] Fix a method of duping redstone torches --- src/main/java/net/minecraft/server/BlockTorch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/BlockTorch.java b/src/main/java/net/minecraft/server/BlockTorch.java index 4d1c6f6e..ed9a6ac0 100644 --- a/src/main/java/net/minecraft/server/BlockTorch.java +++ b/src/main/java/net/minecraft/server/BlockTorch.java @@ -112,7 +112,7 @@ public void doPhysics(World world, int i, int j, int k, int l) { } private boolean h(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k)) { + if (!this.canPlace(world, i, j, k) && world.getTypeId(i, j, k) == this.id) { this.g(world, i, j, k, world.getData(i, j, k)); world.setTypeId(i, j, k, 0); return false; From 133400044bfcbe62fdb82a064c0cb40e13c452eb Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Sat, 23 Nov 2024 19:11:24 +0100 Subject: [PATCH 13/26] (Hopefully) fix sand/gravel duping methods --- src/main/java/net/minecraft/server/BlockSand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/minecraft/server/BlockSand.java b/src/main/java/net/minecraft/server/BlockSand.java index 90abdf2b..b0bc035f 100644 --- a/src/main/java/net/minecraft/server/BlockSand.java +++ b/src/main/java/net/minecraft/server/BlockSand.java @@ -27,6 +27,7 @@ private void g(World world, int i, int j, int k) { byte b0 = 32; if (!instaFall && world.a(i - b0, j - b0, k - b0, i + b0, j + b0, k + b0)) { + world.setTypeId(i, j, k, 0); EntityFallingSand entityfallingsand = new EntityFallingSand(world, i + 0.5D, j + 0.5D, k + 0.5D, this.id); world.addEntity(entityfallingsand); From a06741f6fd3f57280a786646c6de75cbee9ecc85 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Sat, 23 Nov 2024 20:35:08 +0100 Subject: [PATCH 14/26] Fix an oversight --- src/main/java/net/minecraft/server/BlockRedstoneTorch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java index 34974e70..73b5d136 100644 --- a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java +++ b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java @@ -62,7 +62,7 @@ public void c(World world, int i, int j, int k) { } public void remove(World world, int i, int j, int k) { - if (this.isOn && world.getTypeId(i, j, k) == this.id) { + if (this.isOn && (world.getTypeId(i, j, k) == this.id || world.getTypeId(i, j, k) == 75)) { world.applyPhysics(i, j - 1, k, this.id); world.applyPhysics(i, j + 1, k, this.id); world.applyPhysics(i - 1, j, k, this.id); From 5747a8a54d3377a37c80f73abd0f6095c9ac8d06 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Sun, 24 Nov 2024 17:10:24 +0100 Subject: [PATCH 15/26] Fix extended sticky pistons not dropping when broken at the piston head --- src/main/java/net/minecraft/server/BlockPistonExtension.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/BlockPistonExtension.java b/src/main/java/net/minecraft/server/BlockPistonExtension.java index 8a1ae401..04f9ba34 100644 --- a/src/main/java/net/minecraft/server/BlockPistonExtension.java +++ b/src/main/java/net/minecraft/server/BlockPistonExtension.java @@ -16,7 +16,7 @@ public BlockPistonExtension(int i, int j) { public void remove(World world, int i, int j, int k) { super.remove(world, i, j, k); int l = world.getData(i, j, k); - if (l > 5 || l < 0) return; // CraftBukkit - fixed a piston AIOOBE issue. + if (l < 0 || l == 6 || l == 7 || l > 13) return; // CraftBukkit - fixed a piston AIOOBE issue. int i1 = PistonBlockTextures.a[b(l)]; i += PistonBlockTextures.b[i1]; From f22fa8d44bca14a7de400b3132558aebed4993a3 Mon Sep 17 00:00:00 2001 From: Rhys B Date: Mon, 25 Nov 2024 18:30:04 +1000 Subject: [PATCH 16/26] Revert "Fix for issue #98 (Player#getInventory#getArmorContents is always AIR)" (#112) This change is being reverted as it can cause weird duplication issues with the inventory slots when players rejoin the game. --- .../inventory/CraftInventoryPlayer.java | 35 +++++-------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java index 471a4251..5a0b6445 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java @@ -1,12 +1,9 @@ package org.bukkit.craftbukkit.inventory; import net.minecraft.server.InventoryPlayer; -import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import java.util.ArrayList; - public class CraftInventoryPlayer extends CraftInventory implements PlayerInventory { public CraftInventoryPlayer(net.minecraft.server.InventoryPlayer inventory) { super(inventory); @@ -45,7 +42,7 @@ public ItemStack getLeggings() { } public ItemStack getBoots() { - return getItem(getSize()); + return getItem(getSize() + 0); } public void setHelmet(ItemStack helmet) { @@ -61,33 +58,17 @@ public void setLeggings(ItemStack leggings) { } public void setBoots(ItemStack boots) { - setItem(getSize(), boots); + setItem(getSize() + 0, boots); } - public ItemStack[] getArmorContents() { - ArrayList contents = new ArrayList<>(); - - ItemStack boots = getItem(getSize()); - if (boots != null && boots.getType() != Material.AIR) { - contents.add(boots); - } - - ItemStack leggings = getItem(getSize() + 1); - if (leggings != null && leggings.getType() != Material.AIR) { - contents.add(leggings); - } - - ItemStack chestplate = getItem(getSize() + 2); - if (chestplate != null && chestplate.getType() != Material.AIR) { - contents.add(chestplate); - } + public CraftItemStack[] getArmorContents() { + net.minecraft.server.ItemStack[] mcItems = getInventory().getArmorContents(); + CraftItemStack[] ret = new CraftItemStack[mcItems.length]; - ItemStack helmet = getItem(getSize() + 3); - if (helmet != null && helmet.getType() != Material.AIR) { - contents.add(helmet); + for (int i = 0; i < mcItems.length; i++) { + ret[i] = new CraftItemStack(mcItems[i]); } - - return contents.toArray(new ItemStack[0]); + return ret; } public void setArmorContents(ItemStack[] items) { From aae8b735e4de02e98fd84d6ecc0840cf1c0bad48 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Wed, 27 Nov 2024 15:13:28 +0100 Subject: [PATCH 17/26] Make piston fixes toggleable --- .../legacyminecraft/poseidon/PoseidonConfig.java | 6 ++++++ .../java/net/minecraft/server/BlockPiston.java | 6 +++++- .../net/minecraft/server/BlockRedstoneTorch.java | 3 ++- src/main/java/net/minecraft/server/BlockSand.java | 6 +++++- .../java/net/minecraft/server/BlockTorch.java | 6 ++++-- src/main/java/net/minecraft/server/Chunk.java | 15 ++++++++++++--- src/main/java/net/minecraft/server/ItemBlock.java | 3 ++- 7 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/legacyminecraft/poseidon/PoseidonConfig.java b/src/main/java/com/legacyminecraft/poseidon/PoseidonConfig.java index 0a449fdb..16c3fe5d 100644 --- a/src/main/java/com/legacyminecraft/poseidon/PoseidonConfig.java +++ b/src/main/java/com/legacyminecraft/poseidon/PoseidonConfig.java @@ -134,6 +134,12 @@ private void write() { generateConfigOption("world.settings.block-tree-growth.info", "This setting allows for server owners to easily block trees growing from automatically destroying certain blocks. The list must be a string with numerical item ids separated by commas."); generateConfigOption("world.settings.block-pistons-pushing-furnaces.info", "This workaround prevents pistons from pushing furnaces which prevents a malicious server crash."); generateConfigOption("world.settings.block-pistons-pushing-furnaces.enabled", true); + generateConfigOption("world.settings.pistons.transmutation-fix.enabled", true); + generateConfigOption("world.settings.pistons.transmutation-fix.info", "This setting fixes block transmutation exploits."); + generateConfigOption("world.settings.pistons.sand-gravel-duping-fix.enabled", true); + generateConfigOption("world.settings.pistons.sand-gravel-duping-fix.info", "This setting fixes sand/gravel duplication exploits."); + generateConfigOption("world.settings.pistons.other-fixes.enabled", true); + generateConfigOption("world.settings.pistons.other-fixes.info", "This setting fixes various other piston exploits like creating illegal pistons, breaking bedrock and duplicating redstone torches."); generateConfigOption("world.settings.skeleton-shooting-sound-fix.info", "This setting fixes the sound of skeletons and players shooting not playing on clients."); generateConfigOption("world.settings.skeleton-shooting-sound-fix.enabled", true); generateConfigOption("world.settings.speed-hack-check.enable", true); diff --git a/src/main/java/net/minecraft/server/BlockPiston.java b/src/main/java/net/minecraft/server/BlockPiston.java index 9bd01a71..c5aa8185 100644 --- a/src/main/java/net/minecraft/server/BlockPiston.java +++ b/src/main/java/net/minecraft/server/BlockPiston.java @@ -340,7 +340,11 @@ private boolean i(World world, int i, int j, int k, int l) { } Block.byId[i2].g(world, i1, j1, k1, world.getData(i1, j1, k1)); - world.setRawTypeId(i1, j1, k1, 0); + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.other-fixes.enabled", true)) { + world.setRawTypeId(i1, j1, k1, 0); + } else { + world.setTypeId(i1, j1, k1, 0); + } } } diff --git a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java index 73b5d136..fa06134a 100644 --- a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java +++ b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java @@ -1,5 +1,6 @@ package net.minecraft.server; +import com.legacyminecraft.poseidon.PoseidonConfig; import org.bukkit.event.block.BlockRedstoneEvent; import java.util.ArrayList; @@ -62,7 +63,7 @@ public void c(World world, int i, int j, int k) { } public void remove(World world, int i, int j, int k) { - if (this.isOn && (world.getTypeId(i, j, k) == this.id || world.getTypeId(i, j, k) == 75)) { + if (this.isOn && (!PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.transmutation-fix.enabled", true) || world.getTypeId(i, j, k) == this.id || world.getTypeId(i, j, k) == 75)) { world.applyPhysics(i, j - 1, k, this.id); world.applyPhysics(i, j + 1, k, this.id); world.applyPhysics(i - 1, j, k, this.id); diff --git a/src/main/java/net/minecraft/server/BlockSand.java b/src/main/java/net/minecraft/server/BlockSand.java index b0bc035f..d6532289 100644 --- a/src/main/java/net/minecraft/server/BlockSand.java +++ b/src/main/java/net/minecraft/server/BlockSand.java @@ -1,5 +1,7 @@ package net.minecraft.server; +import com.legacyminecraft.poseidon.PoseidonConfig; + import java.util.Random; public class BlockSand extends Block { @@ -27,7 +29,9 @@ private void g(World world, int i, int j, int k) { byte b0 = 32; if (!instaFall && world.a(i - b0, j - b0, k - b0, i + b0, j + b0, k + b0)) { - world.setTypeId(i, j, k, 0); + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.sand-gravel-duping-fix.enabled", true)) { + world.setTypeId(i, j, k, 0); + } EntityFallingSand entityfallingsand = new EntityFallingSand(world, i + 0.5D, j + 0.5D, k + 0.5D, this.id); world.addEntity(entityfallingsand); diff --git a/src/main/java/net/minecraft/server/BlockTorch.java b/src/main/java/net/minecraft/server/BlockTorch.java index ed9a6ac0..68b513e3 100644 --- a/src/main/java/net/minecraft/server/BlockTorch.java +++ b/src/main/java/net/minecraft/server/BlockTorch.java @@ -1,5 +1,7 @@ package net.minecraft.server; +import com.legacyminecraft.poseidon.PoseidonConfig; + import java.util.Random; public class BlockTorch extends Block { @@ -30,7 +32,7 @@ public boolean canPlace(World world, int i, int j, int k) { } public void postPlace(World world, int i, int j, int k, int l) { - if (world.getTypeId(i, j, k) != this.id) return; + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.transmutation-fix.enabled", true) && world.getTypeId(i, j, k) != this.id) return; int i1 = world.getData(i, j, k); if (l == 1 && this.g(world, i, j - 1, k)) { @@ -112,7 +114,7 @@ public void doPhysics(World world, int i, int j, int k, int l) { } private boolean h(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k) && world.getTypeId(i, j, k) == this.id) { + if (!this.canPlace(world, i, j, k) && (!PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.other-fixes.enabled") || world.getTypeId(i, j, k) == this.id)) { this.g(world, i, j, k, world.getData(i, j, k)); world.setTypeId(i, j, k, 0); return false; diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java index 09bf2944..8f095d44 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java @@ -1,5 +1,7 @@ package net.minecraft.server; +import com.legacyminecraft.poseidon.PoseidonConfig; + import java.util.*; public class Chunk { @@ -233,9 +235,16 @@ public boolean a(int i, int j, int k, int l, int i1) { int i2 = this.z * 16 + k; this.b[i << 11 | k << 7 | j] = (byte) (b0 & 255); - this.e.a(i, j, k, i1); - if (k1 != 0 && !this.world.isStatic) { - Block.byId[k1].remove(this.world, l1, j, i2); + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.transmutation-fix.enabled", true)) { + this.e.a(i, j, k, i1); + if (k1 != 0 && !this.world.isStatic) { + Block.byId[k1].remove(this.world, l1, j, i2); + } + } else { + if (k1 != 0 && !this.world.isStatic) { + Block.byId[k1].remove(this.world, l1, j, i2); + } + this.e.a(i, j, k, i1); } if (!this.world.worldProvider.e) { diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java index 04ee413d..b6277465 100644 --- a/src/main/java/net/minecraft/server/ItemBlock.java +++ b/src/main/java/net/minecraft/server/ItemBlock.java @@ -1,6 +1,7 @@ package net.minecraft.server; // CraftBukkit start +import com.legacyminecraft.poseidon.PoseidonConfig; import org.bukkit.craftbukkit.block.CraftBlockState; import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.event.block.BlockPlaceEvent; @@ -103,7 +104,7 @@ public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int } // CraftBukkit end - if (this.id == 29 || this.id == 33) { + if (PoseidonConfig.getInstance().getConfigBoolean("world.settings.pistons.other-fixes.enabled", true) && (this.id == 29 || this.id == 33)) { Block.byId[this.id].postPlace(world, i, j, k, l); Block.byId[this.id].postPlace(world, i, j, k, entityhuman); world.update(i, j, k, this.id); // <-- world.setTypeIdAndData does this on success (tell the world) From 547feeb7ff4e24e767b96d4dd4e7563df0c10143 Mon Sep 17 00:00:00 2001 From: Rhys B Date: Sun, 1 Dec 2024 11:48:44 +1000 Subject: [PATCH 18/26] Resolve issues with Event IgnoreCancelled annotation being ignored --- .../org/bukkit/plugin/RegisteredListener.java | 25 +++++++++++++------ .../bukkit/plugin/java/JavaPluginLoader.java | 2 +- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/bukkit/plugin/RegisteredListener.java b/src/main/java/org/bukkit/plugin/RegisteredListener.java index 46d054f1..8a3207f2 100644 --- a/src/main/java/org/bukkit/plugin/RegisteredListener.java +++ b/src/main/java/org/bukkit/plugin/RegisteredListener.java @@ -1,5 +1,6 @@ package org.bukkit.plugin; +import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.Listener; @@ -11,19 +12,22 @@ public class RegisteredListener { private final Event.Priority priority; private final Plugin plugin; private final EventExecutor executor; + private final boolean ignoreCancelled; public RegisteredListener(final Listener pluginListener, final EventExecutor eventExecutor, final Event.Priority eventPriority, final Plugin registeredPlugin) { - listener = pluginListener; - priority = eventPriority; - plugin = registeredPlugin; - executor = eventExecutor; + this(pluginListener, eventExecutor, eventPriority, registeredPlugin, false); + } + + public RegisteredListener(final Listener pluginListener, final EventExecutor eventExecutor, final Event.Priority eventPriority, final Plugin registeredPlugin, final boolean ignoreCancelled) { + this.listener = pluginListener; + this.priority = eventPriority; + this.plugin = registeredPlugin; + this.executor = eventExecutor; + this.ignoreCancelled = ignoreCancelled; } public RegisteredListener(final Listener pluginListener, final Event.Priority eventPriority, final Plugin registeredPlugin, Event.Type type) { - listener = pluginListener; - priority = eventPriority; - plugin = registeredPlugin; - executor = registeredPlugin.getPluginLoader().createExecutor(type, pluginListener); + this(pluginListener, registeredPlugin.getPluginLoader().createExecutor(type, pluginListener), eventPriority, registeredPlugin, false); } public void registerAll() { @@ -59,6 +63,11 @@ public Event.Priority getPriority() { * @return Registered Priority */ public void callEvent(Event event) { + if(event instanceof Cancellable) { + if(((Cancellable) event).isCancelled() && ignoreCancelled) { + return; + } + } executor.execute(listener, event); } } diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index 06800d4f..6ff0e708 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -272,7 +272,7 @@ public Map, Set> createRegisteredList e.printStackTrace(); } }; - eventSet.add(new RegisteredListener(listener, executor, eh.priority(), plugin)); + eventSet.add(new RegisteredListener(listener, executor, eh.priority(), plugin, eh.ignoreCancelled())); } return ret; } From 9af8b5239ada93a535c5dc3fe4a38cfb8388fd19 Mon Sep 17 00:00:00 2001 From: Rhys B Date: Wed, 4 Dec 2024 11:03:31 +1000 Subject: [PATCH 19/26] GitHub Action: Release per commit to master --- .github/workflows/release.yml | 65 +++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..cdb547d7 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,65 @@ +name: Release JAR on Push to Main + +on: + push: + branches: + - main + - master + +jobs: + build-and-release: + runs-on: ubuntu-latest + + steps: + # Step 1: Checkout the repository + - name: Checkout code + uses: actions/checkout@v3 + + # Step 2: Set up Java 8 + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '8' + + # Step 3: Extract POM version + - name: Extract POM Version + id: pom_version + run: | + VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) + echo "POM_VERSION=$VERSION" >> $GITHUB_ENV + + # Step 4: Get current date and SHA + - name: Generate Release Version + id: release_version + run: | + DATE=$(date +'%y%m%d') + SHA=$(echo $GITHUB_SHA | cut -c1-7) + VERSION="${POM_VERSION}--${DATE}-${SHA}" + echo "RELEASE_VERSION=$VERSION" >> $GITHUB_ENV + + # Step 5: Build the JAR + - name: Build JAR + run: mvn package + + # Step 6: Create Release + - name: Create Release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.RELEASE_VERSION }} + release_name: ${{ env.RELEASE_VERSION }} + draft: false + prerelease: false + + # Step 7: Upload the JAR as a Release Asset + - name: Upload JAR + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create-release.outputs.upload_url }} + asset_path: target/*.jar + asset_name: your-project-name-${{ env.RELEASE_VERSION }}.jar + asset_content_type: application/java-archive From 9266f3fdb18fc41ceb147a45b77c522930b9b279 Mon Sep 17 00:00:00 2001 From: Rhys B Date: Wed, 4 Dec 2024 11:14:49 +1000 Subject: [PATCH 20/26] Resolve issues with GitHub Action --- .github/workflows/release.yml | 70 +++++++++++++++++------------------ 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cdb547d7..4a47658a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release JAR on Push to Main +name: Release Workflow on: push: @@ -7,59 +7,55 @@ on: - master jobs: - build-and-release: + build: runs-on: ubuntu-latest steps: # Step 1: Checkout the repository - - name: Checkout code - uses: actions/checkout@v3 + - name: Checkout + uses: actions/checkout@v4 - # Step 2: Set up Java 8 - - name: Set up JDK 8 - uses: actions/setup-java@v3 + # Step 2: Set up JDK 1.8 + - name: Set up JDK 1.8 + uses: actions/setup-java@v2 with: distribution: 'temurin' - java-version: '8' + java-version: 8 - # Step 3: Extract POM version - - name: Extract POM Version - id: pom_version + # Step 3: Get the version from pom.xml + - name: Get the version from pom.xml + id: get_version + run: echo "PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV + + # Step 4: Fail if snapshot version + - name: Fail if snapshot version run: | - VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) - echo "POM_VERSION=$VERSION" >> $GITHUB_ENV + if [[ $PROJECT_VERSION == *"-SNAPSHOT"* ]]; then + echo "Snapshot versions are not releasable" + exit 0 + fi - # Step 4: Get current date and SHA + # Step 5: Generate custom release version - name: Generate Release Version id: release_version run: | DATE=$(date +'%y%m%d') SHA=$(echo $GITHUB_SHA | cut -c1-7) - VERSION="${POM_VERSION}--${DATE}-${SHA}" - echo "RELEASE_VERSION=$VERSION" >> $GITHUB_ENV + RELEASE_VERSION="${PROJECT_VERSION}-${DATE}-${SHA}" + echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV - # Step 5: Build the JAR - - name: Build JAR - run: mvn package + # Step 6: Build with Maven + - name: Build with Maven + run: mvn clean package - # Step 6: Create Release - - name: Create Release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Step 7: Create GitHub Release + - name: Create GitHub Release + if: ${{ !endsWith(env.PROJECT_VERSION, '-SNAPSHOT') }} + uses: softprops/action-gh-release@v1 with: tag_name: ${{ env.RELEASE_VERSION }} - release_name: ${{ env.RELEASE_VERSION }} - draft: false - prerelease: false - - # Step 7: Upload the JAR as a Release Asset - - name: Upload JAR - uses: actions/upload-release-asset@v1 + name: ${{ env.RELEASE_VERSION }} + files: | + target/*.jar env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - upload_url: ${{ steps.create-release.outputs.upload_url }} - asset_path: target/*.jar - asset_name: your-project-name-${{ env.RELEASE_VERSION }}.jar - asset_content_type: application/java-archive + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 498abba2b66c8316605e682e750c1de13235905c Mon Sep 17 00:00:00 2001 From: Rhys B Date: Wed, 4 Dec 2024 11:33:22 +1000 Subject: [PATCH 21/26] GitHub Actions: Test Java 17,21 and release artifacts Also update Readme page --- .github/workflows/build-and-test.yaml | 23 ++++++++------- .github/workflows/java21-buld-test.yaml | 39 +++++++++++++++++++++++++ README.md | 4 ++- 3 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/java21-buld-test.yaml diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index 30190534..20477039 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -1,4 +1,3 @@ ---- name: build-and-test on: pull_request: @@ -9,23 +8,21 @@ on: push: branches: - master + - main jobs: build: runs-on: ubuntu-latest - strategy: - matrix: - java-version: [ '8', '17' ] + steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - name: Set up Java ${{ matrix.java-version }} + - name: Set up JDK 1.8 uses: actions/setup-java@v2 with: - java-version: ${{ matrix.java-version }} - distribution: temurin - java-package: jdk + distribution: 'temurin' + java-version: 8 - name: Set up Maven uses: stCarolas/setup-maven@v4.5 @@ -35,4 +32,10 @@ jobs: - name: build application shell: bash run: | - mvn clean install \ No newline at end of file + mvn clean install + + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ github.event.repository.name }}-artifact + path: target/*.jar \ No newline at end of file diff --git a/.github/workflows/java21-buld-test.yaml b/.github/workflows/java21-buld-test.yaml new file mode 100644 index 00000000..fb2baeac --- /dev/null +++ b/.github/workflows/java21-buld-test.yaml @@ -0,0 +1,39 @@ +name: build-and-test-lts +on: + pull_request: + types: + - opened + - synchronize + - reopened + push: + branches: + - master + - main + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + # Java 8 is tested as a part of the build-and-test workflow + java-version: ['17', '21' ] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Java ${{ matrix.java-version }} + uses: actions/setup-java@v2 + with: + java-version: ${{ matrix.java-version }} + distribution: temurin + java-package: jdk + + - name: Set up Maven + uses: stCarolas/setup-maven@v4.5 + with: + maven-version: 3.9.1 + + - name: Build application + shell: bash + run: | + mvn clean install diff --git a/README.md b/README.md index afcfe868..849b923f 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,9 @@ This is a non-exhaustive list of features that Project Poseidon includes: Please read the following article before changing over to Project Poseidon: https://github.com/RhysB/Project-Poseidon/wiki/Implementing-Project-Poseidon-In-Production # Download -You can download the latest builds at the [Glass Launcher Jenkins](https://jenkins.glass-launcher.net/job/Project-Poseidon/). +You can download the latest builds at the [GitHub Releases](https://github.com/retromcorg/Project-Poseidon/releases/). + +Historical builds can be found on the [Glass Launcher Jenkins](https://jenkins.glass-launcher.net/job/Project-Poseidon/). Please note, download the artifact (JAR) without original in the name, eg. `project-poseidon-1.1.8.jar`. From 988a99f179bfa4924ac6d8585634686b17313bf6 Mon Sep 17 00:00:00 2001 From: Rhys B Date: Sat, 14 Dec 2024 18:52:01 +1000 Subject: [PATCH 22/26] Patch a boat crash exploit utilized against multiple servers --- .../java/net/minecraft/server/NetServerHandler.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/net/minecraft/server/NetServerHandler.java b/src/main/java/net/minecraft/server/NetServerHandler.java index 862a224c..f6f5b0da 100644 --- a/src/main/java/net/minecraft/server/NetServerHandler.java +++ b/src/main/java/net/minecraft/server/NetServerHandler.java @@ -285,6 +285,19 @@ public void a(Packet10Flying packet10flying) { if (packet10flying.h && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) { d5 = packet10flying.x; d4 = packet10flying.z; + + // Project Poseidon - Start + // Boat crash fix ported from UberBukkit + + double d8 = d5 * d5 + d4 * d4; + if (d8 > 100.0D) { + a.warning("[Poseidon]" + this.player.name + " tried crashing server on entity " + this.player.vehicle.toString() + ". They have been kicked."); + player.kickPlayer("Boat crash attempt detected!"); + return; + } + + // Project Poseidon - End + } this.player.onGround = packet10flying.g; From 18ad13f21535ec2582107972fcbb27dd0cfdb0f4 Mon Sep 17 00:00:00 2001 From: Rhys B Date: Sat, 14 Dec 2024 21:43:39 +1000 Subject: [PATCH 23/26] Add version properties to jar and use it for /poseidon (#122) * Add version properties to jar * Improve build and test * Remove invalid step 9 * Additional version info * Remove unnecessary GitHub action fields * fix typo * Improve Poseidon version command * Dynamically get application name for forks * Update Poseidon name in pom * Fix version.properties not including all fields --- .github/workflows/build-and-test.yaml | 62 ++++++++++- .github/workflows/java21-buld-test.yaml | 2 +- .github/workflows/release.yml | 42 ++++++- pom.xml | 2 +- .../poseidon/commands/PoseidonCommand.java | 105 ++++++++++++++++++ .../org/bukkit/command/SimpleCommandMap.java | 1 + .../command/defaults/PoseidonCommand.java | 62 ----------- 7 files changed, 208 insertions(+), 68 deletions(-) create mode 100644 src/main/java/com/legacyminecraft/poseidon/commands/PoseidonCommand.java delete mode 100644 src/main/java/org/bukkit/command/defaults/PoseidonCommand.java diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml index 20477039..f10d7ba5 100644 --- a/.github/workflows/build-and-test.yaml +++ b/.github/workflows/build-and-test.yaml @@ -15,25 +15,85 @@ jobs: runs-on: ubuntu-latest steps: + # Step 1: Checkout the repository - name: Checkout uses: actions/checkout@v4 + # Step 2: Set up JDK 1.8 - name: Set up JDK 1.8 uses: actions/setup-java@v2 with: distribution: 'temurin' java-version: 8 + # Step 3: Get the version from pom.xml + - name: Get the version from pom.xml + id: get_version + run: echo "PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV + + # Step 4: Generate custom release version + - name: Generate Release Version + id: release_version + run: | + DATE=$(date +'%y%m%d-%H%M') + SHA=$(echo $GITHUB_SHA | cut -c1-7) + RELEASE_VERSION="${PROJECT_VERSION}-${DATE}-${SHA}" + echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV + + # Step 5: Create version.properties file + - name: Create version.properties file + run: | + mkdir -p src/main/resources + + # Application Information + APP_NAME=$(mvn help:evaluate -Dexpression=project.name -q -DforceStdout) + + # Core Metadata + echo "version=${{ env.RELEASE_VERSION }}" >> src/main/resources/version.properties + echo "build_timestamp=$(date --utc +'%Y-%m-%dT%H:%M:%SZ')" >> src/main/resources/version.properties + echo "git_branch=${{ github.ref_name }}" >> src/main/resources/version.properties + echo "git_commit=${GITHUB_SHA}" >> src/main/resources/version.properties + + echo "app_name=${APP_NAME}" >> src/main/resources/version.properties + echo "release_version=${{ env.RELEASE_VERSION }}" >> src/main/resources/version.properties + echo "maven_version=${{ env.PROJECT_VERSION }}" >> src/main/resources/version.properties + + # Build Type + if [[ "${{ github.ref }}" == "refs/heads/master" || "${{ github.ref }}" == "refs/heads/main" ]]; then + BUILD_TYPE="production" + elif [[ "${{ github.event_name }}" == "pull_request" ]]; then + BUILD_TYPE="pull_request" + else + BUILD_TYPE="development" + fi + echo "build_type=${BUILD_TYPE}" >> src/main/resources/version.properties + + # CI/CD Metadata + echo "workflow_name=${{ github.workflow }}" >> src/main/resources/version.properties + echo "workflow_run_id=${{ github.run_id }}" >> src/main/resources/version.properties + echo "workflow_run_number=${{ github.run_number }}" >> src/main/resources/version.properties + + # Team or Author Information + echo "build_author=${{ github.actor }}" >> src/main/resources/version.properties + - name: Set up Maven uses: stCarolas/setup-maven@v4.5 with: maven-version: 3.9.1 - - name: build application + # Step 6: Build application + - name: Build Application shell: bash run: | mvn clean install + # Step 7: Run Tests + - name: Run Tests + shell: bash + run: | + mvn test + + # Step 8: Upload artifact - name: Upload artifact uses: actions/upload-artifact@v3 with: diff --git a/.github/workflows/java21-buld-test.yaml b/.github/workflows/java21-buld-test.yaml index fb2baeac..0b4cf6f3 100644 --- a/.github/workflows/java21-buld-test.yaml +++ b/.github/workflows/java21-buld-test.yaml @@ -1,4 +1,4 @@ -name: build-and-test-lts +name: Java-Compatibility on: pull_request: types: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4a47658a..e6deea27 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,16 +39,52 @@ jobs: - name: Generate Release Version id: release_version run: | - DATE=$(date +'%y%m%d') + DATE=$(date +'%y%m%d-%H%M') SHA=$(echo $GITHUB_SHA | cut -c1-7) RELEASE_VERSION="${PROJECT_VERSION}-${DATE}-${SHA}" echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV - # Step 6: Build with Maven + # Step 6: Create version.properties file + - name: Create version.properties file + run: | + mkdir -p src/main/resources + + # Application Information + APP_NAME=$(mvn help:evaluate -Dexpression=project.name -q -DforceStdout) + + # Core Metadata + echo "version=${{ env.RELEASE_VERSION }}" >> src/main/resources/version.properties + echo "build_timestamp=$(date --utc +'%Y-%m-%dT%H:%M:%SZ')" >> src/main/resources/version.properties + echo "git_branch=${{ github.ref_name }}" >> src/main/resources/version.properties + echo "git_commit=${GITHUB_SHA}" >> src/main/resources/version.properties + + echo "app_name=${APP_NAME}" >> src/main/resources/version.properties + echo "release_version=${{ env.RELEASE_VERSION }}" >> src/main/resources/version.properties + echo "maven_version=${{ env.PROJECT_VERSION }}" >> src/main/resources/version.properties + + # Build Type + if [[ "${{ github.ref }}" == "refs/heads/master" || "${{ github.ref }}" == "refs/heads/main" ]]; then + BUILD_TYPE="production" + elif [[ "${{ github.event_name }}" == "pull_request" ]]; then + BUILD_TYPE="pull_request" + else + BUILD_TYPE="development" + fi + echo "build_type=${BUILD_TYPE}" >> src/main/resources/version.properties + + # CI/CD Metadata + echo "workflow_name=${{ github.workflow }}" >> src/main/resources/version.properties + echo "workflow_run_id=${{ github.run_id }}" >> src/main/resources/version.properties + echo "workflow_run_number=${{ github.run_number }}" >> src/main/resources/version.properties + + # Team or Author Information + echo "build_author=${{ github.actor }}" >> src/main/resources/version.properties + + # Step 7: Build with Maven - name: Build with Maven run: mvn clean package - # Step 7: Create GitHub Release + # Step 8: Create GitHub Release - name: Create GitHub Release if: ${{ !endsWith(env.PROJECT_VERSION, '-SNAPSHOT') }} uses: softprops/action-gh-release@v1 diff --git a/pom.xml b/pom.xml index 8022514e..f267b2d1 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ project-poseidon jar 1.1.8 - Project-Poseidon + Project Poseidon UTF-8 unknown diff --git a/src/main/java/com/legacyminecraft/poseidon/commands/PoseidonCommand.java b/src/main/java/com/legacyminecraft/poseidon/commands/PoseidonCommand.java new file mode 100644 index 00000000..4f851bda --- /dev/null +++ b/src/main/java/com/legacyminecraft/poseidon/commands/PoseidonCommand.java @@ -0,0 +1,105 @@ +package com.legacyminecraft.poseidon.commands; + +import com.projectposeidon.api.PoseidonUUID; +import com.projectposeidon.api.UUIDType; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Properties; +import java.util.UUID; + +public class PoseidonCommand extends Command { + + private final Properties versionProperties = new Properties(); + + public PoseidonCommand(String name) { + super(name); + this.description = "Show data regarding the server's version of Project Poseidon"; + this.usageMessage = "/poseidon"; + this.setAliases(Arrays.asList("projectposeidon")); + loadVersionProperties(); + } + + private void loadVersionProperties() { + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("version.properties")) { + if (inputStream != null) { + versionProperties.load(inputStream); + } + } catch (IOException e) { + Bukkit.getLogger().warning("Failed to load version.properties: " + e.getMessage()); + } + } + + @Override + public boolean execute(CommandSender sender, String currentAlias, String[] args) { + if (args.length == 0) { + String appName = versionProperties.getProperty("app_name", "Unknown"); + String releaseVersion = versionProperties.getProperty("release_version", "Unknown"); + String mavenVersion = versionProperties.getProperty("maven_version", "Unknown"); + String buildTimestamp = versionProperties.getProperty("build_timestamp", "Unknown"); + String gitCommit = versionProperties.getProperty("git_commit", "Unknown"); + String buildType = versionProperties.getProperty("build_type", "Unknown"); + + // Shorten the git commit hash to 7 characters + if (gitCommit.length() > 7) { + gitCommit = gitCommit.substring(0, 7); + } + + if ("Unknown".equals(releaseVersion)) { + sender.sendMessage(ChatColor.RED + "Warning: version.properties not found. This is a local or unconfigured build."); + } else { + sender.sendMessage(ChatColor.GRAY + "This server is running " + ChatColor.AQUA + appName + ChatColor.GRAY + ":"); + sender.sendMessage(ChatColor.GRAY + " - Version: " + ChatColor.YELLOW + releaseVersion); + sender.sendMessage(ChatColor.GRAY + " - Built at: " + ChatColor.YELLOW + buildTimestamp); + sender.sendMessage(ChatColor.GRAY + " - Git SHA: " + ChatColor.YELLOW + gitCommit); + + if ("production".equalsIgnoreCase(buildType)) { + sender.sendMessage(ChatColor.GREEN + "This is a release build."); + } else if ("pull_request".equalsIgnoreCase(buildType)) { + sender.sendMessage(ChatColor.BLUE + "This is a pull request build."); + } else { + sender.sendMessage(ChatColor.GRAY + "This is a development build."); + } + } + } else if (args.length == 1) { + if (args[0].equalsIgnoreCase("uuid")) { + sender.sendMessage(ChatColor.GRAY + "Please specify a user /poseidon uuid (username)"); + } else { + sender.sendMessage(ChatColor.GRAY + "Unknown sub command."); + } + } else { + if (!args[0].equalsIgnoreCase("uuid")) { + sender.sendMessage(ChatColor.GRAY + "Unknown sub command."); + } else { + UUID uuid = PoseidonUUID.getPlayerUUIDFromCache(args[1], true); + if (uuid == null) { + uuid = PoseidonUUID.getPlayerUUIDFromCache(args[1], false); + } + + if (uuid == null) { + sender.sendMessage(ChatColor.GRAY + "Unable to locate the UUID of the player called: " + ChatColor.WHITE + args[1] + ChatColor.GRAY + ". Please remember usernames are cap sensitive"); + } else { + sender.sendMessage(ChatColor.GRAY + "Username: " + args[1]); + sender.sendMessage(ChatColor.GRAY + "UUID: " + uuid.toString()); + UUIDType uuidType = PoseidonUUID.getPlayerUUIDCacheStatus(args[1]); + if (uuidType.equals(UUIDType.ONLINE)) { + sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.GREEN + "Online"); + } else if (uuidType.equals(UUIDType.OFFLINE)) { + sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.RED + "Offline"); + } else { + sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.DARK_RED + "UNKNOWN"); + } + } + } + } + + return true; + + } + +} diff --git a/src/main/java/org/bukkit/command/SimpleCommandMap.java b/src/main/java/org/bukkit/command/SimpleCommandMap.java index 3736fe30..efa526e9 100644 --- a/src/main/java/org/bukkit/command/SimpleCommandMap.java +++ b/src/main/java/org/bukkit/command/SimpleCommandMap.java @@ -1,6 +1,7 @@ package org.bukkit.command; import com.legacyminecraft.poseidon.PoseidonConfig; +import com.legacyminecraft.poseidon.commands.PoseidonCommand; import com.legacyminecraft.poseidon.commands.TPSCommand; import org.bukkit.Server; import org.bukkit.command.defaults.*; diff --git a/src/main/java/org/bukkit/command/defaults/PoseidonCommand.java b/src/main/java/org/bukkit/command/defaults/PoseidonCommand.java deleted file mode 100644 index 1ebdc383..00000000 --- a/src/main/java/org/bukkit/command/defaults/PoseidonCommand.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.bukkit.command.defaults; - -import com.projectposeidon.api.PoseidonUUID; -import com.projectposeidon.api.UUIDType; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.util.Arrays; -import java.util.UUID; - -public class PoseidonCommand extends Command { - - public PoseidonCommand(String name) { - super(name); - this.description = "Show data regarding the servers version of Project Poseidon"; - this.usageMessage = "/poseidon"; - this.setAliases(Arrays.asList("projectposeidon")); - } - - @Override - public boolean execute(CommandSender sender, String currentAlias, String[] args) { - if (args.length == 0) { - sender.sendMessage(ChatColor.GRAY + "This server is running " + ChatColor.AQUA + "Project Poseidon" + ChatColor.GRAY + " Version: " + ChatColor.RED + Bukkit.getServer().getPoseidonVersion()); - } else if (args.length == 1) { - if (args[0].equalsIgnoreCase("uuid")) { - sender.sendMessage(ChatColor.GRAY + "Please specify a user /poseidon uuid (username)"); - } else { - sender.sendMessage(ChatColor.GRAY + "Unknown sub command."); - } - } else { - if (!args[0].equalsIgnoreCase("uuid")) { - sender.sendMessage(ChatColor.GRAY + "Unknown sub command."); - } else { - UUID uuid = PoseidonUUID.getPlayerUUIDFromCache(args[1], true); - if (uuid == null) { - uuid = PoseidonUUID.getPlayerUUIDFromCache(args[1], false); - } - - if (uuid == null) { - sender.sendMessage(ChatColor.GRAY + "Unable to locate the UUID of the player called: " + ChatColor.WHITE + args[1] + ChatColor.GRAY + ". Please remember usernames are cap sensitive"); - } else { - sender.sendMessage(ChatColor.GRAY + "Username: " + args[1]); - sender.sendMessage(ChatColor.GRAY + "UUID: " + uuid.toString()); - UUIDType uuidType = PoseidonUUID.getPlayerUUIDCacheStatus(args[1]); - if (uuidType.equals(UUIDType.ONLINE)) { - sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.GREEN + "Online"); - } else if (uuidType.equals(UUIDType.OFFLINE)) { - sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.RED + "Offline"); - } else { - sender.sendMessage(ChatColor.GRAY + "UUID Type: " + ChatColor.DARK_RED + "UNKNOWN"); - } - } - } - } - - return true; - - } - -} From 8e30ad9389dd509e4c722362b33971a2bda7f3d2 Mon Sep 17 00:00:00 2001 From: Rhys B Date: Sun, 15 Dec 2024 11:11:16 +1000 Subject: [PATCH 24/26] Add version update checker and refactor Poseidon elements (#123) Add an automatic update checker that will query the GitHub releases to see if a newer version is available. By default operators and users with the permission poseidon.update will be notified of updates when joining the server. --- pom.xml | 2 +- .../legacyminecraft/poseidon/Poseidon.java | 16 +- .../poseidon/PoseidonConfig.java | 10 +- .../poseidon/PoseidonServer.java | 200 ++++++++++++++++++ .../poseidon/commands/PoseidonCommand.java | 24 +-- .../utility/PoseidonVersionChecker.java | 94 ++++++++ .../net/minecraft/server/MinecraftServer.java | 48 ++--- .../minecraft/server/NetServerHandler.java | 5 +- .../server/ServerConfigurationManager.java | 16 +- src/main/java/org/bukkit/Server.java | 21 -- .../org/bukkit/craftbukkit/CraftServer.java | 37 +--- .../bukkit/plugin/SimplePluginManager.java | 7 +- 12 files changed, 376 insertions(+), 104 deletions(-) create mode 100644 src/main/java/com/legacyminecraft/poseidon/PoseidonServer.java create mode 100644 src/main/java/com/legacyminecraft/poseidon/utility/PoseidonVersionChecker.java diff --git a/pom.xml b/pom.xml index f267b2d1..9d87819e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.bukkit project-poseidon jar - 1.1.8 + 1.1.10 Project Poseidon UTF-8 diff --git a/src/main/java/com/legacyminecraft/poseidon/Poseidon.java b/src/main/java/com/legacyminecraft/poseidon/Poseidon.java index 2b116dd6..5887a8cb 100644 --- a/src/main/java/com/legacyminecraft/poseidon/Poseidon.java +++ b/src/main/java/com/legacyminecraft/poseidon/Poseidon.java @@ -1,11 +1,13 @@ package com.legacyminecraft.poseidon; import org.bukkit.Bukkit; +import org.bukkit.Server; import org.bukkit.craftbukkit.CraftServer; import java.util.LinkedList; -public class Poseidon { +public final class Poseidon { + private static PoseidonServer server; /** * Returns a list of the server's TPS (Ticks Per Second) records for performance monitoring. @@ -17,5 +19,17 @@ public static LinkedList getTpsRecords() { return ((CraftServer) Bukkit.getServer()).getServer().getTpsRecords(); } + public static PoseidonServer getServer() { + return server; + } + + public static void setServer(PoseidonServer server) { + if (Poseidon.server != null) { + throw new UnsupportedOperationException("Cannot redefine singleton Server"); + } + + Poseidon.server = server; + } + } diff --git a/src/main/java/com/legacyminecraft/poseidon/PoseidonConfig.java b/src/main/java/com/legacyminecraft/poseidon/PoseidonConfig.java index 16c3fe5d..49e8ca2d 100644 --- a/src/main/java/com/legacyminecraft/poseidon/PoseidonConfig.java +++ b/src/main/java/com/legacyminecraft/poseidon/PoseidonConfig.java @@ -30,7 +30,7 @@ public void reload() { public void resetConfig() { // Delete all the config options - for(String key : this.getKeys()) { + for (String key : this.getKeys()) { this.removeProperty(key); } // Reload the config @@ -95,7 +95,7 @@ private void write() { generateConfigOption("settings.fix-drowning-push-down.enabled", true); generateConfigOption("settings.fix-drowning-push-down.info", "This setting fixes taking drowning damage pushing you down."); - + generateConfigOption("settings.player-knockback-fix.enabled", true); generateConfigOption("settings.player-knockback-fix.info", "This setting fixes reduced knockback for certain players on the server."); @@ -179,6 +179,11 @@ private void write() { generateConfigOption("emergency.debug.regenerate-corrupt-chunks.enable", false); generateConfigOption("emergency.debug.regenerate-corrupt-chunks.info", "This setting allows you to automatically regenerate corrupt chunks. This is useful after a ungraceful shutdown while a file is being written to or out of memory exception."); + generateConfigOption("settings.update-checker.enabled", true); + generateConfigOption("settings.update-checker.info", "This setting allows you to disable the update checker. This is useful if you have a custom build of Poseidon or don't want to be notified of updates."); + generateConfigOption("settings.update-checker.notify-staff.enabled", true); + generateConfigOption("settings.update-checker.notify-staff.info", "This setting notifies operators and players with the permission poseidon.update when a new version of Poseidon is available on join."); + //Messages generateConfigOption("message.kick.banned", "You are banned from this server!"); generateConfigOption("message.kick.ip-banned", "Your IP address is banned from this server!"); @@ -188,6 +193,7 @@ private void write() { generateConfigOption("message.kick.already-online", "\u00A7cA player with your username or uuid is already online, try reconnecting in a minute."); generateConfigOption("message.player.join", "\u00A7e%player% joined the game."); generateConfigOption("message.player.leave", "\u00A7e%player% left the game."); + generateConfigOption("message.update.available", "\u00A7dA newer version of Poseidon is available: %newversion%"); //Optional Poseidon Commands generateConfigOption("command.info", "This section allows you to enable or disable optional Poseidon commands. This is useful if you have a plugin that conflicts with a Poseidon command."); diff --git a/src/main/java/com/legacyminecraft/poseidon/PoseidonServer.java b/src/main/java/com/legacyminecraft/poseidon/PoseidonServer.java new file mode 100644 index 00000000..c3a85285 --- /dev/null +++ b/src/main/java/com/legacyminecraft/poseidon/PoseidonServer.java @@ -0,0 +1,200 @@ +package com.legacyminecraft.poseidon; + +import com.legacyminecraft.poseidon.utility.PoseidonVersionChecker; +import com.legacyminecraft.poseidon.watchdog.WatchDogThread; +import com.projectposeidon.johnymuffin.UUIDManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.NetServerHandler; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.CraftServer; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; +import java.util.logging.Logger; + +public final class PoseidonServer { + private final MinecraftServer server; + private final CraftServer craftServer; + + private final List hiddenCommands = new ArrayList<>(); + private final Properties versionProperties = new Properties(); + + private boolean serverInitialized = false; + + private PoseidonVersionChecker poseidonVersionChecker; + private WatchDogThread watchDogThread; + + public PoseidonServer(MinecraftServer server, CraftServer craftServer) { + this.server = server; + this.craftServer = craftServer; + + loadVersionProperties(); + + addHiddenCommands(Arrays.asList("login", "l", "register", "reg", "unregister", "changepassword", "changepw")); + } + + private void loadVersionProperties() { + try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("version.properties")) { + if (inputStream != null) { + versionProperties.load(inputStream); + } + } catch (IOException e) { + getLogger().warning("Failed to load version.properties: " + e.getMessage()); + } + } + + public void initializeServer() { + if (serverInitialized) { + throw new UnsupportedOperationException("Server already initialized"); + } + + getLogger().info("[Poseidon] Starting Project Poseidon Modules!"); + + PoseidonConfig.getInstance(); + UUIDManager.getInstance(); + + initializeUpdateChecker(); + + //Start Watchdog + watchDogThread = new WatchDogThread(Thread.currentThread()); + if (PoseidonConfig.getInstance().getBoolean("settings.enable-watchdog", true)) { + getLogger().info("[Poseidon] Starting Watchdog to detect any server hangs!"); + watchDogThread.start(); + watchDogThread.tickUpdate(); + } + + serverInitialized = true; + getLogger().info("[Poseidon] Finished loading Project Poseidon Modules!"); + } + + private void initializeUpdateChecker() { + if (!PoseidonConfig.getInstance().getConfigBoolean("settings.update-checker.enabled", true)) { + getLogger().info("[Poseidon] Version checker disabled. The server will not check for updates."); + return; + } + + String releaseVersion = getReleaseVersion(); + + if (releaseVersion == null) { + getLogger().warning("[Poseidon] Version checker is disabled as no version.properties file was found."); + return; + } + + if(!getBuildType().equalsIgnoreCase("production")) { + getLogger().warning("[Poseidon] Version checker is disabled as this is a " + getBuildType() + " build. The updater will only check for updates on production builds."); + return; + } + + poseidonVersionChecker = new PoseidonVersionChecker(craftServer, releaseVersion); + + getLogger().info("[Poseidon] Version checker enabled. The server will check for updates every hour."); + // Run the version checker in a separate thread every hour + Bukkit.getScheduler().scheduleSyncRepeatingTask(new PoseidonPlugin(), new Runnable() { + @Override + public void run() { + poseidonVersionChecker.fetchLatestVersion(); + } + }, 0, 20 * 60 * 60); + } + + public void shutdownServer() { + if (!serverInitialized) { + throw new UnsupportedOperationException("Server not initialized"); + } + + getLogger().info("[Poseidon] Stopping Project Poseidon Modules!"); + + UUIDManager.getInstance().saveJsonArray(); + + if (watchDogThread != null) { + getLogger().info("[Poseidon] Stopping Watchdog!"); + watchDogThread.interrupt(); + } + + serverInitialized = false; + getLogger().info("[Poseidon] Finished unloading Project Poseidon Modules!"); + } + + public Logger getLogger() { + return MinecraftServer.log; + } + + public String getAppName() { + return versionProperties.getProperty("app_name", "Unknown"); + } + + public String getReleaseVersion() { + return versionProperties.getProperty("release_version", "Unknown"); + } + + public String getMavenVersion() { + return versionProperties.getProperty("maven_version", "Unknown"); + } + + public String getBuildTimestamp() { + return versionProperties.getProperty("build_timestamp", "Unknown"); + } + + public String getGitCommit() { + return versionProperties.getProperty("git_commit", "Unknown"); + } + + public String getBuildType() { + return versionProperties.getProperty("build_type", "Unknown"); + } + + public boolean isUpdateAvailable() { + return poseidonVersionChecker != null && poseidonVersionChecker.isUpdateAvailable(); + } + + public String getNewestVersion() { + return poseidonVersionChecker == null ? "Unknown" : poseidonVersionChecker.getLatestVersion(); + } + + public WatchDogThread getWatchDogThread() { + return watchDogThread; + } + + /** + * Returns the current hide state of the command from param (Hide from console) + * + * @param cmdName Command name + * @return True if the command from param is hidden and false otherwise + */ + public boolean isCommandHidden(String cmdName) { + return hiddenCommands.contains(cmdName.toLowerCase()); + } + + + /** + * Hides the command from param from being logged to server console + * + * @param cmd Command name + */ + public void addHiddenCommand(String cmd) { + cmd = cmd.toLowerCase(); + + if (hiddenCommands.contains(cmd)) { + Logger.getLogger(NetServerHandler.class.getName()).warning("List of Hidden commands already contains " + cmd); + return; + } + + hiddenCommands.add(cmd); + } + + /** + * Hides the commands from param from being logged to server console + * + * @param commands List of command names + */ + public void addHiddenCommands(List commands) { + for (String cmd : commands) { + addHiddenCommand(cmd); + } + } + +} diff --git a/src/main/java/com/legacyminecraft/poseidon/commands/PoseidonCommand.java b/src/main/java/com/legacyminecraft/poseidon/commands/PoseidonCommand.java index 4f851bda..056d2ff9 100644 --- a/src/main/java/com/legacyminecraft/poseidon/commands/PoseidonCommand.java +++ b/src/main/java/com/legacyminecraft/poseidon/commands/PoseidonCommand.java @@ -1,5 +1,6 @@ package com.legacyminecraft.poseidon.commands; +import com.legacyminecraft.poseidon.Poseidon; import com.projectposeidon.api.PoseidonUUID; import com.projectposeidon.api.UUIDType; import org.bukkit.Bukkit; @@ -22,28 +23,17 @@ public PoseidonCommand(String name) { this.description = "Show data regarding the server's version of Project Poseidon"; this.usageMessage = "/poseidon"; this.setAliases(Arrays.asList("projectposeidon")); - loadVersionProperties(); - } - - private void loadVersionProperties() { - try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream("version.properties")) { - if (inputStream != null) { - versionProperties.load(inputStream); - } - } catch (IOException e) { - Bukkit.getLogger().warning("Failed to load version.properties: " + e.getMessage()); - } } @Override public boolean execute(CommandSender sender, String currentAlias, String[] args) { if (args.length == 0) { - String appName = versionProperties.getProperty("app_name", "Unknown"); - String releaseVersion = versionProperties.getProperty("release_version", "Unknown"); - String mavenVersion = versionProperties.getProperty("maven_version", "Unknown"); - String buildTimestamp = versionProperties.getProperty("build_timestamp", "Unknown"); - String gitCommit = versionProperties.getProperty("git_commit", "Unknown"); - String buildType = versionProperties.getProperty("build_type", "Unknown"); + String appName = Poseidon.getServer().getAppName(); + String releaseVersion = Poseidon.getServer().getReleaseVersion(); + String mavenVersion = Poseidon.getServer().getMavenVersion(); + String buildTimestamp = Poseidon.getServer().getBuildTimestamp(); + String gitCommit = Poseidon.getServer().getGitCommit(); + String buildType = Poseidon.getServer().getBuildType(); // Shorten the git commit hash to 7 characters if (gitCommit.length() > 7) { diff --git a/src/main/java/com/legacyminecraft/poseidon/utility/PoseidonVersionChecker.java b/src/main/java/com/legacyminecraft/poseidon/utility/PoseidonVersionChecker.java new file mode 100644 index 00000000..da39fbeb --- /dev/null +++ b/src/main/java/com/legacyminecraft/poseidon/utility/PoseidonVersionChecker.java @@ -0,0 +1,94 @@ +package com.legacyminecraft.poseidon.utility; + +import org.bukkit.craftbukkit.CraftServer; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Level; + +public class PoseidonVersionChecker { + + private static final String GITHUB_API_URL = "https://api.github.com/repos/retromcorg/Project-Poseidon/releases/latest"; + private static final String releaseUrl = "https://github.com/retromcorg/Project-Poseidon/releases"; + private final String currentVersion; + private volatile String latestVersion; + private CraftServer server; + + public PoseidonVersionChecker(CraftServer server, String currentVersion) { + this.currentVersion = currentVersion; + this.latestVersion = currentVersion; // Assume the latest version is the current version until checked + this.server = server; + } + + /** + * Checks if a new version is available. + * + * @return true if a newer version is available, false otherwise. + */ + public synchronized boolean isUpdateAvailable() { + return latestVersion != null && !currentVersion.equalsIgnoreCase(latestVersion); + } + + /** + * Fetches the latest release version from GitHub API. + * + * @return the latest version as a String or null if fetching fails. + */ + public void fetchLatestVersion() { + HttpURLConnection connection = null; + try { + URL url = new URL(GITHUB_API_URL); + connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setRequestProperty("Accept", "application/json"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + + int responseCode = connection.getResponseCode(); + if (responseCode != HttpURLConnection.HTTP_OK) { + server.getLogger().log(Level.WARNING, "[Poseidon] Failed to check GitHub for latest version. HTTP Response Code: " + responseCode); + } + + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + StringBuilder response = new StringBuilder(); + String line; + + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + JSONParser parser = new JSONParser(); + JSONObject json = (JSONObject) parser.parse(response.toString()); + + this.latestVersion = (String) json.get("tag_name"); + + if (isUpdateAvailable()) { + server.getLogger().log(Level.INFO, "[Poseidon] A new version is available: " + latestVersion); + server.getLogger().log(Level.INFO, "[Poseidon] You are currently running version: " + currentVersion); + server.getLogger().log(Level.INFO, "[Poseidon] Download the latest version here: " + releaseUrl); + } else { + server.getLogger().log(Level.INFO, "[Poseidon] You are running the latest version (" + currentVersion + ") of Project Poseidon."); + } + } catch (Exception e) { + server.getLogger().log(Level.WARNING, "[Poseidon] Failed to check GitHub for latest version.", e); + } finally { + if (connection != null) { + connection.disconnect(); + } + } + } + + public String getCurrentVersion() { + return currentVersion; + } + + public String getLatestVersion() { + return latestVersion; + } +} diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 31f7c44b..ca60a348 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1,11 +1,15 @@ package net.minecraft.server; +import com.legacyminecraft.poseidon.Poseidon; import com.legacyminecraft.poseidon.PoseidonConfig; +import com.legacyminecraft.poseidon.PoseidonPlugin; import com.legacyminecraft.poseidon.util.ServerLogRotator; +import com.legacyminecraft.poseidon.utility.PoseidonVersionChecker; import com.projectposeidon.johnymuffin.UUIDManager; import com.legacyminecraft.poseidon.watchdog.WatchDogThread; import jline.ConsoleReader; import joptsimple.OptionSet; +import org.bukkit.Bukkit; import org.bukkit.World.Environment; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.LoggerOutputStream; @@ -64,8 +68,9 @@ public class MinecraftServer implements Runnable, ICommandListener { // CraftBukkit end //Poseidon Start - private WatchDogThread watchDogThread; +// private WatchDogThread watchDogThread; private boolean modLoaderSupport = false; +// private PoseidonVersionChecker poseidonVersionChecker; //Poseidon End public MinecraftServer(OptionSet options) { // CraftBukkit - adds argument OptionSet @@ -96,7 +101,7 @@ private boolean init() throws UnknownHostException { // CraftBukkit - added thro // CraftBukkit end //If Poseidon Config DEBUG is enabled, enable debug mode - if(options.has("debug-config")) { + if (options.has("debug-config")) { log.info("[Poseidon] Configuration debug mode has been enabled. This will cause the poseidon.yml to be reloaded every time the server starts."); PoseidonConfig.getInstance().resetConfig(); } @@ -171,26 +176,7 @@ private boolean init() throws UnknownHostException { // CraftBukkit - added thro this.a(new WorldLoaderServer(new File(".")), s1, k); //Project Poseidon Start - log.info("[Poseidon] Starting Project Poseidon Modules!"); - - PoseidonConfig.getInstance(); - UUIDManager.getInstance(); - - //Start Watchdog - watchDogThread = new WatchDogThread(Thread.currentThread()); - if (PoseidonConfig.getInstance().getBoolean("settings.enable-watchdog", true)) { - log.info("[Poseidon] Starting Watchdog to detect any server hangs!"); - watchDogThread.start(); - watchDogThread.tickUpdate(); - } - //Start Poseidon Statistics - if (PoseidonConfig.getInstance().getBoolean("settings.settings.statistics.enabled", true)) { -// new PoseidonStatisticsAgent(this, this.server); - } else { - log.info("[Poseidon] Please consider enabling statistics in Poseidon.yml. It helps us see how many servers are running Poseidon, and what versions."); - } - - log.info("[Poseidon] Finished loading Project Poseidon Modules!"); + Poseidon.getServer().initializeServer(); //Project Poseidon End // CraftBukkit start @@ -372,11 +358,10 @@ public void stop() { // CraftBukkit - private -> public log.info("Stopping server"); //Project Poseidon Start - UUIDManager.getInstance().saveJsonArray(); - if (watchDogThread != null) { - log.info("Stopping Poseidon Watchdog"); - watchDogThread.interrupt(); - } + + // This is done before disablePlugins() to ensure the watchdog doesn't detect plugins disabling as a server hang + Poseidon.getServer().shutdownServer(); + //Project Poseidon End // CraftBukkit start @@ -433,7 +418,7 @@ public void run() { } else { while (j > 50L) { MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit - watchDogThread.tickUpdate(); // Project Poseidon + getWatchdog().tickUpdate(); // Project Poseidon j -= 50L; this.h(); } @@ -520,7 +505,7 @@ private void h() { if (currentTime - lastTick >= 1000) { double tps = tickCount / ((currentTime - lastTick) / 1000.0); tpsRecords.addFirst(tps); - if(tpsRecords.size() > 900) { //Don't keep more than 15 minutes of data + if (tpsRecords.size() > 900) { //Don't keep more than 15 minutes of data tpsRecords.removeLast(); } @@ -531,7 +516,6 @@ private void h() { //Project Poseidon End - Tick Update - for (j = 0; j < this.worlds.size(); ++j) { // CraftBukkit // if (j == 0 || this.propertyManager.getBoolean("allow-nether", true)) { // CraftBukkit WorldServer worldserver = this.worlds.get(j); // CraftBukkit @@ -540,7 +524,7 @@ private void h() { // CraftBukkit start - only send timeupdates to the people in that world for (int i = 0; i < worldserver.players.size(); ++i) { // Project Poseidon: serverConfigurationManager -> worldserver.players EntityPlayer entityPlayer = (EntityPlayer) worldserver.players.get(i); - if(entityPlayer != null) { + if (entityPlayer != null) { entityPlayer.netServerHandler.sendPacket(new Packet4UpdateTime(entityPlayer.getPlayerTime())); // Add support for per player time } @@ -652,6 +636,6 @@ public static boolean isRunning(MinecraftServer minecraftserver) { } public WatchDogThread getWatchdog() { - return this.watchDogThread; + return Poseidon.getServer().getWatchDogThread(); } } diff --git a/src/main/java/net/minecraft/server/NetServerHandler.java b/src/main/java/net/minecraft/server/NetServerHandler.java index f6f5b0da..c9511b0f 100644 --- a/src/main/java/net/minecraft/server/NetServerHandler.java +++ b/src/main/java/net/minecraft/server/NetServerHandler.java @@ -1,5 +1,7 @@ package net.minecraft.server; +import com.legacyminecraft.poseidon.Poseidon; +import com.legacyminecraft.poseidon.PoseidonServer; import com.legacyminecraft.poseidon.event.PlayerSendPacketEvent; import com.projectposeidon.ConnectionType; import com.legacyminecraft.poseidon.PoseidonConfig; @@ -99,6 +101,7 @@ public int getRawConnectionType() { return this.rawConnectionType; } + //Project Poseidon - End private final CraftServer server; @@ -862,7 +865,7 @@ private void handleCommand(String s) { //Hide commands from being logged in console String cmdName = s.split(" ")[0].replaceAll("/", ""); - if (server.isCommandHidden(cmdName)) { + if (Poseidon.getServer().isCommandHidden(cmdName)) { a.info(player.getName() + " issued server command: COMMAND REDACTED"); } else { a.info(player.getName() + " issued server command: " + s); diff --git a/src/main/java/net/minecraft/server/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/ServerConfigurationManager.java index a58407e6..9ef45b97 100644 --- a/src/main/java/net/minecraft/server/ServerConfigurationManager.java +++ b/src/main/java/net/minecraft/server/ServerConfigurationManager.java @@ -1,5 +1,6 @@ package net.minecraft.server; +import com.legacyminecraft.poseidon.Poseidon; import com.legacyminecraft.poseidon.PoseidonConfig; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -120,7 +121,8 @@ public void c(EntityPlayer entityplayer) { } // CraftBukkit start - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(this.cserver.getPlayer(entityplayer), msgPlayerJoin.replace("%player%", entityplayer.name)); + Player player = this.cserver.getPlayer(entityplayer); + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(player, msgPlayerJoin.replace("%player%", entityplayer.name)); this.cserver.getPluginManager().callEvent(playerJoinEvent); String joinMessage = playerJoinEvent.getJoinMessage(); @@ -130,6 +132,18 @@ public void c(EntityPlayer entityplayer) { } // CraftBukkit end + // Poseidon Start + // Notify staff of Poseidon update if they are op or have poseidon.update permission + if(PoseidonConfig.getInstance().getConfigBoolean("settings.update-checker.notify-staff.enabled", true) && Poseidon.getServer().isUpdateAvailable()) { + if (player.isOp() || player.hasPermission("poseidon.update")) { + String updateMessage = PoseidonConfig.getInstance().getConfigString("message.update.available"); + updateMessage = updateMessage.replace("%newversion%", Poseidon.getServer().getNewestVersion()); + updateMessage = updateMessage.replace("%currentversion%", Poseidon.getServer().getReleaseVersion()); + player.sendMessage(updateMessage); + } + } + // Poseidon End + worldserver.addEntity(entityplayer); this.getPlayerManager(entityplayer.dimension).addPlayer(entityplayer); } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java index 427fb3da..3f62950c 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -468,25 +468,4 @@ public interface Server { */ public Set getBannedPlayers(); - /** - * Returns the current hide state of the command from param (Hide from console) - * - * @param cmdName Command name - * @return True if the command from param is hidden and false otherwise - */ - public boolean isCommandHidden(String cmdName); - - /** - * Hides the command from param from being logged to server console - * - * @param cmd Command name - */ - public void addHiddenCommand(String cmd); - - /** - * Hides the commands from param from being logged to server console - * - * @param commands List of command names - */ - public void addHiddenCommands(List commands); } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 5372141e..9a678ea6 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -4,6 +4,11 @@ import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.dbplatform.SQLitePlatform; import com.avaje.ebeaninternal.server.lib.sql.TransactionIsolation; +import com.legacyminecraft.poseidon.Poseidon; +import com.legacyminecraft.poseidon.PoseidonConfig; +import com.legacyminecraft.poseidon.PoseidonPlugin; +import com.legacyminecraft.poseidon.PoseidonServer; +import com.legacyminecraft.poseidon.utility.PoseidonVersionChecker; import jline.ConsoleReader; import net.minecraft.server.*; import org.bukkit.Bukkit; @@ -55,7 +60,7 @@ public final class CraftServer implements Server { private final String serverName = "Project Poseidon Craftbukkit"; //Poseidon Versions private final String serverEnvironment = "POSEIDON"; - private final String serverVersion = "1.1.8"; + private final String serverVersion = "1.1.10"; private final String releaseType = "DEVELOPMENT"; private final String protocolVersion = "1.7.3"; private final String GameVersion = "b1.7.3"; @@ -78,16 +83,17 @@ public CraftServer(MinecraftServer console, ServerConfigurationManager server) { Bukkit.setServer(this); + //Project Poseidon Start + PoseidonServer poseidonServer = new PoseidonServer(console, this); + Poseidon.setServer(poseidonServer); + //Project Poseidon End + configuration = new Configuration((File) console.options.valueOf("bukkit-settings")); loadConfig(); loadPlugins(); enablePlugins(PluginLoadOrder.STARTUP); ChunkCompressionThread.startThread(); - - // Project Poseidon start - addHiddenCommands(Arrays.asList("login", "l", "register", "reg", "unregister", "changepassword", "changepw")); - // Project Poseidon end } private void loadConfig() { @@ -854,27 +860,6 @@ public void setShuttingdown(boolean shuttingdown) { this.shuttingdown = shuttingdown; } - public boolean isCommandHidden(String cmdName) { - return hiddenCommands.contains(cmdName.toLowerCase()); - } - - public void addHiddenCommand(String cmd) { - cmd = cmd.toLowerCase(); - - if(hiddenCommands.contains(cmd)) { - Logger.getLogger(NetServerHandler.class.getName()).warning("List of Hidden commands already contains " + cmd); - return; - } - - hiddenCommands.add(cmd); - } - - public void addHiddenCommands(List commands) { - for(String cmd : commands) { - addHiddenCommand(cmd); - } - } - // public GameMode getDefaultGameMode() { // return GameMode.SURVIVAL; // } diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index 22a31dee..88d3f062 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.MapMaker; +import com.legacyminecraft.poseidon.Poseidon; import com.legacyminecraft.poseidon.event.PoseidonCustomListener; import org.bukkit.Server; import org.bukkit.command.Command; @@ -290,12 +291,14 @@ public void enablePlugin(final Plugin plugin) { if (!pluginCommands.isEmpty()) { commandMap.registerAll(plugin.getDescription().getName(), pluginCommands); + // Project Poseidon - Start - Hide commands for(Command c : pluginCommands) { if(c.isHidden()) { - server.addHiddenCommand(c.getLabel()); - server.addHiddenCommands(c.getAliases()); + Poseidon.getServer().addHiddenCommand(c.getLabel()); + Poseidon.getServer().addHiddenCommands(c.getAliases()); } } + // Project Poseidon - End - Hide commands } try { From 371020c83eb523671209afe9215c26bc5d7e022a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2024 12:01:42 +1000 Subject: [PATCH 25/26] Bump com.google.guava:guava from 30.1.1-jre to 32.0.0-jre (#115) Bumps [com.google.guava:guava](https://github.com/google/guava) from 30.1.1-jre to 32.0.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9d87819e..6922ff23 100644 --- a/pom.xml +++ b/pom.xml @@ -134,7 +134,7 @@ com.google.guava guava - 30.1.1-jre + 32.0.0-jre jar compile From 8f2bb13b6b7392fc86ebb810487fcabd81d5216e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2024 12:08:27 +1000 Subject: [PATCH 26/26] Bump org.yaml:snakeyaml from 1.7 to 2.0 (#117) Bumps [org.yaml:snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) from 1.7 to 2.0. - [Commits](https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-2.0..v1.7) --- updated-dependencies: - dependency-name: org.yaml:snakeyaml dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6922ff23..ddc035d2 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,7 @@ org.yaml snakeyaml - 1.7 + 2.0 jar provided