From df5302231299db84ae415ccf3b9017d8b70773ec Mon Sep 17 00:00:00 2001 From: PseudoKnight Date: Thu, 5 Dec 2024 13:31:45 -0800 Subject: [PATCH] Add support for Minecraft 1.21.4 --- .../abstraction/MCParticleData.java | 10 +++++-- .../abstraction/blocks/MCMaterial.java | 16 ++++++++++- .../bukkit/entities/BukkitMCEntity.java | 1 + .../abstraction/enums/MCEntityType.java | 1 - .../abstraction/enums/MCParticle.java | 1 + .../abstraction/enums/MCSound.java | 17 +++++++++++ .../abstraction/enums/MCTrimMaterial.java | 1 + .../abstraction/enums/MCVersion.java | 1 + .../enums/bukkit/BukkitMCParticle.java | 28 ++++++++++++++++--- .../com/laytonsmith/core/ObjectGenerator.java | 12 +++++++- .../core/functions/Environment.java | 2 +- src/main/resources/docs/Compatibility | 7 ++++- 12 files changed, 86 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/laytonsmith/abstraction/MCParticleData.java b/src/main/java/com/laytonsmith/abstraction/MCParticleData.java index 2eba51622..ae851b3be 100644 --- a/src/main/java/com/laytonsmith/abstraction/MCParticleData.java +++ b/src/main/java/com/laytonsmith/abstraction/MCParticleData.java @@ -20,13 +20,15 @@ public MCColor to() { } } - public static class TargetColor { + public static class Trail { MCLocation location; MCColor color; + int duration; - public TargetColor(MCLocation location, MCColor color) { + public Trail(MCLocation location, MCColor color, int duration) { this.location = location; this.color = color; + this.duration = duration; } public MCLocation location() { @@ -36,6 +38,10 @@ public MCLocation location() { public MCColor color() { return this.color; } + + public int duration() { + return this.duration; + } } public static class VibrationBlockDestination { diff --git a/src/main/java/com/laytonsmith/abstraction/blocks/MCMaterial.java b/src/main/java/com/laytonsmith/abstraction/blocks/MCMaterial.java index 3b6e5f652..d22a90231 100644 --- a/src/main/java/com/laytonsmith/abstraction/blocks/MCMaterial.java +++ b/src/main/java/com/laytonsmith/abstraction/blocks/MCMaterial.java @@ -1721,7 +1721,21 @@ public enum MCVanillaMaterial { PALE_OAK_WOOD(MCVersion.MC1_21_3), POTTED_PALE_OAK_SAPLING(MCVersion.MC1_21_3), STRIPPED_PALE_OAK_LOG(MCVersion.MC1_21_3), - STRIPPED_PALE_OAK_WOOD(MCVersion.MC1_21_3); + STRIPPED_PALE_OAK_WOOD(MCVersion.MC1_21_3), + + // 1.21.4 additions + CLOSED_EYEBLOSSOM(MCVersion.MC1_21_4), + OPEN_EYEBLOSSOM(MCVersion.MC1_21_4), + POTTED_CLOSED_EYEBLOSSOM(MCVersion.MC1_21_4), + POTTED_OPEN_EYEBLOSSOM(MCVersion.MC1_21_4), + RESIN_BLOCK(MCVersion.MC1_21_4), + RESIN_BRICK(MCVersion.MC1_21_4), + RESIN_BRICKS(MCVersion.MC1_21_4), + RESIN_BRICK_SLAB(MCVersion.MC1_21_4), + RESIN_BRICK_STAIRS(MCVersion.MC1_21_4), + RESIN_BRICK_WALL(MCVersion.MC1_21_4), + RESIN_CLUMP(MCVersion.MC1_21_4), + CHISELED_RESIN_BRICKS(MCVersion.MC1_21_4); private final MCVersion since; private final MCVersion until; diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCEntity.java b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCEntity.java index 5e3236ea1..fc9714262 100644 --- a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCEntity.java +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCEntity.java @@ -244,6 +244,7 @@ public boolean teleport(MCLocation location, MCTeleportCause cause) { isPaperTeleportFlag = BukkitMCEntity.isPaperTeleportFlag; if(isPaperTeleportFlag == null) { try { + // 1.19.3 Class.forName("io.papermc.paper.entity.TeleportFlag$EntityState"); BukkitMCEntity.isPaperTeleportFlag = isPaperTeleportFlag = true; } catch(ClassNotFoundException ex) { diff --git a/src/main/java/com/laytonsmith/abstraction/enums/MCEntityType.java b/src/main/java/com/laytonsmith/abstraction/enums/MCEntityType.java index c5341a9b6..1b952e152 100644 --- a/src/main/java/com/laytonsmith/abstraction/enums/MCEntityType.java +++ b/src/main/java/com/laytonsmith/abstraction/enums/MCEntityType.java @@ -177,7 +177,6 @@ public enum MCVanillaEntityType { COD, COW, CREAKING(true, MCVersion.MC1_21_3), - CREAKING_TRANSIENT(true, MCVersion.MC1_21_3), CREEPER, DOLPHIN, DRAGON_FIREBALL, diff --git a/src/main/java/com/laytonsmith/abstraction/enums/MCParticle.java b/src/main/java/com/laytonsmith/abstraction/enums/MCParticle.java index 3c1700598..36e8c94a1 100644 --- a/src/main/java/com/laytonsmith/abstraction/enums/MCParticle.java +++ b/src/main/java/com/laytonsmith/abstraction/enums/MCParticle.java @@ -222,6 +222,7 @@ public enum MCVanillaParticle { TRIAL_OMEN(MCVersion.MC1_20_6), BLOCK_CRUMBLE(MCVersion.MC1_21_3), TRAIL(MCVersion.MC1_21_3), + PALE_OAK_LEAVES(MCVersion.MC1_21_4), UNKNOWN(MCVersion.NEVER); private final MCVersion since; diff --git a/src/main/java/com/laytonsmith/abstraction/enums/MCSound.java b/src/main/java/com/laytonsmith/abstraction/enums/MCSound.java index 673f9ab4d..4d9c46802 100644 --- a/src/main/java/com/laytonsmith/abstraction/enums/MCSound.java +++ b/src/main/java/com/laytonsmith/abstraction/enums/MCSound.java @@ -1739,6 +1739,23 @@ public enum MCVanillaSound { ITEM_BUNDLE_INSERT_FAIL(MCVersion.MC1_21_3), UI_HUD_BUBBLE_POP(MCVersion.MC1_21_3), + // 1.21.4 additions + BLOCK_EYEBLOSSOM_CLOSE(MCVersion.MC1_21_4), + BLOCK_EYEBLOSSOM_CLOSE_LONG(MCVersion.MC1_21_4), + BLOCK_EYEBLOSSOM_IDLE(MCVersion.MC1_21_4), + BLOCK_EYEBLOSSOM_OPEN(MCVersion.MC1_21_4), + BLOCK_EYEBLOSSOM_OPEN_LONG(MCVersion.MC1_21_4), + BLOCK_RESIN_BREAK(MCVersion.MC1_21_4), + BLOCK_RESIN_BRICKS_BREAK(MCVersion.MC1_21_4), + BLOCK_RESIN_BRICKS_FALL(MCVersion.MC1_21_4), + BLOCK_RESIN_BRICKS_HIT(MCVersion.MC1_21_4), + BLOCK_RESIN_BRICKS_PLACE(MCVersion.MC1_21_4), + BLOCK_RESIN_BRICKS_STEP(MCVersion.MC1_21_4), + BLOCK_RESIN_FALL(MCVersion.MC1_21_4), + BLOCK_RESIN_PLACE(MCVersion.MC1_21_4), + BLOCK_RESIN_STEP(MCVersion.MC1_21_4), + ENTITY_CREAKING_TWITCH(MCVersion.MC1_21_4), + UNKNOWN(MCVersion.NEVER); private final MCVersion since; diff --git a/src/main/java/com/laytonsmith/abstraction/enums/MCTrimMaterial.java b/src/main/java/com/laytonsmith/abstraction/enums/MCTrimMaterial.java index 8418a98e0..bde88b5a7 100644 --- a/src/main/java/com/laytonsmith/abstraction/enums/MCTrimMaterial.java +++ b/src/main/java/com/laytonsmith/abstraction/enums/MCTrimMaterial.java @@ -71,6 +71,7 @@ public enum MCVanillaTrimMaterial { NETHERITE, QUARTZ, REDSTONE, + RESIN, UNKNOWN } } diff --git a/src/main/java/com/laytonsmith/abstraction/enums/MCVersion.java b/src/main/java/com/laytonsmith/abstraction/enums/MCVersion.java index fceebea53..4513cd591 100644 --- a/src/main/java/com/laytonsmith/abstraction/enums/MCVersion.java +++ b/src/main/java/com/laytonsmith/abstraction/enums/MCVersion.java @@ -74,6 +74,7 @@ public enum MCVersion implements Version { MC1_21, MC1_21_1, MC1_21_3, + MC1_21_4, MC1_21_X, MC1_X, MC2_X, diff --git a/src/main/java/com/laytonsmith/abstraction/enums/bukkit/BukkitMCParticle.java b/src/main/java/com/laytonsmith/abstraction/enums/bukkit/BukkitMCParticle.java index 0d8a1e4b5..f1e900a50 100644 --- a/src/main/java/com/laytonsmith/abstraction/enums/bukkit/BukkitMCParticle.java +++ b/src/main/java/com/laytonsmith/abstraction/enums/bukkit/BukkitMCParticle.java @@ -20,8 +20,11 @@ import org.bukkit.entity.Entity; import org.bukkit.inventory.ItemStack; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.EnumMap; import java.util.Map; +import java.util.Random; public class BukkitMCParticle extends MCParticle { @@ -147,11 +150,28 @@ public Object getParticleData(MCLocation l, Object data) { return 0; } case TRAIL: - if(data instanceof MCParticleData.TargetColor target) { - return new Particle.TargetColor((Location) target.location().getHandle(), - BukkitMCColor.GetColor(target.color())); + if(Static.getServer().getMinecraftVersion().gte(MCVersion.MC1_21_4)) { + try { + Class clazz = Class.forName("org.bukkit.Particle$Trail"); + Constructor constructor = clazz.getConstructor(Location.class, Color.class, int.class); + constructor.setAccessible(true); + if(data instanceof MCParticleData.Trail trail) { + return constructor.newInstance((Location) trail.location().getHandle(), + BukkitMCColor.GetColor(trail.color()), trail.duration()); + } else { + return constructor.newInstance((Location) l.getHandle(), Color.fromRGB(252, 120, 18), + new Random().nextInt(40) + 10); + } + } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException + | IllegalAccessException | InvocationTargetException ignore) {} } else { - return new Particle.TargetColor((Location) l.getHandle(), Color.fromRGB(252, 120, 18)); + // 1.21.3 only + if(data instanceof MCParticleData.Trail trail) { + return new Particle.TargetColor((Location) trail.location().getHandle(), + BukkitMCColor.GetColor(trail.color())); + } else { + return new Particle.TargetColor((Location) l.getHandle(), Color.fromRGB(252, 120, 18)); + } } } return null; diff --git a/src/main/java/com/laytonsmith/core/ObjectGenerator.java b/src/main/java/com/laytonsmith/core/ObjectGenerator.java index 85ff774cf..36c42803a 100644 --- a/src/main/java/com/laytonsmith/core/ObjectGenerator.java +++ b/src/main/java/com/laytonsmith/core/ObjectGenerator.java @@ -106,6 +106,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.regex.MatchResult; @@ -2652,9 +2653,18 @@ public Object particleData(MCParticle particleType, MCLocation l, CArray pa, Tar color = StaticLayer.GetConvertor().GetColor(c.val(), t); } } else { + // Default colors are 0xFC,0x78,0x12 (orange) and 0x5F,0x5F,0x5F (gray) + // when moving towards or away from the Creaking, respectively. color = StaticLayer.GetConvertor().GetColor(0xFC, 0x78, 0x12); } - return new MCParticleData.TargetColor(target, color); + int duration; + if(pa.containsKey("duration")) { + duration = ArgumentValidation.getInt32(pa.get("duration", t), t); + } else { + // Default duration is a random value from 0.5 to 2.5 seconds + duration = new Random().nextInt(40) + 10; + } + return new MCParticleData.Trail(target, color, duration); } return null; } diff --git a/src/main/java/com/laytonsmith/core/functions/Environment.java b/src/main/java/com/laytonsmith/core/functions/Environment.java index eca5057a3..47c6d10f3 100644 --- a/src/main/java/com/laytonsmith/core/functions/Environment.java +++ b/src/main/java/com/laytonsmith/core/functions/Environment.java @@ -1625,7 +1625,7 @@ public String docs() { + "
VIBRATION particles take a \"destination\" location array or entity UUID." + "
SCULK_CHARGE particles take an \"angle\" in radians. (defaults to 0.0)" + "
SHRIEK particles take an integer \"delay\" in ticks before playing. (defaults to 0)" - + "
TRAIL particles take a \"target\" location array and a \"color\"."; + + "
TRAIL particles take a \"target\" location array, a \"color\", and a \"duration\" integer in ticks."; } @Override diff --git a/src/main/resources/docs/Compatibility b/src/main/resources/docs/Compatibility index 35c57f587..a5df06368 100644 --- a/src/main/resources/docs/Compatibility +++ b/src/main/resources/docs/Compatibility @@ -3,7 +3,7 @@ In general, the compatibility requirements, if not listed, are the same as the p The minimum requirements for the current builds are: * Java 16 -* Spigot or Paper 1.16.5 - 1.21.3 (when used as a plugin) +* Spigot or Paper 1.16.5 - 1.21.4 (when used as a plugin) CommandHelper may still be backwards and forward compatible to a large degree. Many of the advanced features that normally have hard dependencies on certain versions of external dependencies have been configured to "soft" fail. @@ -20,6 +20,11 @@ Regardless, only the most current builds are officially supported. |- | | +| Added support for Spigot 1.21.4 +| Spigot 1.16.5 - 1.21.4 +|- +| 3.3.5 build-500 +| [https://github.com/EngineHub/CommandHelper/commit/62e47f3912789598ca41578e263b03207bccda49 62e47f3] | Added support for Spigot 1.21.3 | Spigot 1.16.5 - 1.21.3 |-