From 31c697e3c04cbabf8bd17df4274185a95b801ba4 Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Thu, 16 May 2024 17:59:26 -0400 Subject: [PATCH 1/9] first pass at updating lang entries --- src/main/resources/lang/default.lang | 336 ++++++++++++------ .../regressions/3284-itemcrack particle.sk | 2 +- 2 files changed, 228 insertions(+), 110 deletions(-) diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 21bfe5f6092..a67a10ed736 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1397,15 +1397,6 @@ visual effects: iron_golem_rose: name: iron golem offering rose @an pattern: (iron golem [offering] rose|rose in hand) - villager_heart: - name: villager hearts @x - pattern: villager hearts - villager_angry: - name: angry villager entity @an - pattern: angry villager entity - villager_happy: - name: happy villager entity @a - pattern: happy villager entity witch_magic: name: witch magic @- pattern: witch magic @@ -1458,39 +1449,15 @@ visual effects: name: hurt by explosion @- pattern: (hurt|damage) by explosion particle: - fireworks_spark: - name: firework's spark @- - pattern: firework['s] spark crit: name: critical hit @a pattern: (critical hit|crit) [spark] - crit_magic: - name: magical critical hit @a - pattern: (magic[al]|blue) (critical hit|crit) [spark] - spell_mob: - name: potion swirl @a - pattern: [%-color%] potion swirl - spell_mob_ambient: - name: transparent potion swirl @a - pattern: [%-color%] transparent potion swirl - spell: - name: spell @a - pattern: (spell|thrown potion|lingering potion) - spell_instant: - name: spell @a - pattern: instant (spell|thrown potion) - spell_witch: - name: witch spell @- - pattern: (witch (magic|spell)|purple spark) note: name: note @a pattern: note [(of|with) [colo[u]r] %number%] portal: name: portal @a pattern: [nether] portal - enchantment_table: - name: flying glyph @a - pattern: (flying (glyph|letter)|enchantment table) flame: name: flame @- pattern: (flame|fire) @@ -1500,69 +1467,12 @@ visual effects: footstep: name: footstep @x pattern: footsteps - water_splash: - name: water splash @a - pattern: [water] splash - smoke_normal: - name: smoke particle @a - pattern: smoke particle - explosion_huge: - name: huge explosion @a - pattern: huge explosion - explosion_large: - name: large explosion @a - pattern: large explosion - explosion_normal: - name: explosion @an - pattern: explosion - suspended_depth: - name: void fog @- - pattern: void fog - town_aura: - name: small smoke @- - pattern: (small smoke|town aura) cloud: name: cloud @a pattern: cloud - redstone: - name: coloured dust @- - pattern: [%-color%] [colo[u]red] dust - snowball: - name: snowball break @a - pattern: snowball break - drip_water: - name: water drip @a - pattern: water drip - drip_lava: - name: lava drip @a - pattern: lava drip - snow_shovel: - name: snow shovel @- - pattern: (snow shovel|snow(man| golem) spawn) - slime: - name: slime @- - pattern: slime heart: name: heart @a pattern: heart - villager_angry: - name: angry villager @a - pattern: (angry villager|[villager] thundercloud) - villager_happy: - name: happy villager @- - pattern: (happy villager|green spark) - smoke_large: - name: large smoke @- - pattern: large smoke - item_crack: - name: item crack @- - pattern: %itemtype% item (break|crack)[ing] - block_crack: - name: block break @- - pattern: %itemtype% break[ing] - block_dust: - name: block dust @- - pattern: [sprinting] dust of [%itemtype%] end_rod: name: end rod @- pattern: end rod @@ -1571,9 +1481,6 @@ visual effects: pattern: falling dust of [%itemtype%] # 1.11 particles - totem: - name: totem @- - pattern: totem spit: name: spit @- pattern: spit @@ -1632,24 +1539,9 @@ visual effects: dragon_breath: name: dragon breath @- pattern: dragon[s] breath - mob_appearance: - name: mob appearance @- - pattern: (mob appearance|guardian ghost) - suspended: - name: suspended @- - pattern: (suspended|underwater) sweep_attack: name: sweep attack @- pattern: sweep attack - water_bubble: - name: water bubble @- - pattern: water bubble - water_wake: - name: water wake @- - pattern: water wake - water_drop: - name: water drop @- - pattern: water drop # 1.15 particles dripping_honey: @@ -1765,7 +1657,7 @@ visual effects: shriek: name: shriek @- pattern: shriek - + # 1.19.4 particles dripping_cherry_leaves: name: dripping cherry leaves @- @@ -1776,6 +1668,232 @@ visual effects: landing_cherry_leaves: name: landing cherry leaves @- pattern: landing cherry leaves + cherry_leaves: # previously dripping_cherry_leaves/falling_cherry_leaves/landing_cherry_leaves, changed in 1.20 + name: cherry leaves @- + pattern: (dripping|falling|landing) cherry leaves + + # 1.20.5 particle changes + # many particles were removed and replaced with their modern names + + smoke_normal: + name: smoke particle @a + pattern: smoke particle + smoke: # previously smoke_normal, changed in 1.20.5 + name: smoke particle @a + pattern: smoke particle + + smoke_large: + name: large smoke @- + pattern: large smoke + large_smoke: # previous smoke_large, changed in 1.20.5 + name: large smoke @- + pattern: large smoke + + item_crack: + name: item crack @- + pattern: %itemtype% item (break|crack)[ing] + item: # previously item_crack, changed in 1.20.5 + name: item crack @- + pattern: %itemtype% item (break|crack)[ing] + + block_crack: + name: block break @- + pattern: %itemtype% break[ing] + block_dust: + name: block dust @- + pattern: [sprinting] dust of [%itemtype%] + block: # previously block_crack/block_dust, changed in 1.20.5 + name: block @- + pattern: (%itemtype% break[ing]|[sprinting] dust of [%itemtype%]) + + crit_magic: + name: magical critical hit @a + pattern: (magic[al]|blue) (critical hit|crit) [spark] + enchanted_hit: # previously crit_magic, changed in 1.20.5 + name: magical critical hit @a + pattern: (magic[al]|blue) (critical hit|crit) [spark] + + drip_water: + name: water drip @a + pattern: water drip + dripping_water: # previously drip_water, changed in 1.20.5 + name: water drip @a + pattern: water drip + + drip_lava: + name: lava drip @a + pattern: lava drip + dripping_lava: # previously drip_lava, changed in 1.20.5 + name: lava drip @a + pattern: lava drip + + enchantment_table: + name: flying glyph @a + pattern: (flying (glyph|letter)|enchantment table) + enchant: # previously enchantment_table, changed in 1.20.5 + name: flying glyph @a + pattern: (flying (glyph|letter)|enchantment table) + + explosion_normal: + name: explosion @an + pattern: explosion + poof: # previously explosion_normal, changed in 1.20.5 + name: explosion @an + pattern: explosion + + explosion_large: + name: large explosion @a + pattern: large explosion + explosion: # previously explosion_large, changed in 1.20.5 + name: large explosion @a + pattern: large explosion + + explosion_huge: + name: huge explosion @a + pattern: huge explosion + explosion_emitter: # previously explosion_huge, changed in 1.20.5 + name: huge explosion @a + pattern: huge explosion + + fireworks_spark: + name: firework's spark @- + pattern: firework['s] spark + firework: # previously fireworks_spark, changed in 1.20.5 + name: firework @- + pattern: firework['s] spark + + mob_appearance: + name: mob appearance @- + pattern: (mob appearance|guardian ghost) + elder_guardian: # previously mob_appearance, changed in 1.20.5 + name: elder guardian @- + pattern: (mob appearance|guardian ghost) + + redstone: + name: coloured dust @- + pattern: [%-color%] [colo[u]red] dust + dust: # previously redstone, changed in 1.20.5 + name: coloured dust @- + pattern: [%-color%] [colo[u]red] dust + + slime: + name: slime @- + pattern: slime + item_slime: # previously slime, changed in 1.20.5 + name: slime @- + pattern: slime + + snow_shovel: + name: snow shovel @- + pattern: (snow shovel|snow(man| golem) spawn) + item_snowball: # previously snow_shovel, changed in 1.20.5 + name: snow shovel @- + pattern: (snow shovel|snow(man| golem) spawn) + + snowball: + name: snowball break @a + pattern: snowball break + item_snowball: # previously snowball, changed in 1.20.5 + name: snowball break @a + pattern: snowball break + + spell: + name: spell @a + pattern: (spell|thrown potion|lingering potion) + effect: # previously spell, changed in 1.20.6 + name: effect @a + pattern: (spell|thrown potion) # lingering is part of entity_effect + + spell_instant: + name: spell @a + pattern: instant (spell|thrown potion) + effect_instant: # previously spell_instant, changed in 1.20.6 + name: instant effect @an + pattern: instant (spell|thrown potion) + + spell_mob: + name: potion swirl @a + pattern: [%-color%] potion swirl + spell_mob_ambient: + name: transparent potion swirl @a + pattern: [%-color%] transparent potion swirl + # TODO ambient_entity_effect seems to exist, but is not supported by spigot particle enum? + entity_effect: # previously spell_mob/spell_mob_ambient, changed in 1.20.5 + name: entity effect @an + pattern: (lingering potion|[%-color%] [transparent] potion swirl) + + spell_witch: + name: witch spell @- + pattern: (witch (magic|spell)|purple spark) + witch: # previously spell_witch, changed in 1.20.5 + name: witch spell @- + pattern: (witch (magic|spell)|purple spark) + + suspended: + name: suspended @- + pattern: (suspended|underwater) + suspended_depth: + name: void fog @- + pattern: void fog + underwater: # previously suspended/suspended_depth, changed in 1.20.5 + name: underwater @- + pattern: (suspended|underwater|void fog) + + totem: + name: totem @- + pattern: totem + totem_of_undying: # previously totem, changed in 1.20.5 + name: totem @- + pattern: totem + + town_aura: + name: small smoke @- + pattern: (small smoke|town aura) + mycelium: # previously town_aura, changed in 1.20.5 + name: small smoke @- + pattern: (small smoke|town aura) + + villager_angry: + name: angry villager @a + pattern: (angry villager|[villager] thundercloud) + angry_villager: # previously villager_angry, changed in 1.20.5 + name: angry villager @a + pattern: (angry villager|[villager] thundercloud) + + villager_happy: + name: happy villager @- + pattern: (happy villager|green spark) + happy_villager: # previously villager_happy, changed in 1.20.5 + name: happy villager @- + pattern: (happy villager|green spark) + + water_splash: + name: water splash @a + pattern: [water] splash + splash: # previously water_splash, changed in 1.20.5 + name: water splash @a + pattern: [water] splash + + water_bubble: + name: water bubble @- + pattern: water bubble + bubble: # previously water_bubble, changed in 1.20.5 + name: water bubble @- + pattern: water bubble + + water_wake: + name: water wake @- + pattern: water wake + fishing: + name: water wake @- + pattern: water wake + + water_drop: + name: water drop @- + pattern: water drop + rain: # previously water_drop, changed in 1.20.5 + name: water drop @- + pattern: water drop # -- Inventory Actions -- inventory actions: diff --git a/src/test/skript/tests/regressions/3284-itemcrack particle.sk b/src/test/skript/tests/regressions/3284-itemcrack particle.sk index 0390fb158bd..470e61948c4 100644 --- a/src/test/skript/tests/regressions/3284-itemcrack particle.sk +++ b/src/test/skript/tests/regressions/3284-itemcrack particle.sk @@ -1,3 +1,3 @@ -test "item crack particles" when running below minecraft "1.20.5": # item crack does not exist on 1.20.5 +test "item crack particles": set {_loc} to location of spawn of world "world" play diamond sword item crack at {_loc} From 957389f67445578f738a905bf8df2719d8e9040f Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Thu, 16 May 2024 22:14:55 -0400 Subject: [PATCH 2/9] Rewrite Particle lang entries A lot of particles probably don't work though --- .../skript/util/visual/VisualEffects.java | 8 +- src/main/resources/lang/default.lang | 854 ++++++++++-------- 2 files changed, 480 insertions(+), 382 deletions(-) diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java index 60014886646..c33f7135822 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java @@ -149,7 +149,7 @@ private static void registerDataSupplier(String id, BiFunction { + registerDataSupplier(OLD_REDSTONE_PARTICLE != null ? "Particle.REDSTONE" : "Particle.DUST", (raw, location) -> { Color color = raw == null ? defaultColor : (Color) raw; ParticleOption particleOption = new ParticleOption(color, 1); @@ -185,7 +185,7 @@ private static void registerDataSupplier(String id, BiFunction { + registerDataSupplier(OLD_ITEM_CRACK_PARTICLE != null ? "Particle.ITEM_CRACK" : "Particle.ITEM", (raw, location) -> { ItemStack itemStack = Aliases.javaItemType("iron sword").getRandom(); if (raw instanceof ItemType) { ItemStack rand = ((ItemType) raw).getRandom(); @@ -196,7 +196,7 @@ private static void registerDataSupplier(String id, BiFunction Date: Wed, 22 May 2024 11:14:18 -0400 Subject: [PATCH 3/9] Add a test --- .../tests/syntaxes/effects/EffVisualEffect.sk | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk diff --git a/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk new file mode 100644 index 00000000000..54360fa0241 --- /dev/null +++ b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk @@ -0,0 +1,112 @@ +# we want to ensure particles parse and play on all versions +test "visual effects": + set {_} to location of spawn of world "world" + play angry villager at {_} + play air breaking at {_} + play sprinting dust of air at {_} + play barrier at {_} + play bubble at {_} + play bubble column up at {_} + play bubble pop at {_} + play cloud at {_} + play crit at {_} + play current down at {_} + play dolphin at {_} + play dripping lava at {_} + play dripping water at {_} + play white dust at {_} + play effect at {_} + play egg crack at {_} + play elder guardian at {_} + play enchant at {_} + play enchanted hit at {_} + play end rod at {_} + play lingering potion at {_} + play white potion swirl at {_} + play white transparent potion swirl at {_} + play large explosion at {_} + play explosion emitter at {_} + play falling dust of air at {_} + play firework at {_} + play fishing at {_} + play flame at {_} + play happy villager at {_} + play instant effect at {_} + play air item break at {_} + play slime at {_} + play snowball at {_} + play snowball break at {_} + play large smoke at {_} + play lava pop at {_} + play mycelium at {_} + play nautilus at {_} + play note at {_} + play note of 5 at {_} + play poof at {_} + play portal at {_} + play rain at {_} + play smoke at {_} + play spit at {_} + play splash at {_} + play squid ink at {_} + play totem of undying at {_} + play suspended at {_} + play void fog at {_} + play witch at {_} + parse if running minecraft "1.14.4": + play campfire cosy smoke at {_} + play campfire signal smoke at {_} + play composter at {_} + play damage indicator at {_} + play dragon's breath at {_} + play falling lava at {_} + play falling water at {_} + play flash at {_} + play landing lava at {_} + play sneeze at {_} + play sweep attack at {_} + parse if running minecraft "1.15.2": + play dripping honey at {_} + play falling honey at {_} + play falling nectar at {_} + play landing honey at {_} + parse if running minecraft "1.16.5": + play ash at {_} + play crimson spore at {_} + play dripping obsidian tear at {_} + play falling obsidian tear at {_} + play landing obsidian tear at {_} + play reverse portal at {_} + play soul at {_} + play soul fire flame at {_} + play warped spore at {_} + play white ash at {_} + parse if running minecraft "1.17.1": + play light at {_} + play dripping dripstone lava at {_} + play dripping dripstone water at {_} + play dust color transition from white to white with size 1 at {_} + play falling dripstone lava at {_} + play falling dripstone water at {_} + play falling spore blossom at {_} + play glow at {_} + play glow squid ink at {_} + play scrape at {_} + play small flame at {_} + play snowflake at {_} + play spore blossom air at {_} + play vibration at {_} + play wax off at {_} + play wax on at {_} + parse if running minecraft "1.18.2": + play air block marker at {_} + parse if running minecraft "1.19.4": + play sculk charge at {_} + play sculk charge pop at {_} + play sculk soul at {_} + play shriek at {_} + play sonic boom at {_} + parse if running minecraft "1.20.6": + play cherry leaves at {_} + play dust plume at {_} + play white smoke at {_} From 3e92469d6ac52e7877607c6d82c8c010701b94df Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Wed, 22 May 2024 11:49:30 -0400 Subject: [PATCH 4/9] Fix block marker particles --- .../java/ch/njol/skript/util/visual/VisualEffect.java | 10 ++++++++++ .../java/ch/njol/skript/util/visual/VisualEffects.java | 6 ++++++ src/main/resources/lang/default.lang | 8 ++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java index 194fd833bbe..818691c279e 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java @@ -20,11 +20,14 @@ package ch.njol.skript.util.visual; import ch.njol.skript.Skript; +import ch.njol.skript.aliases.Aliases; +import ch.njol.skript.aliases.ItemType; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.SyntaxElement; import ch.njol.util.Kleenean; import ch.njol.yggdrasil.YggdrasilSerializable; +import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Location; import org.bukkit.Particle; @@ -45,6 +48,9 @@ public class VisualEffect implements SyntaxElement, YggdrasilSerializable { private float speed = 0f; private float dX, dY, dZ = 0f; + private static final ItemType barrier = Aliases.javaItemType("barrier"); + private static final ItemType light = Aliases.javaItemType("light"); + public VisualEffect() {} @SuppressWarnings({"null", "ConstantConditions"}) @@ -54,6 +60,10 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye if (exprs.length > 4 && exprs[0] != null) { data = exprs[0].getSingle(null); + } else if (parseResult.hasTag("barrierbm")) { // barrier backcompat + data = Bukkit.createBlockData(barrier.getMaterial()); + } else if (parseResult.hasTag("lightbm")) { // light backcompat + data = Bukkit.createBlockData(light.getMaterial()); } if ((parseResult.mark & 1) != 0) { diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java index c33f7135822..3ad1db20e13 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java @@ -225,6 +225,12 @@ private static void registerDataSupplier(String id, BiFunction { + if (raw == null) + return Bukkit.createBlockData(Material.AIR); + return raw; + }); + generateTypes(); }); } diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 26034d37b1f..b1709d8f232 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1471,13 +1471,13 @@ visual effects: name: block dust @- pattern: [sprinting] dust of %itemtype% - block_marker: # added in 1.18 TODO barrier/light backcompat support? + block_marker: # added in 1.18 name: block marker @a - pattern: %itemtype% block marker - barrier: # added in 1.18 TODO remove when 1.17 and below support is dropped + pattern: (barrierbm:barrier|lightbm:light|%-blockdata% block marker) + barrier: name: barrier @a pattern: barrier - light: # added in 1.17 TODO remove when 1.17 and below support is dropped (and only existed for 1 version) + light: # added in 1.17 name: light @- pattern: light From 0643a677978c97c7695f1a4e85d94b4445dcbc13 Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Wed, 22 May 2024 12:47:42 -0400 Subject: [PATCH 5/9] Add support for multiple expressions in a particle pattern --- .../ch/njol/skript/util/visual/VisualEffect.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java index 818691c279e..aa0e95568bd 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java @@ -25,6 +25,7 @@ import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.SyntaxElement; +import ch.njol.skript.lang.util.ContextlessEvent; import ch.njol.util.Kleenean; import ch.njol.yggdrasil.YggdrasilSerializable; import org.bukkit.Bukkit; @@ -59,7 +60,17 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye type = VisualEffects.get(matchedPattern); if (exprs.length > 4 && exprs[0] != null) { - data = exprs[0].getSingle(null); + int exprCount = exprs.length - 4; // some effects might have multiple expressions + ContextlessEvent event = ContextlessEvent.get(); + if (exprCount == 1) { + data = exprs[0].getSingle(event); + } else { // provide an array of expression values + Object[] dataArray = new Object[exprCount]; + for (int i = 0; i < exprCount; i++) { + dataArray[i] = exprs[i].getSingle(event); + } + data = dataArray; + } } else if (parseResult.hasTag("barrierbm")) { // barrier backcompat data = Bukkit.createBlockData(barrier.getMaterial()); } else if (parseResult.hasTag("lightbm")) { // light backcompat From ffb92913be6bc8c5c797f024d468257c9edb1c56 Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Wed, 22 May 2024 13:58:26 -0400 Subject: [PATCH 6/9] first pass at new data suppliers --- .../njol/skript/util/visual/VisualEffect.java | 23 +-- .../skript/util/visual/VisualEffects.java | 178 +++++++++--------- src/main/resources/lang/default.lang | 30 +-- .../tests/syntaxes/effects/EffVisualEffect.sk | 4 +- 4 files changed, 118 insertions(+), 117 deletions(-) diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java index aa0e95568bd..59071c65bca 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java @@ -20,8 +20,6 @@ package ch.njol.skript.util.visual; import ch.njol.skript.Skript; -import ch.njol.skript.aliases.Aliases; -import ch.njol.skript.aliases.ItemType; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.SyntaxElement; @@ -31,6 +29,7 @@ import org.bukkit.Bukkit; import org.bukkit.Effect; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -40,8 +39,6 @@ public class VisualEffect implements SyntaxElement, YggdrasilSerializable { - private static final boolean HAS_REDSTONE_DATA = Skript.classExists("org.bukkit.Particle$DustOptions"); - private VisualEffectType type; @Nullable @@ -49,11 +46,8 @@ public class VisualEffect implements SyntaxElement, YggdrasilSerializable { private float speed = 0f; private float dX, dY, dZ = 0f; - private static final ItemType barrier = Aliases.javaItemType("barrier"); - private static final ItemType light = Aliases.javaItemType("light"); - public VisualEffect() {} - + @SuppressWarnings({"null", "ConstantConditions"}) @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { @@ -63,18 +57,17 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye int exprCount = exprs.length - 4; // some effects might have multiple expressions ContextlessEvent event = ContextlessEvent.get(); if (exprCount == 1) { - data = exprs[0].getSingle(event); + data = exprs[0] != null ? exprs[0].getSingle(event) : null; } else { // provide an array of expression values Object[] dataArray = new Object[exprCount]; - for (int i = 0; i < exprCount; i++) { - dataArray[i] = exprs[i].getSingle(event); - } + for (int i = 0; i < exprCount; i++) + dataArray[i] = exprs[i] != null ? exprs[i].getSingle(event) : null; data = dataArray; } } else if (parseResult.hasTag("barrierbm")) { // barrier backcompat - data = Bukkit.createBlockData(barrier.getMaterial()); + data = Bukkit.createBlockData(Material.BARRIER); } else if (parseResult.hasTag("lightbm")) { // light backcompat - data = Bukkit.createBlockData(light.getMaterial()); + data = Bukkit.createBlockData(Material.LIGHT); } if ((parseResult.mark & 1) != 0) { @@ -121,7 +114,7 @@ public void play(@Nullable Player[] ps, Location l, @Nullable Entity e, int coun } // Some particles use offset as RGB color codes - if (type.isColorable() && (!HAS_REDSTONE_DATA || particle != (VisualEffects.OLD_REDSTONE_PARTICLE != null ? VisualEffects.OLD_REDSTONE_PARTICLE : Particle.DUST)) && data instanceof ParticleOption) { + if (type.isColorable() && data instanceof ParticleOption) { ParticleOption option = ((ParticleOption) data); dX = option.getRed(); dY = option.getGreen(); diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java index 3ad1db20e13..876b1849165 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java @@ -29,13 +29,15 @@ import ch.njol.skript.util.ColorRGB; import ch.njol.skript.util.Direction; import ch.njol.skript.util.SkriptColor; +import ch.njol.skript.util.Timespan; import ch.njol.skript.variables.Variables; import ch.njol.util.StringUtils; import ch.njol.util.coll.iterator.SingleItemIterator; import org.bukkit.*; +import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Entity; import org.bukkit.inventory.ItemStack; -import org.bukkit.material.MaterialData; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.eclipse.jdt.annotation.Nullable; @@ -53,7 +55,6 @@ public class VisualEffects { private static final boolean NEW_EFFECT_DATA = Skript.classExists("org.bukkit.block.data.BlockData"); - private static final boolean HAS_REDSTONE_DATA = Skript.classExists("org.bukkit.Particle$DustOptions"); private static final Map> effectTypeModifiers = new HashMap<>(); private static SyntaxElementInfo elementInfo; @@ -120,37 +121,15 @@ private static void registerDataSupplier(String id, BiFunction { if (visualEffectTypes != null) // Already registered return; - // Colorables - registerColorable("Particle.SPELL_MOB"); - registerColorable("Particle.SPELL_MOB_AMBIENT"); - registerColorable(OLD_REDSTONE_PARTICLE != null ? "Particle.REDSTONE" : "Particle.DUST"); - registerColorable("Particle.NOTE"); // Data suppliers registerDataSupplier("Effect.POTION_BREAK", (raw, location) -> @@ -161,74 +140,103 @@ private static void registerDataSupplier(String id, BiFunction { - Color color = raw == null ? defaultColor : (Color) raw; - return new ParticleOption(color, 1); - }); - registerDataSupplier("Particle.SPELL_MOB_AMBIENT", (raw, location) -> { - Color color = raw == null ? defaultColor : (Color) raw; + /* + * Particles with BlockData DataType + */ + final BiFunction blockDataSupplier = (raw, location) -> { + if (raw == null) + return Bukkit.createBlockData(Material.AIR); + if (raw instanceof ItemType) + return Bukkit.createBlockData(((ItemType) raw).getRandom().getType()); + return raw; + }; + registerDataSupplier("Particle.BLOCK", blockDataSupplier); + registerDataSupplier("Particle.BLOCK_CRACK", blockDataSupplier); + registerDataSupplier("Particle.BLOCK_DUST", blockDataSupplier); + + registerDataSupplier("Particle.BLOCK_MARKER", blockDataSupplier); + + registerDataSupplier("Particle.DUST_PILLAR", blockDataSupplier); + + registerDataSupplier("Particle.FALLING_DUST", blockDataSupplier); + + /* + * Particles with DustOptions DataType + */ + final Color defaultColor = SkriptColor.LIGHT_RED; + final BiFunction dustOptionsSupplier = (raw, location) -> { + Color color = raw != null ? (Color) raw : defaultColor; + return new Particle.DustOptions(color.asBukkitColor(), 1); + }; + registerDataSupplier("Particle.DUST", dustOptionsSupplier); + registerDataSupplier("Particle.REDSTONE", dustOptionsSupplier); + + /* + * Particles with Color DataType + */ + // TODO make sure returning a regular color is valid + registerDataSupplier("Particle.ENTITY_EFFECT", (raw, location) -> raw != null ? raw : defaultColor); + final BiFunction oldColorSupplier = (raw, location) -> { + Color color = raw != null ? (Color) raw : defaultColor; return new ParticleOption(color, 1); - }); - registerDataSupplier(OLD_REDSTONE_PARTICLE != null ? "Particle.REDSTONE" : "Particle.DUST", (raw, location) -> { - Color color = raw == null ? defaultColor : (Color) raw; - ParticleOption particleOption = new ParticleOption(color, 1); + }; + registerColorable("Particle.SPELL_MOB"); + registerDataSupplier("Particle.SPELL_MOB", oldColorSupplier); + registerColorable("Particle.SPELL_MOB_AMBIENT"); + registerDataSupplier("Particle.SPELL_MOB_AMBIENT", oldColorSupplier); - if (HAS_REDSTONE_DATA && (OLD_REDSTONE_PARTICLE == null || OLD_REDSTONE_PARTICLE.getDataType() == Particle.DustOptions.class)) { - return new Particle.DustOptions(particleOption.getBukkitColor(), particleOption.size); + final BiFunction itemStackSupplier = (raw, location) -> { + ItemStack itemStack; + if (raw instanceof ItemType) { + itemStack = ((ItemType) raw).getRandom(); } else { - return particleOption; + itemStack = new ItemStack(Material.IRON_SWORD); } + if (IS_ITEM_CRACK_MATERIAL) + return itemStack.getType(); + return itemStack; + }; + registerDataSupplier("Particle.ITEM", itemStackSupplier); + registerDataSupplier("Particle.ITEM_CRACK", itemStackSupplier); + + /* + * Particles with other DataTypes + */ + registerDataSupplier("Particle.DUST_COLOR_TRANSITION", (raw, location) -> { + Object[] data = (Object[]) raw; + Color fromColor = data[0] != null ? (Color) data[0] : defaultColor; + Color toColor = data[1] != null ? (Color) data[1] : defaultColor; + float size = data[2] != null ? (Float) data[2] : 1; // TODO what is the default size? + return new Particle.DustTransition(fromColor.asBukkitColor(), toColor.asBukkitColor(), size); }); + + // uses color differently + registerColorable("Particle.NOTE"); + // TODO test how this works registerDataSupplier("Particle.NOTE", (raw, location) -> { int colorValue = (int) (((Number) raw).floatValue() * 255); ColorRGB color = new ColorRGB(colorValue, 0, 0); return new ParticleOption(color, 1); }); - registerDataSupplier(OLD_ITEM_CRACK_PARTICLE != null ? "Particle.ITEM_CRACK" : "Particle.ITEM", (raw, location) -> { - ItemStack itemStack = Aliases.javaItemType("iron sword").getRandom(); - if (raw instanceof ItemType) { - ItemStack rand = ((ItemType) raw).getRandom(); - if (rand != null) - itemStack = rand; - } else if (raw != null) { - return raw; - } - assert itemStack != null; - if (OLD_ITEM_CRACK_PARTICLE != null && OLD_ITEM_CRACK_PARTICLE.getDataType() == Material.class) - return itemStack.getType(); - return itemStack; - }); - - BiFunction crackDustBiFunction = (raw, location) -> { - if (raw == null) { - return Material.STONE.getData(); - } else if (raw instanceof ItemType) { - ItemStack rand = ((ItemType) raw).getRandom(); - if (NEW_EFFECT_DATA) { - return Bukkit.createBlockData(rand != null ? rand.getType() : Material.STONE); - } else { - if (rand == null) - return Material.STONE.getData(); - - @SuppressWarnings("deprecation") - MaterialData type = rand.getData(); - assert type != null; - return type; - } - } else { - return raw; - } - }; - registerDataSupplier("Particle.BLOCK_CRACK", crackDustBiFunction); - registerDataSupplier("Particle.BLOCK_DUST", crackDustBiFunction); - registerDataSupplier("Particle.FALLING_DUST", crackDustBiFunction); - - registerDataSupplier("Particle.BLOCK_MARKER", (raw, location) -> { - if (raw == null) - return Bukkit.createBlockData(Material.AIR); - return raw; + // TODO what is the default value + registerDataSupplier("Particle.SCULK_CHARGE", (raw, location) -> raw != null ? raw : 0); // Float DataType + + // TODO what is the default value + registerDataSupplier("Particle.SHRIEK", (raw, location) -> raw != null ? raw : 0); // Integer DataType + + registerDataSupplier("Particle.VIBRATION", (raw, location) -> { + Object[] data = (Object[]) raw; + int arrivalTime = 20; // TODO what is the default arrival time? + if (data[1] != null) + arrivalTime = (int) Math.min(Math.max(((Timespan) data[1]).getTicks(), 0), Integer.MAX_VALUE); + if (data[0] instanceof Entity) + return new Vibration(new Vibration.Destination.EntityDestination((Entity) data[0]), arrivalTime); + // assume it's a block or some other location + Location destinationLocation = location; + if (data[0] instanceof Location) + destinationLocation = (Location) data[0]; + return new Vibration(new Vibration.Destination.BlockDestination(destinationLocation), arrivalTime); }); generateTypes(); diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index b1709d8f232..31ffe617cca 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1463,17 +1463,17 @@ visual effects: block: # added in 1.20.5 name: block @- - pattern: (%-itemtype% break[ing]|[sprinting] dust of %-itemtype%) + pattern: (%-blockdata/itemtype% break[ing]|[sprinting] dust of %-blockdata/itemtype%) block_crack: # for versions below 1.20.5 name: block break @- - pattern: %itemtype% break[ing] + pattern: %blockdata/itemtype% break[ing] block_dust: # for versions below 1.20.5 name: block dust @- - pattern: [sprinting] dust of %itemtype% + pattern: [sprinting] dust of %blockdata/itemtype% block_marker: # added in 1.18 name: block marker @a - pattern: (barrierbm:barrier|lightbm:light|%-blockdata% block marker) + pattern: (barrierbm:barrier|lightbm:light|%-blockdata/itemtype% block marker) barrier: name: barrier @a pattern: barrier @@ -1577,13 +1577,13 @@ visual effects: name: coloured dust @- pattern: [%-color%] [colo[u]red] dust - dust_color_transition: # added in 1.17 TODO this was disabled? + dust_color_transition: # added in 1.17 name: dust color transition @a - pattern: dust colo[u]r transition [from %-color%] [to %-color%] [with size %-number%] + pattern: dust colo[u]r transition [from %-color%] [to %-color%] [with size %-float%] dust_pillar: # added in 1.20.5 (for 1.21) name: dust pillar @a - pattern: dust pillar # TODO has BlockData DataType + pattern: %blockdata/itemtype% dust pillar dust_plume: # added in 1.20.3 name: dust plume @a @@ -1665,7 +1665,7 @@ visual effects: falling_dust: name: falling dust @- - pattern: falling dust of %itemtype% + pattern: falling dust of %blockdata/itemtype% falling_honey: # added in 1.15 name: falling honey @- @@ -1819,7 +1819,7 @@ visual effects: note: name: note @a - pattern: note [(of|with) [colo[u]r] %number%] # TODO does not have color on new versions? + pattern: note [(of|with) [colo[u]r] %number%] ominous_spawning: # added in 1.20.5 (for 1.21) name: ominous spawning @- @@ -1855,9 +1855,9 @@ visual effects: name: scrape @- pattern: scrape - sculk_charge: # added in 1.19 TODO has Float as DataType + sculk_charge: # added in 1.19 TODO figure out what the DataType does and adjust pattern name: sculk charge @- - pattern: sculk charge + pattern: %float% sculk charge sculk_charge_pop: # added in 1.19 name: sculk charge pop @- @@ -1867,9 +1867,9 @@ visual effects: name: sculk soul @- pattern: sculk soul - shriek: # added in 1.19 TODO has Integer as DataType + shriek: # added in 1.19 TODO figure out what the DataType does and adjust pattern name: shriek @- - pattern: shriek + pattern: %integer% shriek small_flame: # added in 1.17 name: small flame @a @@ -1962,9 +1962,9 @@ visual effects: name: vault connection @- pattern: vault connection - vibration: # added in 1.17 TODO has Vibration as DataType + vibration: # added in 1.17 name: vibration @a - pattern: vibration + pattern: vibration [to %-entity/location% over %-timespan%] warped_spore: # added in 1.16 name: warped spore @a diff --git a/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk index 54360fa0241..abdd89d48b8 100644 --- a/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk +++ b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk @@ -101,10 +101,10 @@ test "visual effects": parse if running minecraft "1.18.2": play air block marker at {_} parse if running minecraft "1.19.4": - play sculk charge at {_} + play 1 sculk charge at {_} play sculk charge pop at {_} play sculk soul at {_} - play shriek at {_} + play 1 shriek at {_} play sonic boom at {_} parse if running minecraft "1.20.6": play cherry leaves at {_} From 4d0c177f655aee2f01aad0369f9f1e6ec3a87da4 Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Wed, 22 May 2024 14:58:25 -0400 Subject: [PATCH 7/9] Fix a few issues related to new suppliers --- .../njol/skript/util/visual/VisualEffect.java | 6 ++++-- .../njol/skript/util/visual/VisualEffects.java | 18 +++++++++++++----- src/main/resources/lang/default.lang | 2 +- .../tests/syntaxes/effects/EffVisualEffect.sk | 2 +- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java index 59071c65bca..ba65f9576f5 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java @@ -53,7 +53,7 @@ public VisualEffect() {} public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { type = VisualEffects.get(matchedPattern); - if (exprs.length > 4 && exprs[0] != null) { + if (exprs.length > 4) { int exprCount = exprs.length - 4; // some effects might have multiple expressions ContextlessEvent event = ContextlessEvent.get(); if (exprCount == 1) { @@ -64,7 +64,9 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye dataArray[i] = exprs[i] != null ? exprs[i].getSingle(event) : null; data = dataArray; } - } else if (parseResult.hasTag("barrierbm")) { // barrier backcompat + } + + if (parseResult.hasTag("barrierbm")) { // barrier backcompat data = Bukkit.createBlockData(Material.BARRIER); } else if (parseResult.hasTag("lightbm")) { // light backcompat data = Bukkit.createBlockData(Material.LIGHT); diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java index 876b1849165..b4c84437436 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java @@ -21,6 +21,7 @@ import ch.njol.skript.Skript; import ch.njol.skript.aliases.Aliases; import ch.njol.skript.aliases.ItemType; +import ch.njol.skript.bukkitutil.ItemUtils; import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.lang.SyntaxElementInfo; import ch.njol.skript.localization.Language; @@ -144,6 +145,10 @@ private static void registerDataSupplier(String id, BiFunction blockDataSupplier = (raw, location) -> { + if (raw instanceof Object[]) { // workaround for modern pattern since it contains a choice + Object[] data = (Object[]) raw; + raw = data[0] != null ? data[0] : data[1]; + } if (raw == null) return Bukkit.createBlockData(Material.AIR); if (raw instanceof ItemType) @@ -175,7 +180,11 @@ private static void registerDataSupplier(String id, BiFunction raw != null ? raw : defaultColor); + registerDataSupplier("Particle.ENTITY_EFFECT", (raw, location) -> { + if (raw == null) + return defaultColor.asBukkitColor(); + return ((Color) raw).asBukkitColor(); + }); final BiFunction oldColorSupplier = (raw, location) -> { Color color = raw != null ? (Color) raw : defaultColor; return new ParticleOption(color, 1); @@ -186,12 +195,11 @@ private static void registerDataSupplier(String id, BiFunction itemStackSupplier = (raw, location) -> { - ItemStack itemStack; - if (raw instanceof ItemType) { + ItemStack itemStack = null; + if (raw instanceof ItemType) itemStack = ((ItemType) raw).getRandom(); - } else { + if (itemStack == null || ItemUtils.isAir(itemStack.getType())) // item crack air is not allowed itemStack = new ItemStack(Material.IRON_SWORD); - } if (IS_ITEM_CRACK_MATERIAL) return itemStack.getType(); return itemStack; diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 31ffe617cca..09bc6ddad44 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1756,7 +1756,7 @@ visual effects: pattern: instant (effect|spell|thrown potion) item: # added in 1.20.5 - name: item crack @- + name: item @- pattern: %itemtype% item (break|crack)[ing] item_crack: # for versions below 1.20.5 name: item crack @- diff --git a/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk index abdd89d48b8..e982067af6d 100644 --- a/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk +++ b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk @@ -32,7 +32,7 @@ test "visual effects": play flame at {_} play happy villager at {_} play instant effect at {_} - play air item break at {_} + play iron sword item break at {_} play slime at {_} play snowball at {_} play snowball break at {_} From 3d6490bd4535bd46d56b4d13942f43d47761106b Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Thu, 23 May 2024 11:48:39 -0400 Subject: [PATCH 8/9] Data supplier touchups --- .../njol/skript/util/visual/VisualEffect.java | 4 +- .../skript/util/visual/VisualEffects.java | 46 +++++++++++-------- src/main/resources/lang/default.lang | 15 +++--- .../tests/syntaxes/effects/EffVisualEffect.sk | 8 ++-- 4 files changed, 42 insertions(+), 31 deletions(-) diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java index ba65f9576f5..7965ba5c722 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffect.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffect.java @@ -66,9 +66,9 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } } - if (parseResult.hasTag("barrierbm")) { // barrier backcompat + if (parseResult.hasTag("barrierbm")) { // barrier compatibility data = Bukkit.createBlockData(Material.BARRIER); - } else if (parseResult.hasTag("lightbm")) { // light backcompat + } else if (parseResult.hasTag("lightbm")) { // light compatibility data = Bukkit.createBlockData(Material.LIGHT); } diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java index b4c84437436..fd9589e4e38 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java @@ -19,7 +19,6 @@ package ch.njol.skript.util.visual; import ch.njol.skript.Skript; -import ch.njol.skript.aliases.Aliases; import ch.njol.skript.aliases.ItemType; import ch.njol.skript.bukkitutil.ItemUtils; import ch.njol.skript.lang.SkriptParser; @@ -35,7 +34,6 @@ import ch.njol.util.StringUtils; import ch.njol.util.coll.iterator.SingleItemIterator; import org.bukkit.*; -import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; import org.bukkit.inventory.ItemStack; @@ -141,6 +139,8 @@ private static void registerDataSupplier(String id, BiFunction dustOptionsSupplier = (raw, location) -> { - Color color = raw != null ? (Color) raw : defaultColor; - return new Particle.DustOptions(color.asBukkitColor(), 1); + Object[] data = (Object[]) raw; + Color color = data[0] != null ? (Color) data[0] : defaultColor; + float size = data[1] != null ? (Float) data[1] : 1; + return new Particle.DustOptions(color.asBukkitColor(), size); }; registerDataSupplier("Particle.DUST", dustOptionsSupplier); registerDataSupplier("Particle.REDSTONE", dustOptionsSupplier); @@ -179,7 +181,6 @@ private static void registerDataSupplier(String id, BiFunction { if (raw == null) return defaultColor.asBukkitColor(); @@ -214,7 +215,7 @@ private static void registerDataSupplier(String id, BiFunction raw != null ? raw : 0); // Float DataType + // Float DataType, represents "the angle the particle displays at in radians" + registerDataSupplier("Particle.SCULK_CHARGE", (raw, location) -> raw != null ? raw : 0); - // TODO what is the default value - registerDataSupplier("Particle.SHRIEK", (raw, location) -> raw != null ? raw : 0); // Integer DataType + // Integer DataType, represents "the delay in ticks" + registerDataSupplier("Particle.SHRIEK", (raw, location) -> { + int delay = 0; + if (raw instanceof Timespan) + delay = (int) Math.min(Math.max(((Timespan) raw).getTicks(), 0), Integer.MAX_VALUE); + return delay; + }); registerDataSupplier("Particle.VIBRATION", (raw, location) -> { Object[] data = (Object[]) raw; - int arrivalTime = 20; // TODO what is the default arrival time? + int arrivalTime = -1; if (data[1] != null) arrivalTime = (int) Math.min(Math.max(((Timespan) data[1]).getTicks(), 0), Integer.MAX_VALUE); - if (data[0] instanceof Entity) - return new Vibration(new Vibration.Destination.EntityDestination((Entity) data[0]), arrivalTime); - // assume it's a block or some other location - Location destinationLocation = location; - if (data[0] instanceof Location) - destinationLocation = (Location) data[0]; - return new Vibration(new Vibration.Destination.BlockDestination(destinationLocation), arrivalTime); + if (data[0] instanceof Entity) { + Entity entity = (Entity) data[0]; + if (arrivalTime == -1) + arrivalTime = (int) (location.distance(entity.getLocation()) / 20); + return new Vibration(new Vibration.Destination.EntityDestination(entity), arrivalTime); + } + // assume it's a location + Location destination = data[0] != null ? (Location) data[0] : location; + if (arrivalTime == -1) + arrivalTime = (int) (location.distance(destination) / 20); + return new Vibration(new Vibration.Destination.BlockDestination(destination), arrivalTime); }); generateTypes(); diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 09bc6ddad44..e9c55126caa 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1572,10 +1572,10 @@ visual effects: dust: # added in 1.20.5 name: dust @- - pattern: [%-color%] [colo[u]red] dust + pattern: [%-color%] [colo[u]red] dust [with size %-float%] redstone: # for versions below 1.20.5 name: coloured dust @- - pattern: [%-color%] [colo[u]red] dust + pattern: [%-color%] [colo[u]red] dust [with size %-float%] dust_color_transition: # added in 1.17 name: dust color transition @a @@ -1855,9 +1855,9 @@ visual effects: name: scrape @- pattern: scrape - sculk_charge: # added in 1.19 TODO figure out what the DataType does and adjust pattern + sculk_charge: # added in 1.19 name: sculk charge @- - pattern: %float% sculk charge + pattern: sculk charge [with ([a] roll|[an] angle) [of] %-float%] sculk_charge_pop: # added in 1.19 name: sculk charge pop @- @@ -1867,9 +1867,9 @@ visual effects: name: sculk soul @- pattern: sculk soul - shriek: # added in 1.19 TODO figure out what the DataType does and adjust pattern + shriek: # added in 1.19 name: shriek @- - pattern: %integer% shriek + pattern: shriek [with [a] delay [of] %-timespan%] small_flame: # added in 1.17 name: small flame @a @@ -1964,7 +1964,8 @@ visual effects: vibration: # added in 1.17 name: vibration @a - pattern: vibration [to %-entity/location% over %-timespan%] + # must be a literal, so you can't actually use this properly yet + pattern: vibration [to %-entity/location%] [over %-timespan%] warped_spore: # added in 1.16 name: warped spore @a diff --git a/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk index e982067af6d..39d02883f43 100644 --- a/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk +++ b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk @@ -14,7 +14,7 @@ test "visual effects": play dolphin at {_} play dripping lava at {_} play dripping water at {_} - play white dust at {_} + play white dust with size 2 at {_} play effect at {_} play egg crack at {_} play elder guardian at {_} @@ -95,16 +95,16 @@ test "visual effects": play small flame at {_} play snowflake at {_} play spore blossom air at {_} - play vibration at {_} + play vibration over 1 second at {_} play wax off at {_} play wax on at {_} parse if running minecraft "1.18.2": play air block marker at {_} parse if running minecraft "1.19.4": - play 1 sculk charge at {_} + play sculk charge with a roll of 1 at {_} play sculk charge pop at {_} play sculk soul at {_} - play 1 shriek at {_} + play shriek with a delay of 0 seconds at {_} play sonic boom at {_} parse if running minecraft "1.20.6": play cherry leaves at {_} From 99980df24cfb77306642a29c5c51c69e88882aa5 Mon Sep 17 00:00:00 2001 From: APickledWalrus Date: Thu, 23 May 2024 13:59:57 -0400 Subject: [PATCH 9/9] Fix broken particles --- .../skript/util/visual/VisualEffects.java | 40 +++++++++++-------- src/main/resources/lang/default.lang | 4 +- .../tests/syntaxes/effects/EffVisualEffect.sk | 2 +- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java index fd9589e4e38..dd9d31456c9 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java @@ -239,26 +239,32 @@ private static void registerDataSupplier(String id, BiFunction { - Object[] data = (Object[]) raw; - int arrivalTime = -1; - if (data[1] != null) - arrivalTime = (int) Math.min(Math.max(((Timespan) data[1]).getTicks(), 0), Integer.MAX_VALUE); - if (data[0] instanceof Entity) { - Entity entity = (Entity) data[0]; - if (arrivalTime == -1) - arrivalTime = (int) (location.distance(entity.getLocation()) / 20); - return new Vibration(new Vibration.Destination.EntityDestination(entity), arrivalTime); - } - // assume it's a location - Location destination = data[0] != null ? (Location) data[0] : location; - if (arrivalTime == -1) - arrivalTime = (int) (location.distance(destination) / 20); - return new Vibration(new Vibration.Destination.BlockDestination(destination), arrivalTime); - }); + registerDataSupplier("Particle.VIBRATION", (raw, location) -> VibrationUtils.buildVibration((Object[]) raw, location)); generateTypes(); }); } + // exists to avoid NoClassDefFoundError from Vibration + private static final class VibrationUtils { + private static Vibration buildVibration(Object[] data, Location location) { + int arrivalTime = -1; + if (data[1] != null) + arrivalTime = (int) Math.min(Math.max(((Timespan) data[1]).getTicks(), 0), Integer.MAX_VALUE); + if (data[0] instanceof Entity) { + Entity entity = (Entity) data[0]; + if (arrivalTime == -1) + arrivalTime = (int) (location.distance(entity.getLocation()) / 20); + //noinspection removal - new constructor only exists on newer versions + return new Vibration(location, new Vibration.Destination.EntityDestination(entity), arrivalTime); + } + // assume it's a location + Location destination = data[0] != null ? (Location) data[0] : location; + if (arrivalTime == -1) + arrivalTime = (int) (location.distance(destination) / 20); + //noinspection removal - new constructor only exists on newer versions + return new Vibration(location, new Vibration.Destination.BlockDestination(destination), arrivalTime); + } + } + } diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index e9c55126caa..9f7df2c9e4c 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1596,9 +1596,9 @@ visual effects: name: spell @a pattern: (effect|spell|thrown potion|lingering potion) - egg_crack: + egg_crack: # added in 1.20 name: egg crack @an - pattern: egg crack + pattern: [sniffer] egg crack elder_guardian: # added in 1.20.5 name: elder guardian @- diff --git a/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk index 39d02883f43..b8631e79cf2 100644 --- a/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk +++ b/src/test/skript/tests/syntaxes/effects/EffVisualEffect.sk @@ -16,7 +16,6 @@ test "visual effects": play dripping water at {_} play white dust with size 2 at {_} play effect at {_} - play egg crack at {_} play elder guardian at {_} play enchant at {_} play enchanted hit at {_} @@ -109,4 +108,5 @@ test "visual effects": parse if running minecraft "1.20.6": play cherry leaves at {_} play dust plume at {_} + play egg crack at {_} play white smoke at {_}