From 624c802a904c95634412cbfea9ef6fb5b3d9f3f9 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 22 Mar 2023 18:31:13 -0600 Subject: [PATCH 001/104] Fix gradle temp --- build.gradle | 12 ++++++---- .../skript/util/displays/SkriptDisplay.java | 5 ++++ .../skript/util/displays/package-info.java | 24 +++++++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 src/main/java/ch/njol/skript/util/displays/SkriptDisplay.java create mode 100644 src/main/java/ch/njol/skript/util/displays/package-info.java diff --git a/build.gradle b/build.gradle index 5782a98ceee..ef8818a6bed 100644 --- a/build.gradle +++ b/build.gradle @@ -220,11 +220,13 @@ void createTestTask(String name, String desc, String environments, int javaVersi project.findProperty('verbosity') ?: "null" ] - if (!gradle.taskGraph.hasTask(":tasks") && !gradle.startParameter.dryRun && modifiers.contains(Modifiers.PROFILE)) { - if (!project.hasProperty('profiler')) - throw new MissingPropertyException('Add parameter -Pprofiler=', 'profiler', String.class) - - args += '-agentpath:' + project.property('profiler') + '=port=8849,nowait' + doFirst { + if (!gradle.taskGraph.hasTask(":tasks") && !gradle.startParameter.dryRun && modifiers.contains(Modifiers.PROFILE)) { + if (!project.hasProperty('profiler')) + throw new MissingPropertyException('Add parameter -Pprofiler=', 'profiler', String.class) + + args += '-agentpath:' + project.property('profiler') + '=port=8849,nowait' + } } } } diff --git a/src/main/java/ch/njol/skript/util/displays/SkriptDisplay.java b/src/main/java/ch/njol/skript/util/displays/SkriptDisplay.java new file mode 100644 index 00000000000..100ce2d0b16 --- /dev/null +++ b/src/main/java/ch/njol/skript/util/displays/SkriptDisplay.java @@ -0,0 +1,5 @@ +package ch.njol.skript.util.displays; + +public class SkriptDisplay extends Display { + +} diff --git a/src/main/java/ch/njol/skript/util/displays/package-info.java b/src/main/java/ch/njol/skript/util/displays/package-info.java new file mode 100644 index 00000000000..a48cc39499d --- /dev/null +++ b/src/main/java/ch/njol/skript/util/displays/package-info.java @@ -0,0 +1,24 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) +package ch.njol.skript.util.displays; + +import org.eclipse.jdt.annotation.DefaultLocation; +import org.eclipse.jdt.annotation.NonNullByDefault; + From 0b69beaf9f57743ebe24a4c995be0a6c294178db Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 22 Mar 2023 20:03:51 -0600 Subject: [PATCH 002/104] Start on displays --- .../skript/classes/data/BukkitClasses.java | 53 ++++++++----- .../ch/njol/skript/sections/EffSecSpawn.java | 63 +++++++++++----- .../skript/util/displays/SkriptDisplay.java | 5 -- .../displays/ExprDisplayBillboard.java | 74 +++++++++++++++++++ .../expressions}/displays/package-info.java | 3 +- src/main/resources/lang/default.lang | 21 ++++++ 6 files changed, 174 insertions(+), 45 deletions(-) delete mode 100644 src/main/java/ch/njol/skript/util/displays/SkriptDisplay.java create mode 100644 src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java rename src/main/java/{ch/njol/skript/util => org/skriptlang/skript/expressions}/displays/package-info.java (94%) diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 99958b74a10..5f8a7dc9745 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -28,18 +28,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import ch.njol.util.coll.iterator.ArrayIterator; -import ch.njol.skript.classes.ClassInfo; -import ch.njol.skript.classes.ConfigurationSerializer; -import ch.njol.skript.classes.EnumClassInfo; -import ch.njol.skript.classes.Parser; -import ch.njol.skript.classes.Serializer; -import ch.njol.skript.lang.util.SimpleLiteral; -import ch.njol.skript.util.BlockUtils; -import ch.njol.skript.util.EnchantmentType; -import ch.njol.skript.util.PotionEffectUtils; -import ch.njol.skript.util.StringMode; -import io.papermc.paper.world.MoonPhase; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Difficulty; @@ -62,6 +50,8 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.EnchantmentOffer; import org.bukkit.entity.Cat; +import org.bukkit.entity.Display; +import org.bukkit.entity.Display.Billboard; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; @@ -92,18 +82,26 @@ import ch.njol.skript.aliases.ItemType; import ch.njol.skript.bukkitutil.EnchantmentUtils; import ch.njol.skript.bukkitutil.ItemUtils; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.ConfigurationSerializer; +import ch.njol.skript.classes.EnumClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.classes.Serializer; import ch.njol.skript.entity.EntityData; import ch.njol.skript.expressions.ExprDamageCause; import ch.njol.skript.expressions.base.EventValueExpression; import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.lang.util.SimpleLiteral; import ch.njol.skript.localization.Language; import ch.njol.skript.registrations.Classes; +import ch.njol.skript.util.BlockUtils; +import ch.njol.skript.util.EnchantmentType; +import ch.njol.skript.util.PotionEffectUtils; +import ch.njol.skript.util.StringMode; import ch.njol.util.StringUtils; import ch.njol.yggdrasil.Fields; +import io.papermc.paper.world.MoonPhase; -/** - * @author Peter Güttinger - */ public class BukkitClasses { public BukkitClasses() {} @@ -1489,11 +1487,26 @@ public String toVariableNameString(EnchantmentOffer eo) { if (Skript.classExists("io.papermc.paper.world.MoonPhase")) { Classes.registerClass(new EnumClassInfo<>(MoonPhase.class, "moonphase", "moon phases") - .user("(lunar|moon) ?phases?") - .name("Moon Phase") - .description("Represents the phase of a moon.") - .since("2.7") - .requiredPlugins("Paper 1.16+")); + .user("(lunar|moon) ?phases?") + .name("Moon Phase") + .description("Represents the phase of a moon.") + .since("2.7") + .requiredPlugins("Paper 1.16+")); + } + + if (Skript.classExists("org.bukkit.entity.Display")) { + Classes.registerClass(new ClassInfo<>(Display.class, "display") + .user("displays?") + .name("Display") + .description("A text display, block display or item display.") + .since("INSERT VERSION") + .defaultExpression(new EventValueExpression<>(Display.class)) + .changer(DefaultChangers.nonLivingEntityChanger)); + Classes.registerClass(new EnumClassInfo<>(Billboard.class, "billboard", "billboards") + .user("billboards?") + .name("Billboard") + .description("Represents the billboard setting of a display.") + .since("INSERT VERSION")); } } } diff --git a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java index 878fe70d1db..5176e01f8c5 100644 --- a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java +++ b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java @@ -36,6 +36,7 @@ import ch.njol.skript.variables.Variables; import ch.njol.util.Kleenean; import org.bukkit.Location; +import org.bukkit.entity.Display; import org.bukkit.entity.Entity; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -48,7 +49,7 @@ @Name("Spawn") @Description({ - "Spawn a creature. This can be used as an effect and as a section.", + "Spawns entities. This can be used as an effect and as a section.", "If it is used as a section, the section is run before the entity is added to the world.", "You can modify the entity in this section, using for example 'event-entity' or 'cow'. ", "Do note that other event values, such as 'player', won't work in this section." @@ -57,12 +58,36 @@ "spawn 3 creepers at the targeted block", "spawn a ghast 5 meters above the player", "spawn a zombie at the player:", - "\tset name of the zombie to \"\"" + "\tset name of the zombie to \"\"", + "", + "spawn a text display at location above player:", + "\tset billboard of event-display to center # allows the display to rotate around the center axis" }) @Since("1.0, 2.6.1 (with section)") public class EffSecSpawn extends EffectSection { + public static class DisplaySpawnEvent extends SpawnEvent { + + private final Display display; + + public DisplaySpawnEvent(Display display) { + super(display); + this.display = display; + } + + public Display getDisplay() { + return display; + } + + @Override + @NotNull + public HandlerList getHandlers() { + throw new IllegalStateException(); + } + } + public static class SpawnEvent extends Event { + private final Entity entity; public SpawnEvent(Entity entity) { @@ -82,24 +107,29 @@ public HandlerList getHandlers() { static { Skript.registerSection(EffSecSpawn.class, - "(spawn|summon) %entitytypes% [%directions% %locations%]", - "(spawn|summon) %number% of %entitytypes% [%directions% %locations%]" + "(spawn|summon) %entitytypes% [%directions% %locations%]", + "(spawn|summon) %number% of %entitytypes% [%directions% %locations%]" ); EventValues.registerEventValue(SpawnEvent.class, Entity.class, new Getter() { @Override - public Entity get(SpawnEvent spawnEvent) { - return spawnEvent.getEntity(); + public Entity get(SpawnEvent event) { + return event.getEntity(); + } + }, EventValues.TIME_NOW); + EventValues.registerEventValue(DisplaySpawnEvent.class, Display.class, new Getter() { + @Override + public Display get(DisplaySpawnEvent event) { + return event.getDisplay(); } }, EventValues.TIME_NOW); } @Nullable - public static Entity lastSpawned = null; + public static Entity lastSpawned; - @SuppressWarnings("NotNullFieldNotInitialized") private Expression locations; - @SuppressWarnings("NotNullFieldNotInitialized") private Expression types; + @Nullable private Expression amount; @@ -108,12 +138,9 @@ public Entity get(SpawnEvent spawnEvent) { @Override @SuppressWarnings("unchecked") - public boolean init(Expression[] exprs, - int matchedPattern, - Kleenean isDelayed, - ParseResult parseResult, - @Nullable SectionNode sectionNode, - @Nullable List triggerItems) { + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult, + @Nullable SectionNode sectionNode, @Nullable List triggerItems) { + amount = matchedPattern == 0 ? null : (Expression) (exprs[0]); types = (Expression) exprs[matchedPattern]; locations = Direction.combine((Expression) exprs[1 + matchedPattern], (Expression) exprs[2 + matchedPattern]); @@ -141,9 +168,9 @@ protected TriggerItem walk(Event event) { Consumer consumer; if (trigger != null) { - consumer = o -> { - lastSpawned = o; - SpawnEvent spawnEvent = new SpawnEvent(o); + consumer = entity -> { + lastSpawned = entity; + SpawnEvent spawnEvent = entity instanceof Display ? new DisplaySpawnEvent((Display) entity) : new SpawnEvent(entity); // Copy the local variables from the calling code to this section Variables.setLocalVariables(spawnEvent, localVars); TriggerItem.walk(trigger, spawnEvent); diff --git a/src/main/java/ch/njol/skript/util/displays/SkriptDisplay.java b/src/main/java/ch/njol/skript/util/displays/SkriptDisplay.java deleted file mode 100644 index 100ce2d0b16..00000000000 --- a/src/main/java/ch/njol/skript/util/displays/SkriptDisplay.java +++ /dev/null @@ -1,5 +0,0 @@ -package ch.njol.skript.util.displays; - -public class SkriptDisplay extends Display { - -} diff --git a/src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java new file mode 100644 index 00000000000..59b0d742f17 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java @@ -0,0 +1,74 @@ +package org.skriptlang.skript.expressions.displays; + +import org.bukkit.entity.Display; +import org.bukkit.entity.Display.Billboard; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.coll.CollectionUtils; + +@Name("Display Billboard") +@Description({ + "Sets the billboard setting of a display.", + "This describes the axes/points around which the display can pivot.", + "Displays spawn with the default setting as 'fixed'. Resetting this expression also does so." +}) +@Examples("set billboard of the last spawned text display to center") +@Since("INSERT VERSION") +public class ExprDisplayBillboard extends SimplePropertyExpression { + + static { + register(ExprDisplayBillboard.class, Billboard.class, "billboard", "displays"); + } + + @Override + @Nullable + public Billboard convert(Display display) { + return display.getBillboard(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + switch (mode) { + case ADD: + case DELETE: + case REMOVE: + case REMOVE_ALL: + break; + case RESET: + return CollectionUtils.array(); + case SET: + return CollectionUtils.array(Billboard.class); + } + return null; + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + if (mode == ChangeMode.RESET) { + for (Display display : getExpr().getArray(event)) + display.setBillboard(Billboard.FIXED); + return; + } + Billboard billboard = (Billboard) delta[0]; + for (Display display : getExpr().getArray(event)) + display.setBillboard(billboard); + } + + @Override + public Class getReturnType() { + return Billboard.class; + } + + @Override + protected String getPropertyName() { + return "billboard"; + } + +} diff --git a/src/main/java/ch/njol/skript/util/displays/package-info.java b/src/main/java/org/skriptlang/skript/expressions/displays/package-info.java similarity index 94% rename from src/main/java/ch/njol/skript/util/displays/package-info.java rename to src/main/java/org/skriptlang/skript/expressions/displays/package-info.java index a48cc39499d..e77bb58b241 100644 --- a/src/main/java/ch/njol/skript/util/displays/package-info.java +++ b/src/main/java/org/skriptlang/skript/expressions/displays/package-info.java @@ -17,8 +17,7 @@ * Copyright Peter Güttinger, SkriptLang team and contributors */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package ch.njol.skript.util.displays; +package org.skriptlang.skript.expressions.displays; import org.eclipse.jdt.annotation.DefaultLocation; import org.eclipse.jdt.annotation.NonNullByDefault; - diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 5e660d62c89..46e5a954afb 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1221,6 +1221,19 @@ entities: camel: name: camel¦s pattern: camel(|1¦s) + # 1.19.4 Entities + display: + name: display¦s + pattern: display(|1¦s) + block display: + name: block display¦s + pattern: block display(|1¦s) [[with block[s]] %-itemtypes%] + item display: + name: item display¦s + pattern: item display(|1¦s) [[with item[s]] %-itemtypes%] + text display: + name: text display¦s + pattern: text display(|1¦s) #Skript cannot do literal String currently [[with (string[s]|text)] %-strings%] # -- Heal Reasons -- heal reasons: @@ -1911,6 +1924,13 @@ moon phases: waxing_crescent: waxing crescent waxing_gibbous: waxing gibbous +# -- Display Billboards -- +billboards: + center: center, middle + fixed: fixed + horizontal: horizontal + vertical: vertical + # -- Boolean -- boolean: true: @@ -1979,6 +1999,7 @@ types: resourcepackstate: resource pack state¦s @a gene: panda gene¦s @a gamerulevalue: gamerule value¦s @a + billboard: billboard¦s @a # Skript weathertype: weather type¦s @a From 69bad76d93c96a8840470a7665ea6ac91eb20336 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 23 Mar 2023 00:13:20 -0600 Subject: [PATCH 003/104] Save --- .../skript/classes/data/BukkitClasses.java | 1 + .../displays/ExprDisplayBillboard.java | 18 ++++++++++++++++++ src/main/resources/lang/default.lang | 1 + src/test/skript/tests/misc/displays.sk | 7 +++++++ 4 files changed, 27 insertions(+) create mode 100644 src/test/skript/tests/misc/displays.sk diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 5f8a7dc9745..99ded76dde8 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -1502,6 +1502,7 @@ public String toVariableNameString(EnchantmentOffer eo) { .since("INSERT VERSION") .defaultExpression(new EventValueExpression<>(Display.class)) .changer(DefaultChangers.nonLivingEntityChanger)); + Classes.registerClass(new EnumClassInfo<>(Billboard.class, "billboard", "billboards") .user("billboards?") .name("Billboard") diff --git a/src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java index 59b0d742f17..ebbe21ffe5e 100644 --- a/src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java @@ -1,3 +1,21 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ package org.skriptlang.skript.expressions.displays; import org.bukkit.entity.Display; diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 46e5a954afb..93bbb590ec8 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1999,6 +1999,7 @@ types: resourcepackstate: resource pack state¦s @a gene: panda gene¦s @a gamerulevalue: gamerule value¦s @a + display: display¦s @a billboard: billboard¦s @a # Skript diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk new file mode 100644 index 00000000000..644ed50a860 --- /dev/null +++ b/src/test/skript/tests/misc/displays.sk @@ -0,0 +1,7 @@ + +test "spawn displays": + spawn a text display at spawn of world "world": + assert billboard of event-display is fixed with "default billboard was not fixed" + set billboard of event-display to center + assert billboard of event-display is center with "failed to set billboard to center" + clear event-display \ No newline at end of file From b8d1ed8e399a9adcc90248a06fb9290a4b538b28 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 23 Mar 2023 20:56:23 -0600 Subject: [PATCH 004/104] More work --- .../ch/njol/skript/sections/EffSecSpawn.java | 52 +++++-------------- src/main/resources/lang/default.lang | 6 +++ 2 files changed, 19 insertions(+), 39 deletions(-) diff --git a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java index 5176e01f8c5..d455a14bdc7 100644 --- a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java +++ b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java @@ -18,6 +18,17 @@ */ package ch.njol.skript.sections; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.util.Consumer; +import org.eclipse.jdt.annotation.Nullable; +import org.jetbrains.annotations.NotNull; + import ch.njol.skript.Skript; import ch.njol.skript.config.SectionNode; import ch.njol.skript.doc.Description; @@ -35,17 +46,6 @@ import ch.njol.skript.util.Getter; import ch.njol.skript.variables.Variables; import ch.njol.util.Kleenean; -import org.bukkit.Location; -import org.bukkit.entity.Display; -import org.bukkit.entity.Entity; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; -import org.bukkit.util.Consumer; -import org.eclipse.jdt.annotation.Nullable; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; @Name("Spawn") @Description({ @@ -66,26 +66,6 @@ @Since("1.0, 2.6.1 (with section)") public class EffSecSpawn extends EffectSection { - public static class DisplaySpawnEvent extends SpawnEvent { - - private final Display display; - - public DisplaySpawnEvent(Display display) { - super(display); - this.display = display; - } - - public Display getDisplay() { - return display; - } - - @Override - @NotNull - public HandlerList getHandlers() { - throw new IllegalStateException(); - } - } - public static class SpawnEvent extends Event { private final Entity entity; @@ -116,12 +96,6 @@ public Entity get(SpawnEvent event) { return event.getEntity(); } }, EventValues.TIME_NOW); - EventValues.registerEventValue(DisplaySpawnEvent.class, Display.class, new Getter() { - @Override - public Display get(DisplaySpawnEvent event) { - return event.getDisplay(); - } - }, EventValues.TIME_NOW); } @Nullable @@ -170,7 +144,7 @@ protected TriggerItem walk(Event event) { if (trigger != null) { consumer = entity -> { lastSpawned = entity; - SpawnEvent spawnEvent = entity instanceof Display ? new DisplaySpawnEvent((Display) entity) : new SpawnEvent(entity); + SpawnEvent spawnEvent = new SpawnEvent(entity); // Copy the local variables from the calling code to this section Variables.setLocalVariables(spawnEvent, localVars); TriggerItem.walk(trigger, spawnEvent); @@ -206,7 +180,7 @@ protected TriggerItem walk(Event event) { @Override public String toString(@Nullable Event event, boolean debug) { return "spawn " + (amount != null ? amount.toString(event, debug) + " of " : "") + - types.toString(event, debug) + " " + locations.toString(event, debug); + types.toString(event, debug) + " " + locations.toString(event, debug); } } diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 93bbb590ec8..d82424f0110 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1222,6 +1222,12 @@ entities: name: camel¦s pattern: camel(|1¦s) # 1.19.4 Entities + sniffer: + name: sniffer¦s + pattern: sniffer(|1¦s) + interaction: + name: interaction¦s + pattern: interaction(|1¦s) display: name: display¦s pattern: display(|1¦s) From 64c26353ff431b754ffb64c2e69b2df4b952f766 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 23 Mar 2023 21:33:58 -0600 Subject: [PATCH 005/104] update gradle.build --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c7b40fcedda..3b9e63f5888 100644 --- a/build.gradle +++ b/build.gradle @@ -217,7 +217,7 @@ void createTestTask(String name, String desc, String environments, int javaVersi project.findProperty('verbosity') ?: "null" ] - doFirst { + doLast { if (!gradle.taskGraph.hasTask(":tasks") && !gradle.startParameter.dryRun && modifiers.contains(Modifiers.PROFILE)) { if (!project.hasProperty('profiler')) throw new MissingPropertyException('Add parameter -Pprofiler=', 'profiler', String.class) From e98a5963c6635deffcb21a1c6dcf57f3d44012c9 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Fri, 24 Mar 2023 01:22:52 -0600 Subject: [PATCH 006/104] stash --- .../ch/njol/skript/entity/SimpleEntityData.java | 15 ++++++++------- src/test/skript/tests/misc/displays.sk | 8 ++++---- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/ch/njol/skript/entity/SimpleEntityData.java b/src/main/java/ch/njol/skript/entity/SimpleEntityData.java index 963244c9844..79f5f53e0ba 100644 --- a/src/main/java/ch/njol/skript/entity/SimpleEntityData.java +++ b/src/main/java/ch/njol/skript/entity/SimpleEntityData.java @@ -298,23 +298,22 @@ private static void addSuperEntity(String codeName, Class enti addSimpleEntity("warden", Warden.class); } - if (Skript.isRunningMinecraft(1,19,3)) + if (Skript.isRunningMinecraft(1, 19, 3)) addSimpleEntity("camel", Camel.class); - if (Skript.isRunningMinecraft(1,19,4)) { + if (Skript.isRunningMinecraft(1, 19, 4)) { addSimpleEntity("sniffer", Sniffer.class); addSimpleEntity("text display", TextDisplay.class); addSimpleEntity("item display", ItemDisplay.class); addSimpleEntity("block display", BlockDisplay.class); addSimpleEntity("interaction", Interaction.class); - addSimpleEntity("display", Display.class); } // Register zombie after Husk and Drowned to make sure both work addSimpleEntity("zombie", Zombie.class); // Register squid after glow squid to make sure both work addSimpleEntity("squid", Squid.class); - + // SuperTypes addSuperEntity("human", HumanEntity.class); addSuperEntity("damageable", Damageable.class); @@ -334,12 +333,14 @@ private static void addSuperEntity(String codeName, Class enti addSuperEntity("any fireball", Fireball.class); addSuperEntity("illager", Illager.class); addSuperEntity("spellcaster", Spellcaster.class); - if (Skript.classExists("org.bukkit.entity.Raider")) // Introduced in Spigot 1.14 + if (Skript.classExists("org.bukkit.entity.Raider")) // 1.14 addSuperEntity("raider", Raider.class); - if (Skript.classExists("org.bukkit.entity.Enemy")) // Introduced in Spigot 1.19.3 + if (Skript.classExists("org.bukkit.entity.Enemy")) // 1.19.3 addSuperEntity("enemy", Enemy.class); + if (Skript.classExists("org.bukkit.entity.Display")) // 1.19.4 + addSuperEntity("display", Display.class); } - + static { final String[] codeNames = new String[types.size()]; int i = 0; diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index 644ed50a860..222b032f6a2 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -1,7 +1,7 @@ test "spawn displays": spawn a text display at spawn of world "world": - assert billboard of event-display is fixed with "default billboard was not fixed" - set billboard of event-display to center - assert billboard of event-display is center with "failed to set billboard to center" - clear event-display \ No newline at end of file + assert billboard of display is fixed with "default billboard was not fixed" + set billboard of display to center + assert billboard of display is center with "failed to set billboard to center" + clear display \ No newline at end of file From 6454ad95224c198030267031ac38cf2ac9224848 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Mon, 10 Apr 2023 18:23:53 -0600 Subject: [PATCH 007/104] Progress so far --- build.gradle | 7 + src/main/java/ch/njol/skript/Skript.java | 1 + .../skript/classes/data/DefaultFunctions.java | 30 ++- .../njol/skript/classes/data/JavaClasses.java | 48 ++++- .../ch/njol/skript/effects/EffColorItems.java | 2 +- .../skript/expressions/ExprBlockData.java | 64 +++--- .../njol/skript/expressions/ExprColorOf.java | 101 +++++----- .../skript/expressions/ExprCoordinate.java | 185 ++++++++++++------ .../skript/registrations/DefaultClasses.java | 30 ++- .../java/ch/njol/skript/util/ColorRGB.java | 54 ++++- .../skript/util/visual/VisualEffects.java | 2 +- .../displays/ExprDisplayBillboard.java | 8 +- .../displays/ExprDisplayBrightness.java | 126 ++++++++++++ .../displays/ExprDisplayGlowOverride.java | 90 +++++++++ .../displays/ExprDisplayHeightWidth.java | 124 ++++++++++++ .../displays/ExprDisplayInterpolation.java | 124 ++++++++++++ .../displays/ExprDisplayShadow.java | 119 +++++++++++ .../ExprDisplayTransformationRotation.java | 100 ++++++++++ ...DisplayTransformationScaleTranslation.java | 109 +++++++++++ .../displays/ExprDisplayViewRange.java | 96 +++++++++ .../expressions/displays/package-info.java | 2 +- .../displays/text/package-info.java | 23 +++ src/main/resources/lang/default.lang | 10 - 23 files changed, 1283 insertions(+), 172 deletions(-) rename src/main/java/org/skriptlang/skript/{ => elements}/expressions/displays/ExprDisplayBillboard.java (88%) create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBrightness.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java rename src/main/java/org/skriptlang/skript/{ => elements}/expressions/displays/package-info.java (93%) create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/text/package-info.java diff --git a/build.gradle b/build.gradle index 081f1c9f84a..04463870177 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,14 @@ dependencies { shadow group: 'org.bstats', name: 'bstats-bukkit', version: '3.0.2' implementation group: 'io.papermc.paper', name: 'paper-api', version: '1.19.4-R0.1-SNAPSHOT' implementation group: 'org.eclipse.jdt', name: 'org.eclipse.jdt.annotation', version: '2.2.700' + + // Comes from Minecraft including Guava or Gson implementation group: 'com.google.code.findbugs', name: 'findbugs', version: '3.0.1' + + // bundled with Minecraft 1.19.4+ + implementation group: 'org.joml', name: 'joml', version: '1.10.5' + + // Plugin hook libraries implementation group: 'com.sk89q.worldguard', name: 'worldguard-legacy', version: '7.0.0-SNAPSHOT' implementation group: 'net.milkbowl.vault', name: 'Vault', version: '1.7.1', { exclude group: 'org.bstats', module: 'bstats-bukkit' diff --git a/src/main/java/ch/njol/skript/Skript.java b/src/main/java/ch/njol/skript/Skript.java index 4338a557a5d..1254d5dab07 100644 --- a/src/main/java/ch/njol/skript/Skript.java +++ b/src/main/java/ch/njol/skript/Skript.java @@ -542,6 +542,7 @@ public void onEnable() { try { getAddonInstance().loadClasses("ch.njol.skript", "conditions", "effects", "events", "expressions", "entity", "sections", "structures"); + getAddonInstance().loadClasses("org.skriptlang.skript", "elements"); } catch (final Exception e) { exception(e, "Could not load required .class files: " + e.getLocalizedMessage()); setEnabled(false); diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index d9c16f703af..eb4c451cdea 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -22,15 +22,18 @@ import java.math.RoundingMode; import java.util.Calendar; -import ch.njol.skript.lang.function.FunctionEvent; -import ch.njol.skript.lang.function.JavaFunction; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.util.Vector; +import org.eclipse.jdt.annotation.Nullable; +import org.joml.Quaternionf; +import ch.njol.skript.Skript; import ch.njol.skript.expressions.base.EventValueExpression; +import ch.njol.skript.lang.function.FunctionEvent; import ch.njol.skript.lang.function.Functions; +import ch.njol.skript.lang.function.JavaFunction; import ch.njol.skript.lang.function.Parameter; import ch.njol.skript.lang.function.SimpleJavaFunction; import ch.njol.skript.lang.util.SimpleLiteral; @@ -41,7 +44,6 @@ import ch.njol.util.Math2; import ch.njol.util.StringUtils; import ch.njol.util.coll.CollectionUtils; -import org.eclipse.jdt.annotation.Nullable; public class DefaultFunctions { @@ -466,11 +468,31 @@ public ColorRGB[] executeSimple(Object[][] params) { Long green = (Long) params[1][0]; Long blue = (Long) params[2][0]; - return CollectionUtils.array(new ColorRGB(red.intValue(), green.intValue(), blue.intValue())); + return CollectionUtils.array(ColorRGB.fromRGB(red.intValue(), green.intValue(), blue.intValue())); } }).description("Returns a RGB color from the given red, green and blue parameters.") .examples("dye player's leggings rgb(120, 30, 45)") .since("2.5"); + + if (Skript.classExists("org.joml.Quaternionf")) + Functions.registerFunction(new SimpleJavaFunction("quaternionf", new Parameter[] { + new Parameter<>("x", DefaultClasses.NUMBER, true, null), + new Parameter<>("x", DefaultClasses.NUMBER, true, null), + new Parameter<>("y", DefaultClasses.NUMBER, true, null), + new Parameter<>("z", DefaultClasses.NUMBER, true, null) + }, DefaultClasses.QUATERION.get(), true) { + @Override + public Quaternionf[] executeSimple(Object[][] params) { + double w = ((Number) params[0][0]).doubleValue(); + double x = ((Number) params[1][0]).doubleValue(); + double y = ((Number) params[2][0]).doubleValue(); + double z = ((Number) params[3][0]).doubleValue(); + return CollectionUtils.array(new Quaternionf(w, x, y, z)); + } + }).description("Returns a quaternion from the given w, x, y and z parameters.") + .examples("quaternionf(1.2, 5.6, 45.21, 10)") + .since("INSERT VERSION"); + } } diff --git a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java index 1f463e87361..74e642ea9f8 100644 --- a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java @@ -18,11 +18,19 @@ */ package ch.njol.skript.classes.data; +import java.util.regex.Pattern; + +import org.eclipse.jdt.annotation.Nullable; +import org.joml.Quaternionf; + +import ch.njol.skript.Skript; import ch.njol.skript.SkriptConfig; import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.Cloner; import ch.njol.skript.classes.NumberArithmetic; import ch.njol.skript.classes.Parser; import ch.njol.skript.classes.Serializer; +import ch.njol.skript.expressions.base.EventValueExpression; import ch.njol.skript.lang.ParseContext; import ch.njol.skript.lang.VariableString; import ch.njol.skript.lang.util.SimpleLiteral; @@ -32,9 +40,6 @@ import ch.njol.skript.util.Utils; import ch.njol.util.StringUtils; import ch.njol.yggdrasil.Fields; -import org.eclipse.jdt.annotation.Nullable; - -import java.util.regex.Pattern; public class JavaClasses { @@ -627,5 +632,42 @@ public boolean mustSyncDeserialization() { return false; } })); + + if (Skript.classExists("org.joml.Quaternionf")) + Classes.registerClass(new ClassInfo<>(Quaternionf.class, "quaternion") + .user("quaternionf?s?") + .name("Quaternion") + .description("Quaternions are used for representing four dimensions where all four numbers are real.") + .since("INSERT VERSION") + .parser(new Parser() { + public boolean canParse(ParseContext context) { + return false; + } + + @Override + public String toString(Quaternionf quaternion, int flags) { + return "w:" + Skript.toString(quaternion.w()) + ", x:" + Skript.toString(quaternion.x()) + ", y:" + Skript.toString(quaternion.y()) + ", z:" + Skript.toString(quaternion.z()); + } + + @Override + public String toVariableNameString(Quaternionf quaternion) { + return quaternion.w() + "," + quaternion.x() + "," + quaternion.y() + "," + quaternion.z(); + } + }) + .defaultExpression(new EventValueExpression<>(Quaternionf.class)) + .cloner(new Cloner() { + @Override + public Quaternionf clone(Quaternionf quaternion) { + try { + // Implements cloneable, but doesn't return a Quaternionf. + // org.joml improperly override. Returns Object. + return (Quaternionf) quaternion.clone(); + } catch (CloneNotSupportedException e) { + return null; + } + } + })); + } + } diff --git a/src/main/java/ch/njol/skript/effects/EffColorItems.java b/src/main/java/ch/njol/skript/effects/EffColorItems.java index 4da123e5d76..2abae9a8a88 100644 --- a/src/main/java/ch/njol/skript/effects/EffColorItems.java +++ b/src/main/java/ch/njol/skript/effects/EffColorItems.java @@ -94,7 +94,7 @@ protected Color[] get(Event e) { if (r == null || g == null || b == null) return null; - return CollectionUtils.array(new ColorRGB(r.intValue(), g.intValue(), b.intValue())); + return CollectionUtils.array(ColorRGB.fromRGB(r.intValue(), g.intValue(), b.intValue())); } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprBlockData.java b/src/main/java/ch/njol/skript/expressions/ExprBlockData.java index f93ae1a1d99..06a8e121351 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprBlockData.java +++ b/src/main/java/ch/njol/skript/expressions/ExprBlockData.java @@ -20,6 +20,7 @@ import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; +import org.bukkit.entity.BlockDisplay; import org.bukkit.event.Event; import org.eclipse.jdt.annotation.Nullable; @@ -28,31 +29,39 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; @Name("Block Data") -@Description("Get the block data associated with a block. This data can also be used to set blocks.") -@Examples({"set {data} to block data of target block", - "set block at player to {data}", - "set block data of target block to oak_stairs[facing=south;waterlogged=true]"}) -@RequiredPlugins("Minecraft 1.13+") -@Since("2.5, 2.5.2 (set)") -public class ExprBlockData extends SimplePropertyExpression { - +@Description({ + "Get the block data associated with a block.", + "This data can also be used to set blocks." +}) +@Examples({ + "set {_data} to block data of target block", + "set block at player to {_data}", + "", + "set block data of target block to oak_stairs[facing=south;waterlogged=true]" +}) +@Since("2.5, 2.5.2 (set), INSERT VERSION (block displays)") +public class ExprBlockData extends SimplePropertyExpression { + static { if (Skript.classExists("org.bukkit.block.data.BlockData")) - register(ExprBlockData.class, BlockData.class, "block[ ]data", "blocks"); + register(ExprBlockData.class, BlockData.class, "block[ ]data", Skript.isRunningMinecraft(1, 19, 4) ? "blocks/displays" : "blocks"); } - + @Nullable @Override - public BlockData convert(Block block) { - return block.getBlockData(); + public BlockData convert(Object object) { + if (object instanceof Block) + return ((Block) object).getBlockData(); + if (!(object instanceof BlockDisplay)) + return null; + return ((BlockDisplay) object).getBlock(); } - + @Nullable @Override public Class[] acceptChange(ChangeMode mode) { @@ -60,26 +69,29 @@ public Class[] acceptChange(ChangeMode mode) { return CollectionUtils.array(BlockData.class); return null; } - + @Override - public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { if (delta == null) return; - BlockData blockData = ((BlockData) delta[0]); - for (Block block : getExpr().getArray(e)) { - block.setBlockData(blockData); + for (Object object : getExpr().getArray(event)) { + if (object instanceof Block) { + ((Block) object).setBlockData(blockData); + } else if (object instanceof BlockDisplay) { + ((BlockDisplay) object).setBlock(blockData); + } } } - - @Override - protected String getPropertyName() { - return "block data"; - } - + @Override public Class getReturnType() { return BlockData.class; } - + + @Override + protected String getPropertyName() { + return "block data"; + } + } diff --git a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java index dd179b0d1e4..7ef5a9721ec 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java +++ b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java @@ -26,8 +26,11 @@ import org.bukkit.FireworkEffect; import org.bukkit.block.Block; import org.bukkit.block.BlockState; +import org.bukkit.entity.BlockDisplay; +import org.bukkit.entity.Display; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; +import org.bukkit.entity.TextDisplay; import org.bukkit.event.Event; import org.bukkit.inventory.ItemStack; import org.bukkit.material.Colorable; @@ -44,48 +47,54 @@ import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.util.Color; +import ch.njol.skript.util.ColorRGB; import ch.njol.skript.util.SkriptColor; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; @Name("Color of") -@Description("The color of an item, can also be used to color chat messages with \"<%color of ...%>this text is colored!\".") -@Examples({"on click on wool:", - " message \"This wool block is <%color of block%>%color of block%!\"", - " set the color of the block to black"}) -@Since("1.2") +@Description({ + "The color of an item", + "can also be used to color chat messages with \"<%color of ...%>this text is colored!\"." +}) +@Examples({ + "on click on wool:", + "\tmessage \"This wool block is <%color of block%>%color of block%!\"", + "\tset the color of the block to black" +}) +@Since("1.2, INSERT VERSION (displays)") public class ExprColorOf extends PropertyExpression { static { - register(ExprColorOf.class, Color.class, "colo[u]r[s]", "blocks/itemtypes/entities/fireworkeffects"); + register(ExprColorOf.class, Color.class, "colo[u]r[s]", "blocks/itemtypes/entities/fireworkeffects/displays"); } - - @SuppressWarnings("null") + @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { setExpr(exprs[0]); return true; } - - @SuppressWarnings("null") + @Override - protected Color[] get(Event e, Object[] source) { + protected Color[] get(Event event, Object[] source) { if (source instanceof FireworkEffect[]) { List colors = new ArrayList<>(); - for (FireworkEffect effect : (FireworkEffect[]) source) { effect.getColors().stream() .map(SkriptColor::fromBukkitColor) .forEach(colors::add); } - if (colors.size() == 0) return null; return colors.toArray(new Color[0]); } - return get(source, o -> { - Colorable colorable = getColorable(o); - + return get(source, object -> { + if (object instanceof Display) { + if (!(object instanceof TextDisplay)) + return null; + return ColorRGB.fromBukkitColor(((TextDisplay) object).getBackgroundColor()); + } + Colorable colorable = getColorable(object); if (colorable == null) return null; DyeColor dyeColor = colorable.getColor(); @@ -95,66 +104,51 @@ protected Color[] get(Event e, Object[] source) { }); } - @Override - public Class getReturnType() { - return Color.class; - } - - @Override - public String toString(@Nullable Event e, boolean debug) { - return "color of " + getExpr().toString(e, debug); - } - @Override @Nullable public Class[] acceptChange(ChangeMode mode) { Class returnType = getExpr().getReturnType(); - if (FireworkEffect.class.isAssignableFrom(returnType)) return CollectionUtils.array(Color[].class); - if (mode != ChangeMode.SET && !getExpr().isSingle()) return null; - if (Entity.class.isAssignableFrom(returnType)) return CollectionUtils.array(Color.class); else if (Block.class.isAssignableFrom(returnType)) return CollectionUtils.array(Color.class); if (ItemType.class.isAssignableFrom(returnType)) return CollectionUtils.array(Color.class); + if (Display.class.isAssignableFrom(returnType)) + return CollectionUtils.array(Color.class); return null; } - @SuppressWarnings("deprecated") @Override - public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { if (delta == null) return; - DyeColor color = ((Color) delta[0]).asDyeColor(); - - for (Object o : getExpr().getArray(e)) { - if (o instanceof Item || o instanceof ItemType) { - ItemStack stack = o instanceof Item ? ((Item) o).getItemStack() : ((ItemType) o).getRandom(); - + Color color = (Color) delta[0]; + for (Object object : getExpr().getArray(event)) { + if (object instanceof Item || object instanceof ItemType) { + ItemStack stack = object instanceof Item ? ((Item) object).getItemStack() : ((ItemType) object).getRandom(); if (stack == null) continue; MaterialData data = stack.getData(); - if (!(data instanceof Colorable)) continue; - ((Colorable) data).setColor(color); + ((Colorable) data).setColor(color.asDyeColor()); stack.setData(data); - if (o instanceof Item) - ((Item) o).setItemStack(stack); - } else if (o instanceof Block || o instanceof Colorable) { - Colorable colorable = getColorable(o); + if (object instanceof Item) + ((Item) object).setItemStack(stack); + } else if (object instanceof Block || object instanceof Colorable) { + Colorable colorable = getColorable(object); if (colorable != null) { try { - colorable.setColor(color); + colorable.setColor(color.asDyeColor()); } catch (UnsupportedOperationException ex) { // https://github.com/SkriptLang/Skript/issues/2931 Skript.error("Tried setting the color of a bed, but this isn't possible in your Minecraft version, " + @@ -162,9 +156,11 @@ public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { "Instead, set the block to right material, such as a blue bed."); // Let's just assume it's a bed } } - } else if (o instanceof FireworkEffect) { + } else if (object instanceof TextDisplay) { + ((TextDisplay) object).setBackgroundColor(color.asBukkitColor()); + } else if (object instanceof FireworkEffect) { Color[] input = (Color[]) delta; - FireworkEffect effect = ((FireworkEffect) o); + FireworkEffect effect = ((FireworkEffect) object); switch (mode) { case ADD: for (Color c : input) @@ -191,7 +187,16 @@ public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { } } - @SuppressWarnings("deprecated") + @Override + public Class getReturnType() { + return Color.class; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return "color of " + getExpr().toString(event, debug); + } + @Nullable private Colorable getColorable(Object colorable) { if (colorable instanceof Item || colorable instanceof ItemType) { @@ -201,12 +206,10 @@ private Colorable getColorable(Object colorable) { if (item == null) return null; MaterialData data = item.getData(); - if (data instanceof Colorable) return (Colorable) data; } else if (colorable instanceof Block) { BlockState state = ((Block) colorable).getState(); - if (state instanceof Colorable) return (Colorable) state; } else if (colorable instanceof Colorable) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java b/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java index 9adc517ab72..f213a67ce81 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java +++ b/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java @@ -21,6 +21,7 @@ import org.bukkit.Location; import org.bukkit.event.Event; import org.eclipse.jdt.annotation.Nullable; +import org.joml.Quaternionf; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.classes.Changer.ChangerUtils; @@ -33,90 +34,156 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; -/** - * @author Peter Güttinger - */ @Name("Coordinate") -@Description("Represents a given coordinate of a location. ") -@Examples({"player's y-coordinate is smaller than 40:", - " message \"Watch out for lava!\""}) -@Since("1.4.3") -public class ExprCoordinate extends SimplePropertyExpression { - +@Description("Represents a given coordinate of locations or quaternions.") +@Examples({ + "player's y-coordinate is smaller than 40:", + "\tmessage \"Watch out for lava!\"" +}) +@Since("1.4.3, INSERT VERSION (quaternions)") +public class ExprCoordinate extends SimplePropertyExpression { + static { - register(ExprCoordinate.class, Number.class, "(0¦x|1¦y|2¦z)(-| )(coord[inate]|pos[ition]|loc[ation])[s]", "locations"); + registerDefault(ExprCoordinate.class, Number.class, "(0¦w|1¦x|2¦y|3¦z)(-| )(coord[inate]|pos[ition]|loc[ation])[s]", "locations/quaternions"); } - - private final static char[] axes = {'x', 'y', 'z'}; - + + private final static char[] axes = {'w', 'x', 'y', 'z'}; + private int axis; - + @Override - public boolean init(final Expression[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) { - super.init(exprs, matchedPattern, isDelayed, parseResult); + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { axis = parseResult.mark; - return true; + return super.init(exprs, matchedPattern, isDelayed, parseResult); } - + @Override - public Number convert(final Location l) { - return axis == 0 ? l.getX() : axis == 1 ? l.getY() : l.getZ(); + public Number convert(Object object) { + if (object instanceof Location) { + if (axis == 0) + return null; + Location location = (Location) object; + return axis == 1 ? location.getX() : axis == 2 ? location.getY() : location.getZ(); + } else { + Quaternionf quaternion = (Quaternionf) object; + switch (axis) { + case 0: + return quaternion.w(); + case 1: + return quaternion.x(); + case 2: + return quaternion.y(); + case 3: + return quaternion.z(); + default: + return null; + } + } } - + @Override protected String getPropertyName() { - return "the " + axes[axis] + "-coordinate"; + return axes[axis] + "-coordinate"; } - + @Override public Class getReturnType() { return Number.class; } - + @Override @Nullable - public Class[] acceptChange(final ChangeMode mode) { + public Class[] acceptChange(ChangeMode mode) { + if (getExpr().getReturnType().equals(Quaternionf.class)) { + if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE)) + return new Class[] {Number.class}; + } if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) && getExpr().isSingle() && ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Location.class)) return new Class[] {Number.class}; return null; } - + @Override - public void change(final Event e, final @Nullable Object[] delta, final ChangeMode mode) throws UnsupportedOperationException { + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) throws UnsupportedOperationException { assert delta != null; - final Location l = getExpr().getSingle(e); - if (l == null) - return; - double n = ((Number) delta[0]).doubleValue(); - switch (mode) { - case REMOVE: - n = -n; - //$FALL-THROUGH$ - case ADD: - if (axis == 0) { - l.setX(l.getX() + n); - } else if (axis == 1) { - l.setY(l.getY() + n); - } else { - l.setZ(l.getZ() + n); - } - getExpr().change(e, new Location[] {l}, ChangeMode.SET); - break; - case SET: - if (axis == 0) { - l.setX(n); - } else if (axis == 1) { - l.setY(n); - } else { - l.setZ(n); + if (getExpr().getSingle(event) instanceof Location) { + Object object = getExpr().getSingle(event); + if (object == null) + return; + double value = ((Number) delta[0]).doubleValue(); + if (axis == 0) + return; + Location location = (Location) object; + switch (mode) { + case REMOVE: + value = -value; + //$FALL-THROUGH$ + case ADD: + if (axis == 1) { + location.setX(location.getX() + value); + } else if (axis == 2) { + location.setY(location.getY() + value); + } else if (axis == 3) { + location.setZ(location.getZ() + value); + } + getExpr().change(event, new Location[] {location}, ChangeMode.SET); + break; + case SET: + if (axis == 1) { + location.setX(value); + } else if (axis == 2) { + location.setY(value); + } else if (axis == 3) { + location.setZ(value); + } + getExpr().change(event, new Location[] {location}, ChangeMode.SET); + break; + case DELETE: + case REMOVE_ALL: + case RESET: + assert false; + } + } else { + for (Object object : getExpr().getArray(event)) { + float value = ((Number) delta[0]).floatValue(); + Quaternionf quaternion = (Quaternionf) object; + switch (mode) { + case REMOVE: + value = -value; + //$FALL-THROUGH$ + case ADD: + if (axis == 0) { + quaternion.set(quaternion.w() + value, quaternion.x(), quaternion.y(), quaternion.z()); + } else if (axis == 1) { + quaternion.set(quaternion.w(), quaternion.x() + value, quaternion.y(), quaternion.z()); + } else if (axis == 2) { + quaternion.set(quaternion.w(), quaternion.x(), quaternion.y() + value, quaternion.z()); + } else if (axis == 3) { + quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), quaternion.z() + value); + } + if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) + getExpr().change(event, new Quaternionf[] {quaternion}, ChangeMode.SET); + break; + case SET: + if (axis == 0) { + quaternion.set(value, quaternion.x(), quaternion.y(), quaternion.z()); + } else if (axis == 1) { + quaternion.set(quaternion.w(), value, quaternion.y(), quaternion.z()); + } else if (axis == 2) { + quaternion.set(quaternion.w(), quaternion.x(), value, quaternion.z()); + } else if (axis == 3) { + quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), value); + } + if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) + getExpr().change(event, new Quaternionf[] {quaternion}, ChangeMode.SET); + break; + case DELETE: + case REMOVE_ALL: + case RESET: + assert false; } - getExpr().change(e, new Location[] {l}, ChangeMode.SET); - break; - case DELETE: - case REMOVE_ALL: - case RESET: - assert false; + } } } - + } diff --git a/src/main/java/ch/njol/skript/registrations/DefaultClasses.java b/src/main/java/ch/njol/skript/registrations/DefaultClasses.java index 1d0f10448af..cc1a1ac38c9 100644 --- a/src/main/java/ch/njol/skript/registrations/DefaultClasses.java +++ b/src/main/java/ch/njol/skript/registrations/DefaultClasses.java @@ -18,10 +18,13 @@ */ package ch.njol.skript.registrations; +import java.util.Optional; + import org.bukkit.Location; import org.bukkit.World; import org.bukkit.util.Vector; import org.eclipse.jdt.annotation.NonNull; +import org.joml.Quaternionf; import ch.njol.skript.classes.ClassInfo; import ch.njol.skript.util.Color; @@ -30,29 +33,40 @@ // When using these fields, be aware all ClassInfo's must be registered! public class DefaultClasses { - + public static ClassInfo OBJECT = getClassInfo(Object.class); - + + // Java public static ClassInfo NUMBER = getClassInfo(Number.class); public static ClassInfo LONG = getClassInfo(Long.class); public static ClassInfo BOOLEAN = getClassInfo(Boolean.class); public static ClassInfo STRING = getClassInfo(String.class); - + + // Bukkit public static ClassInfo WORLD = getClassInfo(World.class); public static ClassInfo LOCATION = getClassInfo(Location.class); public static ClassInfo VECTOR = getClassInfo(Vector.class); - + + // Skript public static ClassInfo COLOR = getClassInfo(Color.class); public static ClassInfo DATE = getClassInfo(Date.class); public static ClassInfo TIMESPAN = getClassInfo(Timespan.class); - + + // Included + // 1.19.4+ + public static Optional> QUATERION = getOptionalClassInfo(Quaternionf.class); + @NonNull - private static ClassInfo getClassInfo(Class tClass) { + private static ClassInfo getClassInfo(Class type) { //noinspection ConstantConditions - ClassInfo classInfo = Classes.getExactClassInfo(tClass); + ClassInfo classInfo = Classes.getExactClassInfo(type); if (classInfo == null) throw new NullPointerException(); return classInfo; } - + + private static Optional> getOptionalClassInfo(Class type) { + return Optional.ofNullable(Classes.getExactClassInfo(type)); + } + } diff --git a/src/main/java/ch/njol/skript/util/ColorRGB.java b/src/main/java/ch/njol/skript/util/ColorRGB.java index 9982972fa85..26872153701 100644 --- a/src/main/java/ch/njol/skript/util/ColorRGB.java +++ b/src/main/java/ch/njol/skript/util/ColorRGB.java @@ -35,28 +35,67 @@ public class ColorRGB implements Color { private static final Pattern RGB_PATTERN = Pattern.compile("(?>rgb|RGB) (\\d+), (\\d+), (\\d+)"); private org.bukkit.Color bukkit; + @Nullable private DyeColor dye; - + + /** + * Subject to being private in the future. Use {@link #fromRGB(int, int, int)} + * This is to keep inline with other color classes. + */ + @Deprecated public ColorRGB(int red, int green, int blue) { - this.bukkit = org.bukkit.Color.fromRGB( + this(org.bukkit.Color.fromRGB( Math2.fit(0, red, 255), Math2.fit(0, green, 255), - Math2.fit(0, blue, 255)); + Math2.fit(0, blue, 255))); + } + + /** + * Subject to being private in the future. Use {@link #fromBukkitColor(org.bukkit.Color)} + * This is to keep inline with other color classes. + */ + @Deprecated + public ColorRGB(org.bukkit.Color bukkit) { this.dye = DyeColor.getByColor(bukkit); + this.bukkit = bukkit; } - + + /** + * Returns a ColorRGB object from the provided arguments. + * + * @param red + * @param green + * @param blue + * @return ColorRGB + */ + public static ColorRGB fromRGB(int red, int green, int blue) { + return new ColorRGB(red, green, blue); + } + + /** + * Returns a ColorRGB object from a bukkit color. + * + * @param red + * @param green + * @param blue + * @return ColorRGB + */ + public static ColorRGB fromBukkitColor(org.bukkit.Color bukkit) { + return new ColorRGB(bukkit); + } + @Override public org.bukkit.Color asBukkitColor() { return bukkit; } - + @Override @Nullable public DyeColor asDyeColor() { return dye; } - + @Override public String getName() { return "rgb " + bukkit.getRed() + ", " + bukkit.getGreen() + ", " + bukkit.getBlue(); @@ -78,7 +117,7 @@ public static ColorRGB fromString(String string) { public Fields serialize() throws NotSerializableException { return new Fields(this, Variables.yggdrasil); } - + @Override public void deserialize(Fields fields) throws StreamCorruptedException, NotSerializableException { org.bukkit.Color b = fields.getObject("bukkit", org.bukkit.Color.class); @@ -91,4 +130,5 @@ public void deserialize(Fields fields) throws StreamCorruptedException, NotSeria dye = d; bukkit = b; } + } 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 529887c5660..736d0ab3cdc 100644 --- a/src/main/java/ch/njol/skript/util/visual/VisualEffects.java +++ b/src/main/java/ch/njol/skript/util/visual/VisualEffects.java @@ -160,7 +160,7 @@ private static void registerDataSupplier(String id, BiFunction { int colorValue = (int) (((Number) raw).floatValue() * 255); - ColorRGB color = new ColorRGB(colorValue, 0, 0); + ColorRGB color = ColorRGB.fromRGB(colorValue, 0, 0); return new ParticleOption(color, 1); }); registerDataSupplier("Particle.ITEM_CRACK", (raw, location) -> { diff --git a/src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java similarity index 88% rename from src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java rename to src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java index ebbe21ffe5e..2ae4134a521 100644 --- a/src/main/java/org/skriptlang/skript/expressions/displays/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java @@ -16,13 +16,14 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.expressions.displays; +package org.skriptlang.skript.elements.expressions.displays; import org.bukkit.entity.Display; import org.bukkit.entity.Display.Billboard; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -33,7 +34,7 @@ @Name("Display Billboard") @Description({ - "Sets the billboard setting of a display.", + "Returns or changes the billboard setting of displays.", "This describes the axes/points around which the display can pivot.", "Displays spawn with the default setting as 'fixed'. Resetting this expression also does so." }) @@ -42,7 +43,8 @@ public class ExprDisplayBillboard extends SimplePropertyExpression { static { - register(ExprDisplayBillboard.class, Billboard.class, "billboard", "displays"); + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprDisplayBillboard.class, Billboard.class, "billboard", "displays"); } @Override diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBrightness.java new file mode 100644 index 00000000000..0a8d6e9fcd1 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBrightness.java @@ -0,0 +1,126 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays; + +import org.bukkit.entity.Display; +import org.bukkit.entity.Display.Brightness; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; + +@Name("Display Brightness") +@Description({ + "Returns or changes the block or sky brightness of displays.", + "Value must be between 0 and 15." +}) +@Examples("set sky brightness of the last spawned text display to 5") +@Since("INSERT VERSION") +public class ExprDisplayBrightness extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprDisplayBrightness.class, Integer.class, "(:sky|block) [light] brightness", "displays"); + } + + private boolean sky; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + sky = parseResult.hasTag("sky"); + return super.init(exprs, matchedPattern, isDelayed, parseResult); + } + + @Override + @Nullable + public Integer convert(Display display) { + Brightness brightness = display.getBrightness(); + return sky ? brightness.getSkyLight() : brightness.getBlockLight(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + return CollectionUtils.array(Number.class); + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + int change = delta == null ? 0 : (int) ((Number) delta[0]).intValue(); + change = Math.max(0, Math.min(15, change)); + switch (mode) { + case REMOVE_ALL: + case REMOVE: + change = -change; + case ADD: + Brightness brightness; + for (Display display : displays) { + Brightness current = display.getBrightness(); + if (sky) { + int value = current.getSkyLight() + change; + value = Math.max(0, Math.min(15, value)); + brightness = new Brightness(current.getBlockLight(), value); + } else { + int value = current.getBlockLight() + change; + value = Math.max(0, Math.min(15, value)); + brightness = new Brightness(value, current.getSkyLight()); + } + display.setBrightness(brightness); + } + break; + case DELETE: + case RESET: + for (Display display : displays) + display.setBrightness(null); + break; + case SET: + for (Display display : displays) { + Brightness current = display.getBrightness(); + if (sky) { + brightness = new Brightness(current.getBlockLight(), change); + } else { + brightness = new Brightness(change, current.getSkyLight()); + } + display.setBrightness(brightness); + } + break; + } + } + + @Override + public Class getReturnType() { + return Integer.class; + } + + @Override + protected String getPropertyName() { + return (sky ? "sky" : "block") + "brightness"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java new file mode 100644 index 00000000000..7273e4ba3e1 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java @@ -0,0 +1,90 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays; + +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.util.Color; +import ch.njol.skript.util.ColorRGB; +import ch.njol.util.coll.CollectionUtils; + +@Name("Display Glow Color Override") +@Description({ + "Returns or changes the glowing color override of displays.", + "This overrides whatever color is already presently set for the scoreboard of the displays." +}) +@Examples("set glow color override of the last spawned text display to blue") +@Since("INSERT VERSION") +public class ExprDisplayGlowOverride extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprDisplayGlowOverride.class, Color.class, "glow[ing] colo[u]r [override]", "displays"); + } + + @Override + @Nullable + public Color convert(Display display) { + if (display.getGlowColorOverride() == null) + return null; + return ColorRGB.fromBukkitColor(display.getGlowColorOverride()); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.SET || mode == ChangeMode.RESET || mode == ChangeMode.DELETE) + return CollectionUtils.array(Color.class); + return null; + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + if (mode != ChangeMode.SET) { + for (Display display : displays) + display.setGlowColorOverride(null); + return; + } + if (delta == null) + return; + Color color = (Color) delta[0]; + for (Display display : displays) + display.setGlowColorOverride(color.asBukkitColor()); + } + + @Override + public Class getReturnType() { + return Color.class; + } + + @Override + protected String getPropertyName() { + return "glow color override"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java new file mode 100644 index 00000000000..efdbd35c039 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java @@ -0,0 +1,124 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays; + +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; + +@Name("Display Height/Width") +@Description({ + "Returns or changes the height or width of displays.", + "Rendering culling bounding box spans horizontally width/2 from entity position, "+ + "and the part beyond will be culled.", + "If set to 0, no culling on both vertical and horizonal directions. Default is 0.0" +}) +@Examples("set height of the last spawned text display to 2.5") +@Since("INSERT VERSION") +public class ExprDisplayHeightWidth extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprDisplayHeightWidth.class, Float.class, "(:height|width)", "displays"); + } + + private boolean height; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + height = parseResult.hasTag("height"); + return super.init(exprs, matchedPattern, isDelayed, parseResult); + } + + @Override + @Nullable + public Float convert(Display display) { + return height ? display.getDisplayHeight() : display.getDisplayWidth(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + return CollectionUtils.array(Number.class); + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + float change = delta == null ? 0F : (int) ((Number) delta[0]).floatValue(); + change = Math.max(0F, change); + switch (mode) { + case REMOVE_ALL: + case REMOVE: + change = -change; + case ADD: + for (Display display : displays) { + if (height) { + float value = Math.max(0F, display.getDisplayHeight() + change); + display.setDisplayHeight(value); + } else { + float value = Math.max(0F, display.getDisplayWidth() + change); + display.setDisplayWidth(value); + } + } + break; + case DELETE: + case RESET: + for (Display display : displays) { + if (height) { + display.setDisplayHeight(0F); + } else { + display.setDisplayWidth(0F); + } + } + break; + case SET: + for (Display display : displays) { + if (height) { + display.setDisplayHeight(change); + } else { + display.setDisplayWidth(change); + } + } + break; + } + } + + @Override + public Class getReturnType() { + return Float.class; + } + + @Override + protected String getPropertyName() { + return height ? "height" : "width"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java new file mode 100644 index 00000000000..2c55deba9e0 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java @@ -0,0 +1,124 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays; + +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.util.Timespan; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; + +@Name("Display Interpolation Delay/Duration") +@Description({ + "Returns or changes the interpolation delay/duration of displays.", + "Interpolation delay is the amount of ticks before client-side interpolation will commence.", + "Setting to 0 seconds will make it immediate" +}) +@Examples("set interpolation delay of the last spawned text display to 2 ticks") +@Since("INSERT VERSION") +public class ExprDisplayInterpolation extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprDisplayInterpolation.class, Timespan.class, "interpolation (:delay|duration)", "displays"); + } + + private boolean delay; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + delay = parseResult.hasTag("delay"); + return super.init(exprs, matchedPattern, isDelayed, parseResult); + } + + @Override + @Nullable + public Timespan convert(Display display) { + return Timespan.fromTicks_i(delay ? display.getInterpolationDelay() : display.getInterpolationDuration()); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + return CollectionUtils.array(Timespan.class, Number.class); + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + int ticks = (int) (delta == null ? 0 : (delta[0] instanceof Number ? ((Number) delta[0]).intValue() : ((Timespan) delta[0]).getTicks_i())); + ticks = Math.max(0, ticks); + switch (mode) { + case REMOVE_ALL: + case REMOVE: + ticks = -ticks; + case ADD: + for (Display display : displays) { + if (delay) { + int value = Math.max(0, display.getInterpolationDelay() + ticks); + display.setInterpolationDelay(value); + } else { + int value = Math.max(0, display.getInterpolationDuration() + ticks); + display.setInterpolationDuration(value); + } + } + break; + case DELETE: + case RESET: + for (Display display : displays) { + if (delay) { + display.setInterpolationDelay(0); + } else { + display.setInterpolationDuration(0); + } + } + break; + case SET: + for (Display display : displays) { + if (delay) { + display.setInterpolationDelay(ticks); + } else { + display.setInterpolationDuration(ticks); + } + } + break; + } + } + + @Override + public Class getReturnType() { + return Timespan.class; + } + + @Override + protected String getPropertyName() { + return "interpolation " + (delay ? "delay" : "duration"); + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java new file mode 100644 index 00000000000..ecfc926fe9a --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java @@ -0,0 +1,119 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays; + +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; + +@Name("Display Shadow Radius/Strength") +@Description("Returns or changes the shadow radius/strength of displays.") +@Examples("set shadow radius of the last spawned text display to 1.75") +@Since("INSERT VERSION") +public class ExprDisplayShadow extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprDisplayShadow.class, Float.class, "(:radius|strength)", "displays"); + } + + private boolean radius; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + radius = parseResult.hasTag("radius"); + return super.init(exprs, matchedPattern, isDelayed, parseResult); + } + + @Override + @Nullable + public Float convert(Display display) { + return radius ? display.getShadowRadius() : display.getShadowStrength(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + return CollectionUtils.array(Number.class); + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + float change = delta == null ? 0F : (int) ((Number) delta[0]).floatValue(); + change = Math.max(0F, change); + switch (mode) { + case REMOVE_ALL: + case REMOVE: + change = -change; + case ADD: + for (Display display : displays) { + if (radius) { + float value = Math.max(0F, display.getShadowRadius() + change); + display.setShadowRadius(value); + } else { + float value = Math.max(0F, display.getShadowStrength() + change); + display.setShadowStrength(value); + } + } + break; + case DELETE: + case RESET: + for (Display display : displays) { + if (radius) { + display.setShadowRadius(0F); + } else { + display.setShadowStrength(0F); + } + } + break; + case SET: + for (Display display : displays) { + if (radius) { + display.setShadowRadius(change); + } else { + display.setShadowStrength(change); + } + } + break; + } + } + + @Override + public Class getReturnType() { + return Float.class; + } + + @Override + protected String getPropertyName() { + return radius ? "radius" : "strength"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java new file mode 100644 index 00000000000..1693d8869c8 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java @@ -0,0 +1,100 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays; + +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.bukkit.util.Transformation; +import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; + +@Name("Display Transformation Rotation") +@Description("Returns or changes the transformation rotation of displays.") +@Examples("set left transformation rotation of last spawned text display to quaternionf(1, 0, 0, 1)") +@Since("INSERT VERSION") +public class ExprDisplayTransformationRotation extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprDisplayTransformationRotation.class, Quaternionf.class, "(:left|right) transformation rotation", "displays"); + } + + private boolean left; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + left = parseResult.hasTag("left"); + return super.init(exprs, matchedPattern, isDelayed, parseResult); + } + + @Override + @Nullable + public Quaternionf convert(Display display) { + Transformation transformation = display.getTransformation(); + return left ? transformation.getLeftRotation() : transformation.getRightRotation(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.SET) + return CollectionUtils.array(Quaternionf.class); + return null; + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + if (delta == null) + return; + Quaternionf quaternion = (Quaternionf) delta[0]; + for (Display display : displays) { + Transformation transformation = display.getTransformation(); + Transformation change; + if (left) { + change = new Transformation(transformation.getTranslation(), quaternion, transformation.getScale(), transformation.getRightRotation()); + } else { + change = new Transformation(transformation.getTranslation(), transformation.getLeftRotation(), transformation.getScale(), quaternion); + } + display.setTransformation(change); + } + } + + @Override + public Class getReturnType() { + return Quaternionf.class; + } + + @Override + protected String getPropertyName() { + return (left ? "left" : "right") + " transformation rotation"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java new file mode 100644 index 00000000000..9861453da6c --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java @@ -0,0 +1,109 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays; + +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.bukkit.util.Transformation; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; + +@Name("Display Transformation Scale/Translation") +@Description("Returns or changes the transformation scale or translation of displays.") +@Examples("set left transformation translation of last spawned text display to the angle between vector 2, 0, 0 and vector 0, 2, 1") +@Since("INSERT VERSION") +public class ExprDisplayTransformationScaleTranslation extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprDisplayTransformationScaleTranslation.class, Vector.class, "transformation (:scale|translation)", "displays"); + } + + private boolean scale; + + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + scale = parseResult.hasTag("scale"); + return super.init(exprs, matchedPattern, isDelayed, parseResult); + } + + @Override + @Nullable + public Vector convert(Display display) { + Transformation transformation = display.getTransformation(); + return toBukkitVector(scale ? transformation.getScale() : transformation.getTranslation()); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + if (mode == ChangeMode.SET) + return CollectionUtils.array(Vector.class); + return null; + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + if (delta == null) + return; + Vector3f vector = toVector((Vector) delta[0]); + for (Display display : displays) { + Transformation transformation = display.getTransformation(); + Transformation change; + if (scale) { + change = new Transformation(transformation.getTranslation(), transformation.getLeftRotation(), vector, transformation.getRightRotation()); + } else { + change = new Transformation(vector, transformation.getLeftRotation(), transformation.getScale(), transformation.getRightRotation()); + } + display.setTransformation(change); + } + } + + private Vector toBukkitVector(Vector3f vector) { + return new Vector(vector.x, vector.y, vector.z); + } + + private Vector3f toVector(Vector vector) { + return new Vector3f((float)vector.getX(), (float)vector.getY(), (float)vector.getZ()); + } + + @Override + public Class getReturnType() { + return Vector.class; + } + + @Override + protected String getPropertyName() { + return "transformation " + (scale ? "scale" : "translation"); + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java new file mode 100644 index 00000000000..eb81822aa45 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java @@ -0,0 +1,96 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays; + +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.coll.CollectionUtils; + +@Name("Display View Range") +@Description({ + "Returns or changes the view range of displays.", + "Default value is 1.0." +}) +@Examples("set view range of the last spawned text display to 2.7") +@Since("INSERT VERSION") +public class ExprDisplayViewRange extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprDisplayViewRange.class, Float.class, "view (range|radius)", "displays"); + } + + @Override + @Nullable + public Float convert(Display display) { + return display.getViewRange(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + return CollectionUtils.array(Number.class); + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + float change = delta == null ? 0F : (int) ((Number) delta[0]).floatValue(); + change = Math.max(0F, change); + switch (mode) { + case REMOVE_ALL: + case REMOVE: + change = -change; + case ADD: + for (Display display : displays) { + float value = Math.max(0F, display.getViewRange() + change); + display.setViewRange(value); + } + break; + case DELETE: + case RESET: + for (Display display : displays) + display.setViewRange(1.0F); + break; + case SET: + for (Display display : displays) + display.setViewRange(change); + break; + } + } + + @Override + public Class getReturnType() { + return Float.class; + } + + @Override + protected String getPropertyName() { + return "view range"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/expressions/displays/package-info.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/package-info.java similarity index 93% rename from src/main/java/org/skriptlang/skript/expressions/displays/package-info.java rename to src/main/java/org/skriptlang/skript/elements/expressions/displays/package-info.java index e77bb58b241..b59625add9f 100644 --- a/src/main/java/org/skriptlang/skript/expressions/displays/package-info.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/package-info.java @@ -17,7 +17,7 @@ * Copyright Peter Güttinger, SkriptLang team and contributors */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package org.skriptlang.skript.expressions.displays; +package org.skriptlang.skript.elements.expressions.displays; import org.eclipse.jdt.annotation.DefaultLocation; import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/package-info.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/package-info.java new file mode 100644 index 00000000000..ba79ce2e8a7 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/package-info.java @@ -0,0 +1,23 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) +package org.skriptlang.skript.elements.expressions.displays.text; + +import org.eclipse.jdt.annotation.DefaultLocation; +import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 2c64f3a9d7a..a07d369e753 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1233,15 +1233,6 @@ entities: pattern: display(|1¦s) block display: name: block display¦s -<<<<<<< HEAD - pattern: block display(|1¦s) [[with block[s]] %-itemtypes%] - item display: - name: item display¦s - pattern: item display(|1¦s) [[with item[s]] %-itemtypes%] - text display: - name: text display¦s - pattern: text display(|1¦s) #Skript cannot do literal String currently [[with (string[s]|text)] %-strings%] -======= pattern: block display(|1¦s) item display: name: item display¦s @@ -1249,7 +1240,6 @@ entities: text display: name: text display¦s pattern: text display(|1¦s) ->>>>>>> c4e272043f9f1c9e90f5bea506d911578b6ea354 # -- Heal Reasons -- heal reasons: From 5d2da296e14ae8f521258fdf5321b6005b3cd772 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 00:02:58 -0600 Subject: [PATCH 008/104] Finish bulk add --- build.gradle | 2 + .../skript/classes/data/BukkitClasses.java | 15 +++ .../elements/expressions/ExprTextOf.java | 109 ++++++++++++++++++ .../displays/ExprDisplayBillboard.java | 2 +- .../displays/ExprDisplayBrightness.java | 2 +- .../displays/ExprDisplayGlowOverride.java | 2 +- .../displays/ExprDisplayHeightWidth.java | 12 +- .../displays/ExprDisplayInterpolation.java | 2 +- .../displays/ExprDisplayShadow.java | 2 +- .../ExprDisplayTransformationRotation.java | 2 +- .../displays/ExprDisplayViewRange.java | 2 +- .../item/ExprItemDisplayTrasnform.java | 91 +++++++++++++++ .../displays/item/ExprItemOfItemDisplay.java | 91 +++++++++++++++ .../displays/item/package-info.java | 23 ++++ .../text/ExprTextDisplayAlignment.java | 91 +++++++++++++++ .../text/ExprTextDisplayLineWidth.java | 99 ++++++++++++++++ .../displays/text/ExprTextDisplayOpacity.java | 103 +++++++++++++++++ src/main/resources/lang/default.lang | 18 +++ src/test/skript/tests/misc/displays.sk | 3 +- 19 files changed, 653 insertions(+), 18 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTrasnform.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/item/package-info.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java diff --git a/build.gradle b/build.gradle index 04463870177..a02288f6c6e 100644 --- a/build.gradle +++ b/build.gradle @@ -27,6 +27,8 @@ allprojects { dependencies { shadow group: 'io.papermc', name: 'paperlib', version: '1.0.8' shadow group: 'org.bstats', name: 'bstats-bukkit', version: '3.0.2' + shadow group: 'net.kyori', name: 'adventure-text-serializer-bungeecord', version: '4.3.0' + implementation group: 'io.papermc.paper', name: 'paper-api', version: '1.19.4-R0.1-SNAPSHOT' implementation group: 'org.eclipse.jdt', name: 'org.eclipse.jdt.annotation', version: '2.2.700' diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 99ded76dde8..fbab0b07077 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -54,10 +54,12 @@ import org.bukkit.entity.Display.Billboard; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; +import org.bukkit.entity.ItemDisplay.ItemDisplayTransform; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Panda.Gene; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; +import org.bukkit.entity.TextDisplay.TextAligment; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; @@ -1508,6 +1510,19 @@ public String toVariableNameString(EnchantmentOffer eo) { .name("Billboard") .description("Represents the billboard setting of a display.") .since("INSERT VERSION")); + + Classes.registerClass(new EnumClassInfo<>(TextAligment.class, "textalignment", "text alignments") + .user("text ?alignments?") + .name("Text Alignment") + .description("Represents the text alignment setting of a text display.") + .since("INSERT VERSION")); + + Classes.registerClass(new EnumClassInfo<>(ItemDisplayTransform.class, "itemdisplaytransform", "item display transforms") + .user("item ?display ?transforms?") + .name("Item Display Transforms") + .description("Represents the transform setting of an item display.") + .since("INSERT VERSION")); } } + } diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java new file mode 100644 index 00000000000..bcb6c4c4b92 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java @@ -0,0 +1,109 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions; + +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.ServerPlatform; +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.util.chat.BungeeConverter; +import ch.njol.skript.util.chat.ChatMessages; +import ch.njol.util.coll.CollectionUtils; +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import net.md_5.bungee.api.chat.BaseComponent; + +@Name("Text Of") +@Description({ + "Returns or changes the text/string of displays.", + "Note that you can only currently use Skript chat codes when running PaperSpigot 1.19.4+" +}) +@Examples("set text of the last spawned text display to \"example\"") +@Since("INSERT VERSION") +public class ExprTextOf extends SimplePropertyExpression { + + private static final BungeeComponentSerializer serializer = BungeeComponentSerializer.get(); + + static { + String types = ""; + if (Skript.isRunningMinecraft(1, 19, 4)) + types += "displays"; + // This is because this expression is setup to support future types. + // Remove this if non-verioning. + if (!types.isEmpty()) + register(ExprTextOf.class, String.class, "(string|text)[s]", types); + } + + @Override + @Nullable + public String convert(Object object) { + if (object instanceof TextDisplay) + return ((TextDisplay) object).getText(); + return null; + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + switch (mode) { + case ADD: + case DELETE: + case REMOVE: + case REMOVE_ALL: + break; + case RESET: + return CollectionUtils.array(); + case SET: + return CollectionUtils.array(String.class); + } + return null; + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + String value = mode == ChangeMode.RESET ? null : (String) delta[0]; + for (Object object : getExpr().getArray(event)) { + if (!(object instanceof TextDisplay)) + continue; + if (Skript.getServerPlatform() == ServerPlatform.BUKKIT_PAPER) { + BaseComponent[] components = BungeeConverter.convert(ChatMessages.parseToArray(value)); + ((TextDisplay) object).text(serializer.deserialize(components)); + } else { + ((TextDisplay) object).setText(value); + } + } + } + + @Override + public Class getReturnType() { + return String.class; + } + + @Override + protected String getPropertyName() { + return "text"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java index 2ae4134a521..eb9c9e1e506 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java @@ -44,7 +44,7 @@ public class ExprDisplayBillboard extends SimplePropertyExpression[] acceptChange(ChangeMode mode) { @Override public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - float change = delta == null ? 0F : (int) ((Number) delta[0]).floatValue(); + float change = delta == null ? 0F : ((Number) delta[0]).floatValue(); change = Math.max(0F, change); switch (mode) { case REMOVE_ALL: @@ -91,14 +91,6 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { break; case DELETE: case RESET: - for (Display display : displays) { - if (height) { - display.setDisplayHeight(0F); - } else { - display.setDisplayWidth(0F); - } - } - break; case SET: for (Display display : displays) { if (height) { diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java index 2c55deba9e0..e6267f11d8e 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java @@ -47,7 +47,7 @@ public class ExprDisplayInterpolation extends SimplePropertyExpression static { if (Skript.isRunningMinecraft(1, 19, 4)) - register(ExprDisplayShadow.class, Float.class, "(:radius|strength)", "displays"); + registerDefault(ExprDisplayShadow.class, Float.class, "(:radius|strength)", "displays"); } private boolean radius; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java index 1693d8869c8..1c321542e82 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java @@ -44,7 +44,7 @@ public class ExprDisplayTransformationRotation extends SimplePropertyExpression< static { if (Skript.isRunningMinecraft(1, 19, 4)) - register(ExprDisplayTransformationRotation.class, Quaternionf.class, "(:left|right) transformation rotation", "displays"); + registerDefault(ExprDisplayTransformationRotation.class, Quaternionf.class, "(:left|right) transformation rotation", "displays"); } private boolean left; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java index eb81822aa45..4a78788b6e7 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java @@ -42,7 +42,7 @@ public class ExprDisplayViewRange extends SimplePropertyExpression. + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays.item; + +import org.bukkit.entity.Display; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.event.Event; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.coll.CollectionUtils; + +@Name("Item Display Transform") +@Description("Returns or changes the itemstack of item displays.") +@Examples("set the display item of the last spawned item display to a diamond sword") +@Since("INSERT VERSION") +public class ExprItemDisplayTrasnform extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + registerDefault(ExprItemDisplayTrasnform.class, ItemStack.class, "display item[stack]", "displays"); + } + + @Override + @Nullable + public ItemStack convert(Display display) { + if (!(display instanceof ItemDisplay)) + return null; + return ((ItemDisplay) display).getItemStack(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + switch (mode) { + case ADD: + case RESET: + case REMOVE: + case REMOVE_ALL: + break; + case DELETE: + return CollectionUtils.array(); + case SET: + return CollectionUtils.array(ItemStack.class); + } + return null; + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + ItemStack item = mode == ChangeMode.DELETE ? null : (ItemStack) delta[0]; + for (Display display : getExpr().getArray(event)) { + if (!(display instanceof ItemDisplay)) + continue; + ((ItemDisplay)display).setItemStack(item); + } + } + + @Override + public Class getReturnType() { + return ItemStack.class; + } + + @Override + protected String getPropertyName() { + return "display item"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java new file mode 100644 index 00000000000..77f49d03c0d --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java @@ -0,0 +1,91 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays.item; + +import org.bukkit.entity.Display; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.event.Event; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.coll.CollectionUtils; + +@Name("Item Display Item") +@Description("Returns or changes the itemstack of item displays.") +@Examples("set the display item of the last spawned item display to a diamond sword") +@Since("INSERT VERSION") +public class ExprItemOfItemDisplay extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + registerDefault(ExprItemOfItemDisplay.class, ItemStack.class, "display item[stack]", "displays"); + } + + @Override + @Nullable + public ItemStack convert(Display display) { + if (!(display instanceof ItemDisplay)) + return null; + return ((ItemDisplay) display).getItemStack(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + switch (mode) { + case ADD: + case RESET: + case REMOVE: + case REMOVE_ALL: + break; + case DELETE: + return CollectionUtils.array(); + case SET: + return CollectionUtils.array(ItemStack.class); + } + return null; + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + ItemStack item = mode == ChangeMode.DELETE ? null : (ItemStack) delta[0]; + for (Display display : getExpr().getArray(event)) { + if (!(display instanceof ItemDisplay)) + continue; + ((ItemDisplay)display).setItemStack(item); + } + } + + @Override + public Class getReturnType() { + return ItemStack.class; + } + + @Override + protected String getPropertyName() { + return "display item"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/package-info.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/package-info.java new file mode 100644 index 00000000000..7ef043453e2 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/package-info.java @@ -0,0 +1,23 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) +package org.skriptlang.skript.elements.expressions.displays.item; + +import org.eclipse.jdt.annotation.DefaultLocation; +import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java new file mode 100644 index 00000000000..8aa8ca7b6e2 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java @@ -0,0 +1,91 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays.text; + +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; +import org.bukkit.entity.TextDisplay.TextAligment; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.coll.CollectionUtils; + +@Name("Text Display Alignment") +@Description("Returns or changes the alignment setting of text displays.") +@Examples("set text alignment of the last spawned text display to left") +@Since("INSERT VERSION") +public class ExprTextDisplayAlignment extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + registerDefault(ExprTextDisplayAlignment.class, TextAligment.class, "text alignment[s]", "displays"); + } + + @Override + @Nullable + public TextAligment convert(Display display) { + if (!(display instanceof TextDisplay)) + return null; + return ((TextDisplay) display).getAlignment(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + switch (mode) { + case ADD: + case DELETE: + case REMOVE: + case REMOVE_ALL: + break; + case RESET: + return CollectionUtils.array(); + case SET: + return CollectionUtils.array(TextAligment.class); + } + return null; + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + TextAligment alignment = mode == ChangeMode.RESET ? TextAligment.CENTER : (TextAligment) delta[0]; + for (Display display : getExpr().getArray(event)) { + if (!(display instanceof TextDisplay)) + continue; + ((TextDisplay)display).setAlignment(alignment); + } + } + + @Override + public Class getReturnType() { + return TextAligment.class; + } + + @Override + protected String getPropertyName() { + return "text alignment"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java new file mode 100644 index 00000000000..af2caa7daa2 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java @@ -0,0 +1,99 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays.text; + +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.coll.CollectionUtils; + +@Name("Text Display Line Width") +@Description("Returns or changes the line width of text displays. Default is 200") +@Examples("set the line width of the last spawned text display to 300") +@Since("INSERT VERSION") +public class ExprTextDisplayLineWidth extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + registerDefault(ExprTextDisplayLineWidth.class, Integer.class, "line width", "displays"); + } + + @Override + @Nullable + public Integer convert(Display display) { + if (!(display instanceof TextDisplay)) + return null; + return ((TextDisplay) display).getLineWidth(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + return CollectionUtils.array(Number.class); + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + int change = delta == null ? 200 : ((Number) delta[0]).intValue(); + change = Math.max(0, change); + switch (mode) { + case REMOVE_ALL: + case REMOVE: + change = -change; + case ADD: + for (Display display : displays) { + if (!(display instanceof TextDisplay)) + continue; + TextDisplay textDisplay = (TextDisplay) display; + int value = Math.max(0, textDisplay.getLineWidth() + change); + textDisplay.setLineWidth(value); + } + break; + case DELETE: + case RESET: + case SET: + for (Display display : displays) { + if (!(display instanceof TextDisplay)) + continue; + ((TextDisplay) display).setLineWidth(change); + } + break; + } + } + + @Override + public Class getReturnType() { + return Integer.class; + } + + @Override + protected String getPropertyName() { + return "line width"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java new file mode 100644 index 00000000000..ceac074a7ce --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java @@ -0,0 +1,103 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.displays.text; + +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.coll.CollectionUtils; + +@Name("Text Display Opacity") +@Description({ + "Returns or changes the opacity of text displays.", + "Values are between -127 and 127. The value of 127 represents it being completely opaque." +}) +@Examples("set the opacity of the last spawned text display to -1 # Reset") +@Since("INSERT VERSION") +public class ExprTextDisplayOpacity extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + registerDefault(ExprTextDisplayOpacity.class, Byte.class, "[display] opacity", "displays"); + } + + @Override + @Nullable + public Byte convert(Display display) { + if (!(display instanceof TextDisplay)) + return null; + return ((TextDisplay) display).getTextOpacity(); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + return CollectionUtils.array(Number.class); + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + byte change = delta == null ? -1 : ((Number) delta[0]).byteValue(); + change = (byte) Math.max(-127, change); + switch (mode) { + case REMOVE_ALL: + case REMOVE: + change = (byte) -change; + case ADD: + for (Display display : displays) { + if (!(display instanceof TextDisplay)) + continue; + TextDisplay textDisplay = (TextDisplay) display; + byte value = (byte) Math.min(127, textDisplay.getTextOpacity() + change); + value = (byte) Math.max(-127, value); + textDisplay.setTextOpacity(value); + } + break; + case DELETE: + case RESET: + case SET: + for (Display display : displays) { + if (!(display instanceof TextDisplay)) + continue; + ((TextDisplay) display).setTextOpacity(change); + } + break; + } + } + + @Override + public Class getReturnType() { + return Byte.class; + } + + @Override + protected String getPropertyName() { + return "opacity"; + } + +} diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index a07d369e753..64cb997c2eb 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1937,6 +1937,24 @@ billboards: horizontal: horizontal vertical: vertical +# -- Text Display Alignments -- +text alignments: + center: center, middle + left: left + right: right + +# -- Item Display Transforms -- +item display transforms: + firstperson_lefthand: first person left handed, first person left hand, left handed in first person + firstperson_righthand: first person right handed, first person right hand, right handed in first person + fixed: fixed, fixed position + ground: ground, the ground + gui: gui, menu + head: head + none: none, nothing + thirdperson_lefthand: third person left handed, third person left hand, left handed in third person + thirdperson_righthand: third person right handed, third person right hand, right handed in third person + # -- Boolean -- boolean: true: diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index 222b032f6a2..4211206fea3 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -4,4 +4,5 @@ test "spawn displays": assert billboard of display is fixed with "default billboard was not fixed" set billboard of display to center assert billboard of display is center with "failed to set billboard to center" - clear display \ No newline at end of file + clear display + \ No newline at end of file From 60d9751ba4f5c0488933e90af7725d417776a208 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 15:36:55 -0600 Subject: [PATCH 009/104] Finalize so far --- build.gradle | 1 + ...orm.java => ExprItemDisplayTransform.java} | 28 +++++++++---------- .../displays/item/ExprItemOfItemDisplay.java | 2 +- src/main/resources/lang/default.lang | 2 ++ 4 files changed, 18 insertions(+), 15 deletions(-) rename src/main/java/org/skriptlang/skript/elements/expressions/displays/item/{ExprItemDisplayTrasnform.java => ExprItemDisplayTransform.java} (65%) diff --git a/build.gradle b/build.gradle index a02288f6c6e..cccbecf1d98 100644 --- a/build.gradle +++ b/build.gradle @@ -96,6 +96,7 @@ tasks.withType(ShadowJar) { include(dependency('io.papermc:paperlib')) include(dependency('org.bstats:bstats-bukkit')) include(dependency('org.bstats:bstats-base')) + include(dependency('net.kyori:')) } relocate 'io.papermc.lib', 'ch.njol.skript.paperlib' relocate 'org.bstats', 'ch.njol.skript.bstats' diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTrasnform.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTransform.java similarity index 65% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTrasnform.java rename to src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTransform.java index 9977547c00a..ff1f1a84638 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTrasnform.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTransform.java @@ -20,8 +20,8 @@ import org.bukkit.entity.Display; import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.ItemDisplay.ItemDisplayTransform; import org.bukkit.event.Event; -import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; import ch.njol.skript.Skript; @@ -34,58 +34,58 @@ import ch.njol.util.coll.CollectionUtils; @Name("Item Display Transform") -@Description("Returns or changes the itemstack of item displays.") -@Examples("set the display item of the last spawned item display to a diamond sword") +@Description("Returns or changes the item display transform of item displays.") +@Examples("set the item transform of the last spawned item display to fixed # Reset to default") @Since("INSERT VERSION") -public class ExprItemDisplayTrasnform extends SimplePropertyExpression { +public class ExprItemDisplayTransform extends SimplePropertyExpression { static { if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprItemDisplayTrasnform.class, ItemStack.class, "display item[stack]", "displays"); + registerDefault(ExprItemDisplayTransform.class, ItemDisplayTransform.class, "[item] [display] transform", "displays"); } @Override @Nullable - public ItemStack convert(Display display) { + public ItemDisplayTransform convert(Display display) { if (!(display instanceof ItemDisplay)) return null; - return ((ItemDisplay) display).getItemStack(); + return ((ItemDisplay) display).getItemDisplayTransform(); } @Nullable public Class[] acceptChange(ChangeMode mode) { switch (mode) { case ADD: - case RESET: case REMOVE: case REMOVE_ALL: break; + case RESET: case DELETE: return CollectionUtils.array(); case SET: - return CollectionUtils.array(ItemStack.class); + return CollectionUtils.array(ItemDisplayTransform.class); } return null; } @Override public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - ItemStack item = mode == ChangeMode.DELETE ? null : (ItemStack) delta[0]; + ItemDisplayTransform transform = mode == ChangeMode.SET ? (ItemDisplayTransform) delta[0] : ItemDisplayTransform.FIXED; for (Display display : getExpr().getArray(event)) { if (!(display instanceof ItemDisplay)) continue; - ((ItemDisplay)display).setItemStack(item); + ((ItemDisplay) display).setItemDisplayTransform(transform); } } @Override - public Class getReturnType() { - return ItemStack.class; + public Class getReturnType() { + return ItemDisplayTransform.class; } @Override protected String getPropertyName() { - return "display item"; + return "item display transform"; } } diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java index 77f49d03c0d..e3aa6c4c6cd 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java @@ -74,7 +74,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { for (Display display : getExpr().getArray(event)) { if (!(display instanceof ItemDisplay)) continue; - ((ItemDisplay)display).setItemStack(item); + ((ItemDisplay) display).setItemStack(item); } } diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 64cb997c2eb..b1da670aabe 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -2025,6 +2025,8 @@ types: gamerulevalue: gamerule value¦s @a display: display¦s @a billboard: billboard¦s @a + textalignment: text alignment¦s @a + itemdisplaytransform: item display transform¦s @an # Skript weathertype: weather type¦s @a From 1eb3a69a16bff19b6e68507f74e6d3d80f9986fa Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 15:43:21 -0600 Subject: [PATCH 010/104] Minimize adventure api --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index cccbecf1d98..ea4ab6e01f3 100644 --- a/build.gradle +++ b/build.gradle @@ -96,7 +96,7 @@ tasks.withType(ShadowJar) { include(dependency('io.papermc:paperlib')) include(dependency('org.bstats:bstats-bukkit')) include(dependency('org.bstats:bstats-base')) - include(dependency('net.kyori:')) + include(dependency('net.kyori:adventure-text-serializer-bungeecord')) } relocate 'io.papermc.lib', 'ch.njol.skript.paperlib' relocate 'org.bstats', 'ch.njol.skript.bstats' From 8223edeb452717f5541422c7b6ff54b733e7284f Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 16:22:28 -0600 Subject: [PATCH 011/104] Fix static class check for not 1.19.4 --- .../ch/njol/skript/classes/data/DefaultFunctions.java | 3 ++- .../ch/njol/skript/registrations/DefaultClasses.java | 11 ----------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index eb4c451cdea..781f4467bb4 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -37,6 +37,7 @@ import ch.njol.skript.lang.function.Parameter; import ch.njol.skript.lang.function.SimpleJavaFunction; import ch.njol.skript.lang.util.SimpleLiteral; +import ch.njol.skript.registrations.Classes; import ch.njol.skript.registrations.DefaultClasses; import ch.njol.skript.util.Color; import ch.njol.skript.util.ColorRGB; @@ -480,7 +481,7 @@ public ColorRGB[] executeSimple(Object[][] params) { new Parameter<>("x", DefaultClasses.NUMBER, true, null), new Parameter<>("y", DefaultClasses.NUMBER, true, null), new Parameter<>("z", DefaultClasses.NUMBER, true, null) - }, DefaultClasses.QUATERION.get(), true) { + }, Classes.getExactClassInfo(Quaternionf.class), true) { @Override public Quaternionf[] executeSimple(Object[][] params) { double w = ((Number) params[0][0]).doubleValue(); diff --git a/src/main/java/ch/njol/skript/registrations/DefaultClasses.java b/src/main/java/ch/njol/skript/registrations/DefaultClasses.java index cc1a1ac38c9..620e6b78237 100644 --- a/src/main/java/ch/njol/skript/registrations/DefaultClasses.java +++ b/src/main/java/ch/njol/skript/registrations/DefaultClasses.java @@ -18,13 +18,10 @@ */ package ch.njol.skript.registrations; -import java.util.Optional; - import org.bukkit.Location; import org.bukkit.World; import org.bukkit.util.Vector; import org.eclipse.jdt.annotation.NonNull; -import org.joml.Quaternionf; import ch.njol.skript.classes.ClassInfo; import ch.njol.skript.util.Color; @@ -52,10 +49,6 @@ public class DefaultClasses { public static ClassInfo DATE = getClassInfo(Date.class); public static ClassInfo TIMESPAN = getClassInfo(Timespan.class); - // Included - // 1.19.4+ - public static Optional> QUATERION = getOptionalClassInfo(Quaternionf.class); - @NonNull private static ClassInfo getClassInfo(Class type) { //noinspection ConstantConditions @@ -65,8 +58,4 @@ private static ClassInfo getClassInfo(Class type) { return classInfo; } - private static Optional> getOptionalClassInfo(Class type) { - return Optional.ofNullable(Classes.getExactClassInfo(type)); - } - } From 3ee129638ce75646a3a46f2e7b2876972805024e Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 16:28:13 -0600 Subject: [PATCH 012/104] Fix missing display classinfo in pattern under 1.19.4 --- src/main/java/ch/njol/skript/expressions/ExprColorOf.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java index 7ef5a9721ec..a9e59ce6cf4 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java +++ b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java @@ -66,7 +66,10 @@ public class ExprColorOf extends PropertyExpression { static { - register(ExprColorOf.class, Color.class, "colo[u]r[s]", "blocks/itemtypes/entities/fireworkeffects/displays"); + String types = "blocks/itemtypes/entities/fireworkeffects"; + if (Skript.isRunningMinecraft(1, 19, 4)) + types += "/displays"; + register(ExprColorOf.class, Color.class, "colo[u]r[s]", types); } @Override From edebb4af7087bd5cf7061de14f21eac8ff3f2af8 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 16:34:27 -0600 Subject: [PATCH 013/104] Fix missing quaternions classinfo in pattern under 1.19.4 --- .../java/ch/njol/skript/expressions/ExprCoordinate.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java b/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java index f213a67ce81..f3d30523d59 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java +++ b/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java @@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.Nullable; import org.joml.Quaternionf; +import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.classes.Changer.ChangerUtils; import ch.njol.skript.doc.Description; @@ -44,7 +45,10 @@ public class ExprCoordinate extends SimplePropertyExpression { static { - registerDefault(ExprCoordinate.class, Number.class, "(0¦w|1¦x|2¦y|3¦z)(-| )(coord[inate]|pos[ition]|loc[ation])[s]", "locations/quaternions"); + String types = "locations"; + if (Skript.isRunningMinecraft(1, 19, 4)) + types += "/quaternions"; + registerDefault(ExprCoordinate.class, Number.class, "(0¦w|1¦x|2¦y|3¦z)(-| )(coord[inate]|pos[ition]|loc[ation])[s]", types); } private final static char[] axes = {'w', 'x', 'y', 'z'}; From 20252bbf823973247707a6f020932ea78c7b3ab4 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 16:40:49 -0600 Subject: [PATCH 014/104] Make sure test runs on only 1.19.4 --- src/test/skript/tests/misc/displays.sk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index 4211206fea3..097707db554 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -1,5 +1,5 @@ -test "spawn displays": +test "spawn displays" when running minecraft "1.19.4": spawn a text display at spawn of world "world": assert billboard of display is fixed with "default billboard was not fixed" set billboard of display to center From 6d3fe03b254bc5b210a63fa2994eaf8160f89305 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 17:55:21 -0600 Subject: [PATCH 015/104] Address reviews and fix java 8 --- .../njol/skript/classes/data/DefaultFunctions.java | 2 +- .../skript/elements/expressions/ExprTextOf.java | 8 +++++--- .../expressions/displays/ExprDisplayHeightWidth.java | 12 +++++++++++- .../displays/text/ExprTextDisplayOpacity.java | 12 +++++++++++- src/test/skript/tests/misc/displays.sk | 1 - 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index 781f4467bb4..f7c3919b4d8 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -477,7 +477,7 @@ public ColorRGB[] executeSimple(Object[][] params) { if (Skript.classExists("org.joml.Quaternionf")) Functions.registerFunction(new SimpleJavaFunction("quaternionf", new Parameter[] { - new Parameter<>("x", DefaultClasses.NUMBER, true, null), + new Parameter<>("w", DefaultClasses.NUMBER, true, null), new Parameter<>("x", DefaultClasses.NUMBER, true, null), new Parameter<>("y", DefaultClasses.NUMBER, true, null), new Parameter<>("z", DefaultClasses.NUMBER, true, null) diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java index bcb6c4c4b92..561b4cd34c0 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java @@ -45,12 +45,14 @@ @Since("INSERT VERSION") public class ExprTextOf extends SimplePropertyExpression { - private static final BungeeComponentSerializer serializer = BungeeComponentSerializer.get(); + private static BungeeComponentSerializer serializer; static { String types = ""; - if (Skript.isRunningMinecraft(1, 19, 4)) + if (Skript.isRunningMinecraft(1, 19, 4)) { + serializer = BungeeComponentSerializer.get(); types += "displays"; + } // This is because this expression is setup to support future types. // Remove this if non-verioning. if (!types.isEmpty()) @@ -87,7 +89,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { for (Object object : getExpr().getArray(event)) { if (!(object instanceof TextDisplay)) continue; - if (Skript.getServerPlatform() == ServerPlatform.BUKKIT_PAPER) { + if (Skript.getServerPlatform() == ServerPlatform.BUKKIT_PAPER && serializer != null) { BaseComponent[] components = BungeeConverter.convert(ChatMessages.parseToArray(value)); ((TextDisplay) object).text(serializer.deserialize(components)); } else { diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java index d81598631f9..bd0fc02da67 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java @@ -66,7 +66,17 @@ public Float convert(Display display) { @Nullable public Class[] acceptChange(ChangeMode mode) { - return CollectionUtils.array(Number.class); + switch (mode) { + case ADD: + case DELETE: + case REMOVE: + case RESET: + case SET: + return CollectionUtils.array(Number.class); + case REMOVE_ALL: + default: + return null; + } } @Override diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java index ceac074a7ce..fd9b338aacc 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java @@ -56,7 +56,17 @@ public Byte convert(Display display) { @Nullable public Class[] acceptChange(ChangeMode mode) { - return CollectionUtils.array(Number.class); + switch (mode) { + case ADD: + case DELETE: + case REMOVE: + case RESET: + case SET: + return CollectionUtils.array(Number.class); + case REMOVE_ALL: + default: + return null; + } } @Override diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index 097707db554..fd4cbbc7909 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -5,4 +5,3 @@ test "spawn displays" when running minecraft "1.19.4": set billboard of display to center assert billboard of display is center with "failed to set billboard to center" clear display - \ No newline at end of file From 417a0a5be9443e6b1cdbe0fd0116bcff9f899e4d Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Wed, 12 Apr 2023 18:40:20 -0600 Subject: [PATCH 016/104] Apply suggestions from code review Co-authored-by: sovdee --- .../elements/expressions/displays/ExprDisplayBillboard.java | 2 +- .../expressions/displays/ExprDisplayHeightWidth.java | 4 ++-- .../expressions/displays/ExprDisplayInterpolation.java | 2 +- .../displays/ExprDisplayTransformationRotation.java | 5 ++++- .../elements/expressions/displays/ExprDisplayViewRange.java | 2 +- .../expressions/displays/text/ExprTextDisplayLineWidth.java | 2 +- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java index eb9c9e1e506..5e432e246ba 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java @@ -36,7 +36,7 @@ @Description({ "Returns or changes the billboard setting of displays.", "This describes the axes/points around which the display can pivot.", - "Displays spawn with the default setting as 'fixed'. Resetting this expression also does so." + "Displays spawn with the default setting as 'fixed'. Resetting this expression will also set it to 'fixed'." }) @Examples("set billboard of the last spawned text display to center") @Since("INSERT VERSION") diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java index bd0fc02da67..6e5bc527a79 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java @@ -37,9 +37,9 @@ @Name("Display Height/Width") @Description({ "Returns or changes the height or width of displays.", - "Rendering culling bounding box spans horizontally width/2 from entity position, "+ + "The rendering culling bounding box spans horizontally width/2 from entity position, "+ "and the part beyond will be culled.", - "If set to 0, no culling on both vertical and horizonal directions. Default is 0.0" + "If set to 0, no culling will occur on both the vertical and horizontal directions. Default is 0.0." }) @Examples("set height of the last spawned text display to 2.5") @Since("INSERT VERSION") diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java index e6267f11d8e..b94038cad83 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java @@ -39,7 +39,7 @@ @Description({ "Returns or changes the interpolation delay/duration of displays.", "Interpolation delay is the amount of ticks before client-side interpolation will commence.", - "Setting to 0 seconds will make it immediate" + "Setting to 0 seconds will make it immediate." }) @Examples("set interpolation delay of the last spawned text display to 2 ticks") @Since("INSERT VERSION") diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java index 1c321542e82..d4d0d829df3 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java @@ -37,7 +37,10 @@ import ch.njol.util.coll.CollectionUtils; @Name("Display Transformation Rotation") -@Description("Returns or changes the transformation rotation of displays.") +@Description({ + "Returns or changes the transformation rotation of displays.", + "The left rotation is applied first, with the right rotation then being applied based on the rotated axis." +}) @Examples("set left transformation rotation of last spawned text display to quaternionf(1, 0, 0, 1)") @Since("INSERT VERSION") public class ExprDisplayTransformationRotation extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java index 4a78788b6e7..cf8f6539113 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java @@ -34,7 +34,7 @@ @Name("Display View Range") @Description({ "Returns or changes the view range of displays.", - "Default value is 1.0." + "Default value is 1.0. This value is then multiplied by 64 and the player's entity view distance setting to determine the actual range." }) @Examples("set view range of the last spawned text display to 2.7") @Since("INSERT VERSION") diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java index af2caa7daa2..0ee7af3e67b 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java @@ -33,7 +33,7 @@ import ch.njol.util.coll.CollectionUtils; @Name("Text Display Line Width") -@Description("Returns or changes the line width of text displays. Default is 200") +@Description("Returns or changes the line width of text displays. Default is 200.") @Examples("set the line width of the last spawned text display to 300") @Since("INSERT VERSION") public class ExprTextDisplayLineWidth extends SimplePropertyExpression { From 50b28cef8819805eee790d7a4254e6f6f08395cb Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 23:29:21 -0600 Subject: [PATCH 017/104] Move classes --- .../skript/expressions/ExprCoordinate.java | 189 ++++++------------ .../skript/expressions/ExprVectorXYZ.java | 185 +++++++++++------ 2 files changed, 186 insertions(+), 188 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java b/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java index f3d30523d59..9adc517ab72 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java +++ b/src/main/java/ch/njol/skript/expressions/ExprCoordinate.java @@ -21,9 +21,7 @@ import org.bukkit.Location; import org.bukkit.event.Event; import org.eclipse.jdt.annotation.Nullable; -import org.joml.Quaternionf; -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.classes.Changer.ChangerUtils; import ch.njol.skript.doc.Description; @@ -35,159 +33,90 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; +/** + * @author Peter Güttinger + */ @Name("Coordinate") -@Description("Represents a given coordinate of locations or quaternions.") -@Examples({ - "player's y-coordinate is smaller than 40:", - "\tmessage \"Watch out for lava!\"" -}) -@Since("1.4.3, INSERT VERSION (quaternions)") -public class ExprCoordinate extends SimplePropertyExpression { - +@Description("Represents a given coordinate of a location. ") +@Examples({"player's y-coordinate is smaller than 40:", + " message \"Watch out for lava!\""}) +@Since("1.4.3") +public class ExprCoordinate extends SimplePropertyExpression { + static { - String types = "locations"; - if (Skript.isRunningMinecraft(1, 19, 4)) - types += "/quaternions"; - registerDefault(ExprCoordinate.class, Number.class, "(0¦w|1¦x|2¦y|3¦z)(-| )(coord[inate]|pos[ition]|loc[ation])[s]", types); + register(ExprCoordinate.class, Number.class, "(0¦x|1¦y|2¦z)(-| )(coord[inate]|pos[ition]|loc[ation])[s]", "locations"); } - - private final static char[] axes = {'w', 'x', 'y', 'z'}; - + + private final static char[] axes = {'x', 'y', 'z'}; + private int axis; - + @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + public boolean init(final Expression[] exprs, final int matchedPattern, final Kleenean isDelayed, final ParseResult parseResult) { + super.init(exprs, matchedPattern, isDelayed, parseResult); axis = parseResult.mark; - return super.init(exprs, matchedPattern, isDelayed, parseResult); + return true; } - + @Override - public Number convert(Object object) { - if (object instanceof Location) { - if (axis == 0) - return null; - Location location = (Location) object; - return axis == 1 ? location.getX() : axis == 2 ? location.getY() : location.getZ(); - } else { - Quaternionf quaternion = (Quaternionf) object; - switch (axis) { - case 0: - return quaternion.w(); - case 1: - return quaternion.x(); - case 2: - return quaternion.y(); - case 3: - return quaternion.z(); - default: - return null; - } - } + public Number convert(final Location l) { + return axis == 0 ? l.getX() : axis == 1 ? l.getY() : l.getZ(); } - + @Override protected String getPropertyName() { - return axes[axis] + "-coordinate"; + return "the " + axes[axis] + "-coordinate"; } - + @Override public Class getReturnType() { return Number.class; } - + @Override @Nullable - public Class[] acceptChange(ChangeMode mode) { - if (getExpr().getReturnType().equals(Quaternionf.class)) { - if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE)) - return new Class[] {Number.class}; - } + public Class[] acceptChange(final ChangeMode mode) { if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE) && getExpr().isSingle() && ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Location.class)) return new Class[] {Number.class}; return null; } - + @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) throws UnsupportedOperationException { + public void change(final Event e, final @Nullable Object[] delta, final ChangeMode mode) throws UnsupportedOperationException { assert delta != null; - if (getExpr().getSingle(event) instanceof Location) { - Object object = getExpr().getSingle(event); - if (object == null) - return; - double value = ((Number) delta[0]).doubleValue(); - if (axis == 0) - return; - Location location = (Location) object; - switch (mode) { - case REMOVE: - value = -value; - //$FALL-THROUGH$ - case ADD: - if (axis == 1) { - location.setX(location.getX() + value); - } else if (axis == 2) { - location.setY(location.getY() + value); - } else if (axis == 3) { - location.setZ(location.getZ() + value); - } - getExpr().change(event, new Location[] {location}, ChangeMode.SET); - break; - case SET: - if (axis == 1) { - location.setX(value); - } else if (axis == 2) { - location.setY(value); - } else if (axis == 3) { - location.setZ(value); - } - getExpr().change(event, new Location[] {location}, ChangeMode.SET); - break; - case DELETE: - case REMOVE_ALL: - case RESET: - assert false; - } - } else { - for (Object object : getExpr().getArray(event)) { - float value = ((Number) delta[0]).floatValue(); - Quaternionf quaternion = (Quaternionf) object; - switch (mode) { - case REMOVE: - value = -value; - //$FALL-THROUGH$ - case ADD: - if (axis == 0) { - quaternion.set(quaternion.w() + value, quaternion.x(), quaternion.y(), quaternion.z()); - } else if (axis == 1) { - quaternion.set(quaternion.w(), quaternion.x() + value, quaternion.y(), quaternion.z()); - } else if (axis == 2) { - quaternion.set(quaternion.w(), quaternion.x(), quaternion.y() + value, quaternion.z()); - } else if (axis == 3) { - quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), quaternion.z() + value); - } - if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) - getExpr().change(event, new Quaternionf[] {quaternion}, ChangeMode.SET); - break; - case SET: - if (axis == 0) { - quaternion.set(value, quaternion.x(), quaternion.y(), quaternion.z()); - } else if (axis == 1) { - quaternion.set(quaternion.w(), value, quaternion.y(), quaternion.z()); - } else if (axis == 2) { - quaternion.set(quaternion.w(), quaternion.x(), value, quaternion.z()); - } else if (axis == 3) { - quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), value); - } - if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) - getExpr().change(event, new Quaternionf[] {quaternion}, ChangeMode.SET); - break; - case DELETE: - case REMOVE_ALL: - case RESET: - assert false; + final Location l = getExpr().getSingle(e); + if (l == null) + return; + double n = ((Number) delta[0]).doubleValue(); + switch (mode) { + case REMOVE: + n = -n; + //$FALL-THROUGH$ + case ADD: + if (axis == 0) { + l.setX(l.getX() + n); + } else if (axis == 1) { + l.setY(l.getY() + n); + } else { + l.setZ(l.getZ() + n); + } + getExpr().change(e, new Location[] {l}, ChangeMode.SET); + break; + case SET: + if (axis == 0) { + l.setX(n); + } else if (axis == 1) { + l.setY(n); + } else { + l.setZ(n); } - } + getExpr().change(e, new Location[] {l}, ChangeMode.SET); + break; + case DELETE: + case REMOVE_ALL: + case RESET: + assert false; } } - + } diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorXYZ.java b/src/main/java/ch/njol/skript/expressions/ExprVectorXYZ.java index 76b5ab59fe2..e88f473f434 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorXYZ.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorXYZ.java @@ -21,9 +21,12 @@ import org.bukkit.event.Event; import org.bukkit.util.Vector; import org.eclipse.jdt.annotation.Nullable; +import org.joml.Quaternionf; +import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer; import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.classes.Changer.ChangerUtils; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; @@ -35,91 +38,157 @@ import ch.njol.util.coll.CollectionUtils; /** + * Ported by Sashie from skript-vectors with bi0qaw's permission. * @author bi0qaw */ -@Name("Vectors - XYZ Component") -@Description("Gets or changes the x, y or z component of a vector.") -@Examples({"set {_v} to vector 1, 2, 3", - "send \"%x of {_v}%, %y of {_v}%, %z of {_v}%\"", - "add 1 to x of {_v}", - "add 2 to y of {_v}", - "add 3 to z of {_v}", - "send \"%x of {_v}%, %y of {_v}%, %z of {_v}%\"", - "set x component of {_v} to 1", - "set y component of {_v} to 2", - "set z component of {_v} to 3", - "send \"%x component of {_v}%, %y component of {_v}%, %z component of {_v}%\"",}) -@Since("2.2-dev28") -public class ExprVectorXYZ extends SimplePropertyExpression { - +@Name("Vector/Quaternion - XYZ Component") +@Description("Gets or changes the x, y or z component of vectors/quaternions.") +@Examples({ + "set {_v} to vector 1, 2, 3", + "send \"%x of {_v}%, %y of {_v}%, %z of {_v}%\"", + "add 1 to x of {_v}", + "add 2 to y of {_v}", + "add 3 to z of {_v}", + "send \"%x of {_v}%, %y of {_v}%, %z of {_v}%\"", + "set x component of {_v} to 1", + "set y component of {_v} to 2", + "set z component of {_v} to 3", + "send \"%x component of {_v}%, %y component of {_v}%, %z component of {_v}%\"" +}) +@Since("2.2-dev28, INSERT VERSION (Quaternions)") +public class ExprVectorXYZ extends SimplePropertyExpression { + static { - register(ExprVectorXYZ.class, Number.class, "[vector] (0¦x|1¦y|2¦z) [component[s]]", "vectors"); + String types = "vectors"; + if (Skript.isRunningMinecraft(1, 19, 4)) + types += "/quaternions"; + register(ExprVectorXYZ.class, Number.class, "[vector|quaternion] (0¦x|1¦y|2¦z) [component[s]]", types); } - + private final static Character[] axes = new Character[] {'x', 'y', 'z'}; - + private int axis; - + @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { super.init(exprs, matchedPattern, isDelayed, parseResult); axis = parseResult.mark; return true; } - + @Override - public Number convert(Vector v) { - return axis == 0 ? v.getX() : (axis == 1 ? v.getY() : v.getZ()); + public Number convert(Object object) { + if (object instanceof Vector) { + Vector vector = (Vector) object; + return axis == 0 ? vector.getX() : (axis == 1 ? vector.getY() : vector.getZ()); + } else { + Quaternionf quaternion = (Quaternionf) object; + switch (axis) { + case 0: + return quaternion.w(); + case 1: + return quaternion.x(); + case 2: + return quaternion.y(); + case 3: + return quaternion.z(); + default: + return null; + } + } } - + @Override - @SuppressWarnings("null") public Class[] acceptChange(ChangeMode mode) { + if (getExpr().getReturnType().equals(Quaternionf.class)) { + if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE)) + return new Class[] {Number.class}; + } if ((mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET) && getExpr().isSingle() && Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class)) return CollectionUtils.array(Number.class); return null; } - + @Override - public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { assert delta != null; - final Vector v = getExpr().getSingle(e); - if (v == null) - return; - double n = ((Number) delta[0]).doubleValue(); - switch (mode) { - case REMOVE: - n = -n; - //$FALL-THROUGH$ - case ADD: - if (axis == 0) - v.setX(v.getX() + n); - else if (axis == 1) - v.setY(v.getY() + n); - else - v.setZ(v.getZ() + n); - getExpr().change(e, new Vector[] {v}, ChangeMode.SET); - break; - case SET: - if (axis == 0) - v.setX(n); - else if (axis == 1) - v.setY(n); - else - v.setZ(n); - getExpr().change(e, new Vector[] {v}, ChangeMode.SET); + for (Object object : getExpr().getArray(event)) { + if (object instanceof Vector) { + Vector vector = (Vector) object; + double value = ((Number) delta[0]).doubleValue(); + switch (mode) { + case REMOVE: + value = -value; + //$FALL-THROUGH$ + case ADD: + if (axis == 0) + vector.setX(vector.getX() + value); + else if (axis == 1) + vector.setY(vector.getY() + value); + else + vector.setZ(vector.getZ() + value); + getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); + break; + case SET: + if (axis == 0) + vector.setX(value); + else if (axis == 1) + vector.setY(value); + else + vector.setZ(value); + getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); + } + } else { + float value = ((Number) delta[0]).floatValue(); + Quaternionf quaternion = (Quaternionf) object; + switch (mode) { + case REMOVE: + value = -value; + //$FALL-THROUGH$ + case ADD: + if (axis == 0) { + quaternion.set(quaternion.w() + value, quaternion.x(), quaternion.y(), quaternion.z()); + } else if (axis == 1) { + quaternion.set(quaternion.w(), quaternion.x() + value, quaternion.y(), quaternion.z()); + } else if (axis == 2) { + quaternion.set(quaternion.w(), quaternion.x(), quaternion.y() + value, quaternion.z()); + } else if (axis == 3) { + quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), quaternion.z() + value); + } + if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) + getExpr().change(event, new Quaternionf[] {quaternion}, ChangeMode.SET); + break; + case SET: + if (axis == 0) { + quaternion.set(value, quaternion.x(), quaternion.y(), quaternion.z()); + } else if (axis == 1) { + quaternion.set(quaternion.w(), value, quaternion.y(), quaternion.z()); + } else if (axis == 2) { + quaternion.set(quaternion.w(), quaternion.x(), value, quaternion.z()); + } else if (axis == 3) { + quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), value); + } + if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) + getExpr().change(event, new Quaternionf[] {quaternion}, ChangeMode.SET); + break; + case DELETE: + case REMOVE_ALL: + case RESET: + assert false; + } + } } } - - @Override - protected String getPropertyName() { - return axes[axis] + " component"; - } - + @Override public Class getReturnType() { return Number.class; } - + + @Override + protected String getPropertyName() { + return axes[axis] + " component"; + } + } From 5ca7598159669240c6ff26a1459bf4ebb6c5e3bc Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 23:30:14 -0600 Subject: [PATCH 018/104] Apply changes --- .../elements/expressions/displays/ExprDisplayGlowOverride.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java index 50c7aa3babd..8b9676b244b 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java @@ -36,7 +36,7 @@ @Name("Display Glow Color Override") @Description({ "Returns or changes the glowing color override of displays.", - "This overrides whatever color is already presently set for the scoreboard of the displays." + "This overrides whatever color is already set for the scoreboard of the displays." }) @Examples("set glow color override of the last spawned text display to blue") @Since("INSERT VERSION") From 9e7992a31ec72efc0cdb98084fdbb2da83a35d9f Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 12 Apr 2023 23:36:33 -0600 Subject: [PATCH 019/104] Move classes --- .../elements/expressions/displays/ExprDisplayGlowOverride.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java index 8b9676b244b..491d758b587 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java @@ -36,7 +36,7 @@ @Name("Display Glow Color Override") @Description({ "Returns or changes the glowing color override of displays.", - "This overrides whatever color is already set for the scoreboard of the displays." + "This overrides whatever color is already set for the scoreboard team of the displays." }) @Examples("set glow color override of the last spawned text display to blue") @Since("INSERT VERSION") From fc8ee316b1bab2f0aaecee571a57d7cc6c70f72f Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 13 Apr 2023 18:54:06 -0600 Subject: [PATCH 020/104] Class rename --- .../{ExprVectorXYZ.java => ExprXYZComponent.java} | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) rename src/main/java/ch/njol/skript/expressions/{ExprVectorXYZ.java => ExprXYZComponent.java} (96%) diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorXYZ.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java similarity index 96% rename from src/main/java/ch/njol/skript/expressions/ExprVectorXYZ.java rename to src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index e88f473f434..41eed56dab1 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorXYZ.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -56,13 +56,13 @@ "send \"%x component of {_v}%, %y component of {_v}%, %z component of {_v}%\"" }) @Since("2.2-dev28, INSERT VERSION (Quaternions)") -public class ExprVectorXYZ extends SimplePropertyExpression { +public class ExprXYZComponent extends SimplePropertyExpression { static { String types = "vectors"; if (Skript.isRunningMinecraft(1, 19, 4)) types += "/quaternions"; - register(ExprVectorXYZ.class, Number.class, "[vector|quaternion] (0¦x|1¦y|2¦z) [component[s]]", types); + register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (0¦x|1¦y|2¦z) [component[s]]", types); } private final static Character[] axes = new Character[] {'x', 'y', 'z'}; @@ -138,6 +138,8 @@ else if (axis == 1) else vector.setZ(value); getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); + default: + assert false; } } else { float value = ((Number) delta[0]).floatValue(); From 275779f758cb5962b332b203d9ced55a88e974d6 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 13 Apr 2023 21:12:51 -0600 Subject: [PATCH 021/104] Update to Spigot's fix to TextAlignment --- .../njol/skript/classes/data/BukkitClasses.java | 4 ++-- .../skript/expressions/ExprXYZComponent.java | 14 ++++++++------ .../displays/text/ExprTextDisplayAlignment.java | 16 ++++++++-------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index fbab0b07077..dd6d634d7f4 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -59,7 +59,7 @@ import org.bukkit.entity.Panda.Gene; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; -import org.bukkit.entity.TextDisplay.TextAligment; +import org.bukkit.entity.TextDisplay.TextAlignment; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; @@ -1511,7 +1511,7 @@ public String toVariableNameString(EnchantmentOffer eo) { .description("Represents the billboard setting of a display.") .since("INSERT VERSION")); - Classes.registerClass(new EnumClassInfo<>(TextAligment.class, "textalignment", "text alignments") + Classes.registerClass(new EnumClassInfo<>(TextAlignment.class, "textalignment", "text alignments") .user("text ?alignments?") .name("Text Alignment") .description("Represents the text alignment setting of a text display.") diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 41eed56dab1..0a6eafd8b46 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -42,7 +42,10 @@ * @author bi0qaw */ @Name("Vector/Quaternion - XYZ Component") -@Description("Gets or changes the x, y or z component of vectors/quaternions.") +@Description({ + "Gets or changes the x, y or z component of vectors/quaternions.", + "cannot use w of vector. w is for quaternion only." +}) @Examples({ "set {_v} to vector 1, 2, 3", "send \"%x of {_v}%, %y of {_v}%, %z of {_v}%\"", @@ -62,25 +65,24 @@ public class ExprXYZComponent extends SimplePropertyExpression { String types = "vectors"; if (Skript.isRunningMinecraft(1, 19, 4)) types += "/quaternions"; - register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (0¦x|1¦y|2¦z) [component[s]]", types); + register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (0¦w|1¦x|2¦y|3¦z) [component[s]]", types); } - private final static Character[] axes = new Character[] {'x', 'y', 'z'}; + private final static Character[] axes = new Character[] {'w', 'x', 'y', 'z'}; private int axis; @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - super.init(exprs, matchedPattern, isDelayed, parseResult); axis = parseResult.mark; - return true; + return super.init(exprs, matchedPattern, isDelayed, parseResult); } @Override public Number convert(Object object) { if (object instanceof Vector) { Vector vector = (Vector) object; - return axis == 0 ? vector.getX() : (axis == 1 ? vector.getY() : vector.getZ()); + return axis == 1 ? vector.getX() : (axis == 2 ? vector.getY() : vector.getZ()); } else { Quaternionf quaternion = (Quaternionf) object; switch (axis) { diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java index 8aa8ca7b6e2..d92fb633c0c 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java @@ -20,7 +20,7 @@ import org.bukkit.entity.Display; import org.bukkit.entity.TextDisplay; -import org.bukkit.entity.TextDisplay.TextAligment; +import org.bukkit.entity.TextDisplay.TextAlignment; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; @@ -37,16 +37,16 @@ @Description("Returns or changes the alignment setting of text displays.") @Examples("set text alignment of the last spawned text display to left") @Since("INSERT VERSION") -public class ExprTextDisplayAlignment extends SimplePropertyExpression { +public class ExprTextDisplayAlignment extends SimplePropertyExpression { static { if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprTextDisplayAlignment.class, TextAligment.class, "text alignment[s]", "displays"); + registerDefault(ExprTextDisplayAlignment.class, TextAlignment.class, "text alignment[s]", "displays"); } @Override @Nullable - public TextAligment convert(Display display) { + public TextAlignment convert(Display display) { if (!(display instanceof TextDisplay)) return null; return ((TextDisplay) display).getAlignment(); @@ -63,14 +63,14 @@ public Class[] acceptChange(ChangeMode mode) { case RESET: return CollectionUtils.array(); case SET: - return CollectionUtils.array(TextAligment.class); + return CollectionUtils.array(TextAlignment.class); } return null; } @Override public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - TextAligment alignment = mode == ChangeMode.RESET ? TextAligment.CENTER : (TextAligment) delta[0]; + TextAlignment alignment = mode == ChangeMode.RESET ? TextAlignment.CENTER : (TextAlignment) delta[0]; for (Display display : getExpr().getArray(event)) { if (!(display instanceof TextDisplay)) continue; @@ -79,8 +79,8 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } @Override - public Class getReturnType() { - return TextAligment.class; + public Class getReturnType() { + return TextAlignment.class; } @Override From d4064f76a164ba885c6e8d6465577e34c1ed7c78 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Fri, 14 Apr 2023 20:36:55 -0600 Subject: [PATCH 022/104] Return null when using w of vector --- .../ch/njol/skript/expressions/ExprXYZComponent.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 0a6eafd8b46..0cd5c67833c 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -81,6 +81,8 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override public Number convert(Object object) { if (object instanceof Vector) { + if (axis == 0) + return null; Vector vector = (Vector) object; return axis == 1 ? vector.getX() : (axis == 2 ? vector.getY() : vector.getZ()); } else { @@ -117,6 +119,8 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { assert delta != null; for (Object object : getExpr().getArray(event)) { if (object instanceof Vector) { + if (axis == 0) + return; Vector vector = (Vector) object; double value = ((Number) delta[0]).doubleValue(); switch (mode) { @@ -124,18 +128,18 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { value = -value; //$FALL-THROUGH$ case ADD: - if (axis == 0) + if (axis == 1) vector.setX(vector.getX() + value); - else if (axis == 1) + else if (axis == 2) vector.setY(vector.getY() + value); else vector.setZ(vector.getZ() + value); getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); break; case SET: - if (axis == 0) + if (axis == 1) vector.setX(value); - else if (axis == 1) + else if (axis == 2) vector.setY(value); else vector.setZ(value); From 6a1fab854e35f14cb2ef6c7a1632537d1b64e4b3 Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Fri, 14 Apr 2023 20:37:20 -0600 Subject: [PATCH 023/104] Update src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java Co-authored-by: sovdee --- src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 0cd5c67833c..6d48372627b 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -44,7 +44,7 @@ @Name("Vector/Quaternion - XYZ Component") @Description({ "Gets or changes the x, y or z component of vectors/quaternions.", - "cannot use w of vector. w is for quaternion only." + "You cannot use w of vector. W is for quaternions only." }) @Examples({ "set {_v} to vector 1, 2, 3", From aade8ebb58f42cfa9b381b56945b320c5f73771e Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Fri, 14 Apr 2023 20:40:13 -0600 Subject: [PATCH 024/104] Use brackets --- .../njol/skript/expressions/ExprXYZComponent.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 0cd5c67833c..c92227bad34 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -128,21 +128,23 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { value = -value; //$FALL-THROUGH$ case ADD: - if (axis == 1) + if (axis == 1) { vector.setX(vector.getX() + value); - else if (axis == 2) + } else if (axis == 2) { vector.setY(vector.getY() + value); - else + } else { vector.setZ(vector.getZ() + value); + } getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); break; case SET: - if (axis == 1) + if (axis == 1) { vector.setX(value); - else if (axis == 2) + } else if (axis == 2) { vector.setY(value); - else + } else { vector.setZ(value); + } getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); default: assert false; From f6723dc4f656cc904a60c3735e7c481c23188840 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 24 May 2023 16:14:23 -0600 Subject: [PATCH 025/104] Add entity hiding --- .../ch/njol/skript/conditions/CondCanSee.java | 55 +++++++----- .../ch/njol/skript/effects/EffHideEntity.java | 89 +++++++++++++++++++ 2 files changed, 120 insertions(+), 24 deletions(-) create mode 100644 src/main/java/ch/njol/skript/effects/EffHideEntity.java diff --git a/src/main/java/ch/njol/skript/conditions/CondCanSee.java b/src/main/java/ch/njol/skript/conditions/CondCanSee.java index 3e5d66d1bb3..aca6494d409 100644 --- a/src/main/java/ch/njol/skript/conditions/CondCanSee.java +++ b/src/main/java/ch/njol/skript/conditions/CondCanSee.java @@ -18,6 +18,7 @@ */ package ch.njol.skript.conditions; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.eclipse.jdt.annotation.Nullable; @@ -35,51 +36,57 @@ import ch.njol.util.Kleenean; @Name("Can See") -@Description("Checks whether the given players can see another players.") -@Examples({"if the player can't see the player-argument:", - "\tmessage \"<light red>The player %player-argument% is not online!\""}) -@Since("2.3") +@Description({ + "Checks whether the given players can see other entities.", + "Note this means if the entities have been manually hidden from the player, " + + "and not if they have line of sight to eachother." +}) +@Examples({ + "if the player can't see the player-argument:", + "\tmessage \"&cThe player %player-argument% is not online!\"" +}) +@Since("2.3, INSERT VERSION (entities)") public class CondCanSee extends Condition { static { Skript.registerCondition(CondCanSee.class, - "%players% (is|are) [(1¦in)]visible for %players%", - "%players% can see %players%", - "%players% (is|are)(n't| not) [(1¦in)]visible for %players%", - "%players% can('t| not) see %players%"); + "%entities% (is|are) [:in]visible for %players%", + "%players% can see %entities%", + "%entities% (is|are)(n't| not) [:in]visible for %players%", + "%players% can('t| not) see %entities%"); } - - @SuppressWarnings("null") + + private Expression entities; private Expression players; - @SuppressWarnings("null") - private Expression targetPlayers; - @SuppressWarnings({"unchecked", "null"}) @Override + @SuppressWarnings("unchecked") public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { if (matchedPattern == 1 || matchedPattern == 3) { players = (Expression) exprs[0]; - targetPlayers = (Expression) exprs[1]; + entities = (Expression) exprs[1]; } else { players = (Expression) exprs[1]; - targetPlayers = (Expression) exprs[0]; + entities = (Expression) exprs[0]; } - setNegated(matchedPattern > 1 ^ parseResult.mark == 1); + setNegated(matchedPattern > 1 ^ parseResult.hasTag("in")); return true; } @Override - public boolean check(Event e) { - return players.check(e, - player -> targetPlayers.check(e, - player::canSee - ), isNegated()); + public boolean check(Event event) { + return entities.check(event, entity -> { + // Old Spigot API (< 1.19) has Player#canSee(Player) and still exists. So lets directly use it. + if (entity instanceof Player) + return players.check(event, player -> player.canSee((Player) entity)); + return players.check(event, player -> player.canSee(entity)); + }, isNegated()); } @Override - public String toString(@Nullable Event e, boolean debug) { - return PropertyCondition.toString(this, PropertyType.CAN, e, debug, players, - "see" + targetPlayers.toString(e, debug)); + public String toString(@Nullable Event event, boolean debug) { + return PropertyCondition.toString(this, PropertyType.CAN, event, debug, players, + "see" + entities.toString(event, debug)); } } diff --git a/src/main/java/ch/njol/skript/effects/EffHideEntity.java b/src/main/java/ch/njol/skript/effects/EffHideEntity.java new file mode 100644 index 00000000000..59737d42893 --- /dev/null +++ b/src/main/java/ch/njol/skript/effects/EffHideEntity.java @@ -0,0 +1,89 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package ch.njol.skript.effects; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.eclipse.jdt.annotation.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Effect; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; + +@Name("Hide Entities From Players") +@Description({ + "Hide entities from players", + "Do note that hidden entities still exist in the server space and can interact with the world." +}) +@Examples({ + "set {_player} to player", + "spawn a block display at location infront of player:", + "\thide event-entity from all players where [player input is not {_player}]" +}) +@Since("INSERT VERSION") +public class EffHideEntity extends Effect { + + static { + Skript.registerEffect(EffHideEntity.class, + "hide %entities% from %players%", + "show %entities% to %players%"); + } + + private Expression entities; + private Expression players; + boolean hide; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + entities = (Expression) exprs[0]; + players = (Expression) exprs[1]; + hide = matchedPattern == 0; + return true; + } + + @Override + protected void execute(Event event) { + Skript skript = Skript.getInstance(); + if (hide) { + for (Player player : players.getArray(event)) { + for (Entity entity : entities.getArray(event)) + player.hideEntity(skript, entity); + } + } else { + for (Player player : players.getArray(event)) { + for (Entity entity : entities.getArray(event)) + player.showEntity(skript, entity); + } + } + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return (hide ? "hide " : "show ") + entities.toString(event, debug) + (hide ? " from " : " to " + players.toString(event, debug)); + } + +} From ab0e5440f225034dad23906062c4cb567ea59b8e Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 24 May 2023 19:28:42 -0600 Subject: [PATCH 026/104] Add property init values for displays --- .../java/ch/njol/skript/SkriptConfig.java | 1 + .../ch/njol/skript/entity/DisplayData.java | 222 ++++++++++++++++++ .../njol/skript/entity/SimpleEntityData.java | 6 +- .../ch/njol/skript/sections/EffSecSpawn.java | 8 +- src/main/resources/lang/default.lang | 9 +- src/test/skript/tests/misc/displays.sk | 13 + 6 files changed, 250 insertions(+), 9 deletions(-) create mode 100644 src/main/java/ch/njol/skript/entity/DisplayData.java diff --git a/src/main/java/ch/njol/skript/SkriptConfig.java b/src/main/java/ch/njol/skript/SkriptConfig.java index bdf7144cb36..fa7b99eeeb9 100644 --- a/src/main/java/ch/njol/skript/SkriptConfig.java +++ b/src/main/java/ch/njol/skript/SkriptConfig.java @@ -23,6 +23,7 @@ import ch.njol.skript.config.Option; import ch.njol.skript.config.OptionSection; import ch.njol.skript.config.SectionNode; +import ch.njol.skript.entity.DisplayData; import ch.njol.skript.hooks.Hook; import ch.njol.skript.hooks.VaultHook; import ch.njol.skript.hooks.regions.GriefPreventionHook; diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java new file mode 100644 index 00000000000..1e21c8bc58f --- /dev/null +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -0,0 +1,222 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package ch.njol.skript.entity; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.BlockDisplay; +import org.bukkit.entity.Display; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.TextDisplay; +import org.bukkit.inventory.ItemStack; +import org.eclipse.jdt.annotation.Nullable; + +import ch.njol.skript.Skript; +import ch.njol.skript.aliases.ItemType; +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.registrations.Classes; +import ch.njol.skript.variables.Variables; + +public class DisplayData extends EntityData { + + private static enum DisplayType { + + ANY(Display.class, "display"), + BLOCK(BlockDisplay.class, "block display"), + ITEM(ItemDisplay.class, "item display"), + TEXT(TextDisplay.class, "text display"); + + @Nullable + final Class c; + private final String codeName; + + DisplayType(@Nullable Class c, String codeName) { + this.c = c; + this.codeName = codeName; + } + + @Override + public String toString() { + return codeName; + } + + public static String[] codeNames; + static { + List cn = new ArrayList<>(); + for (DisplayType t : values()) { + if (t.c != null) + cn.add(t.codeName); + } + codeNames = cn.toArray(new String[0]); + } + } + + static { + EntityData.register(DisplayData.class, "display", Display.class, 0, DisplayType.codeNames); + Variables.yggdrasil.registerSingleClass(DisplayType.class, "DisplayType"); + } + + private DisplayType type = DisplayType.ANY; + + @Nullable + private BlockData blockData; + + @Nullable + private ItemStack item; + + public DisplayData() {} + + public DisplayData(DisplayType type) { + this.type = type; + this.matchedPattern = type.ordinal(); + } + + @Override + @SuppressWarnings("unchecked") + protected boolean init(Literal[] exprs, int matchedPattern, ParseResult parseResult) { + type = DisplayType.values()[matchedPattern]; + if (exprs.length > 0 && exprs[0] != null) { + if (type == DisplayType.BLOCK && exprs[0] != null) { + Object object = ((Literal) exprs[0]).getSingle(); + if (object instanceof ItemType) { + Material material = ((ItemType) object).getMaterial(); + if (!material.isBlock()) { + Skript.error("A block display must be a block item. " + Classes.toString(material) + " is not a block. If you want to spawn an item, use an 'item display'"); + return false; + } + blockData = Bukkit.createBlockData(material); + } else { + blockData = (BlockData) object; + } + } else if (type == DisplayType.ITEM) { + item = ((Literal) exprs[0]).getSingle().getRandom(); + } + } + return true; + } + + @Override + protected boolean init(@Nullable Class c, @Nullable Display entity) { + DisplayType[] types = DisplayType.values(); + for (int i = types.length - 1; i >= 0; i--) { + Class display = types[i].c; + if (display == null) + continue; + if (entity == null ? display.isAssignableFrom(c) : display.isInstance(entity)) { + type = types[i]; + if (entity != null) { + switch (types[i]) { + case ANY: + break; + case BLOCK: + blockData = ((BlockDisplay) entity).getBlock(); + break; + case ITEM: + item = ((ItemDisplay) entity).getItemStack(); + break; + case TEXT: + break; + default: + break; + } + } + return true; + } + } + assert false; + return false; + } + + @Override + public void set(Display entity) { + switch (type) { + case ANY: + break; + case BLOCK: + if (blockData != null) + ((BlockDisplay) entity).setBlock(blockData); + break; + case ITEM: + if (item != null) + ((ItemDisplay) entity).setItemStack(item); + break; + case TEXT: + break; + default: + break; + } + } + + @Override + public boolean match(Display entity) { + switch (type) { + case ANY: + break; + case BLOCK: + if (blockData != null && !((BlockDisplay) entity).getBlock().equals(blockData)) + return false; + break; + case ITEM: + if (item != null && !((ItemDisplay) entity).getItemStack().isSimilar(item)) + return false; + break; + case TEXT: + break; + default: + break; + } + return type.c != null && type.c.isInstance(entity); + } + + @Override + public Class getType() { + return type.c != null ? type.c : Display.class; + } + + @Override + protected int hashCode_i() { + return type.hashCode(); + } + + @Override + protected boolean equals_i(EntityData obj) { + if (!(obj instanceof DisplayData)) + return false; + DisplayData other = (DisplayData) obj; + return type == other.type; + } + + @Override + public boolean isSupertypeOf(EntityData e) { + if (e instanceof DisplayData) + return type == DisplayType.ANY || ((DisplayData) e).type == type; + return false; + } + + @Override + public EntityData getSuperType() { + return new DisplayData(type); + } + +} diff --git a/src/main/java/ch/njol/skript/entity/SimpleEntityData.java b/src/main/java/ch/njol/skript/entity/SimpleEntityData.java index 79f5f53e0ba..9af72e4d97b 100644 --- a/src/main/java/ch/njol/skript/entity/SimpleEntityData.java +++ b/src/main/java/ch/njol/skript/entity/SimpleEntityData.java @@ -303,9 +303,9 @@ private static void addSuperEntity(String codeName, Class enti if (Skript.isRunningMinecraft(1, 19, 4)) { addSimpleEntity("sniffer", Sniffer.class); - addSimpleEntity("text display", TextDisplay.class); - addSimpleEntity("item display", ItemDisplay.class); - addSimpleEntity("block display", BlockDisplay.class); +// addSimpleEntity("text display", TextDisplay.class); +// addSimpleEntity("item display", ItemDisplay.class); +// addSimpleEntity("block display", BlockDisplay.class); addSimpleEntity("interaction", Interaction.class); } diff --git a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java index d455a14bdc7..e27f39450f4 100644 --- a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java +++ b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java @@ -50,9 +50,13 @@ @Name("Spawn") @Description({ "Spawns entities. This can be used as an effect and as a section.", + "", "If it is used as a section, the section is run before the entity is added to the world.", "You can modify the entity in this section, using for example 'event-entity' or 'cow'. ", - "Do note that other event values, such as 'player', won't work in this section." + "Do note that other event values, such as 'player', won't work in this section.", + "", + "If you're spawning a display and want it to be empty on initialization, like not having a block display be stone; " + + "set hidden config node 'spawn empty displays' to true." }) @Examples({ "spawn 3 creepers at the targeted block", @@ -60,7 +64,7 @@ "spawn a zombie at the player:", "\tset name of the zombie to \"\"", "", - "spawn a text display at location above player:", + "spawn a block display of a ladder[waterlogged=true] at location above player:", "\tset billboard of event-display to center # allows the display to rotate around the center axis" }) @Since("1.0, 2.6.1 (with section)") diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index b1da670aabe..a1baf6f61ad 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1230,16 +1230,16 @@ entities: pattern: interaction(|1¦s) display: name: display¦s - pattern: display(|1¦s) + pattern: [a] display(|1¦s) block display: name: block display¦s - pattern: block display(|1¦s) + pattern: [a] block display(|1¦s) [of %-blockdata%] item display: name: item display¦s - pattern: item display(|1¦s) + pattern: item display(|1¦s) [of %-itemtype%] text display: name: text display¦s - pattern: text display(|1¦s) + pattern: [a] text display(|1¦s) # -- Heal Reasons -- heal reasons: @@ -2027,6 +2027,7 @@ types: billboard: billboard¦s @a textalignment: text alignment¦s @a itemdisplaytransform: item display transform¦s @an + quaternion: quaternion¦s @a # Skript weathertype: weather type¦s @a diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index fd4cbbc7909..39ecf52304e 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -5,3 +5,16 @@ test "spawn displays" when running minecraft "1.19.4": set billboard of display to center assert billboard of display is center with "failed to set billboard to center" clear display + assert last spawned text display is a display with "failed to compare text display with superclass display" + clear all entities + # Requiring Lime's literal compare pull requests + #spawn block display of grass_block[snowy=true] at spawn of world "world" + #assert last spawned block display is block display of grass_block[snowy=true] with "Failed to compare block display with block display" + clear all entities + spawn an item display of a diamond sword of sharpness at spawn of world "world": + assert item transform of event-display is none with "item transform was not none" + set item transform of display to head + assert item transform of display is head with "failed to set item transform to head" + # Waiting on fix for issue #5711 + #assert display item of event-display is a diamond sword of sharpness with "failed to compare against the item of the display %display item of display%" + clear display From dfcedf51dcf85759d6631422335e58b1493903a4 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Wed, 24 May 2023 19:56:01 -0600 Subject: [PATCH 027/104] 1.19.4 check --- src/main/java/ch/njol/skript/entity/DisplayData.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index 1e21c8bc58f..cb043db37b9 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -73,8 +73,10 @@ public String toString() { } static { - EntityData.register(DisplayData.class, "display", Display.class, 0, DisplayType.codeNames); - Variables.yggdrasil.registerSingleClass(DisplayType.class, "DisplayType"); + if (Skript.isRunningMinecraft(1, 19, 4)) { + EntityData.register(DisplayData.class, "display", Display.class, 0, DisplayType.codeNames); + Variables.yggdrasil.registerSingleClass(DisplayType.class, "DisplayType"); + } } private DisplayType type = DisplayType.ANY; From d35917e5b0426fcb20a06261ec56a24cfd34b807 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 25 May 2023 04:53:11 -0600 Subject: [PATCH 028/104] Add rotate syntaxes --- .../skript/classes/data/DefaultFunctions.java | 8 +- .../ExprDisplayTransformationRotation.java | 2 +- .../quaternions/ExprRotateQuaternion.java | 126 ++++++++++++++++++ 3 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index 75bc96fb12c..ebda68715b0 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -27,6 +27,7 @@ import org.bukkit.World; import org.bukkit.util.Vector; import org.eclipse.jdt.annotation.Nullable; +import org.joml.AxisAngle4f; import org.joml.Quaternionf; import ch.njol.skript.Skript; @@ -488,12 +489,11 @@ public Quaternionf[] executeSimple(Object[][] params) { double x = ((Number) params[1][0]).doubleValue(); double y = ((Number) params[2][0]).doubleValue(); double z = ((Number) params[3][0]).doubleValue(); - return CollectionUtils.array(new Quaternionf(w, x, y, z)); + return CollectionUtils.array(new Quaternionf(x, y, z, w)); } }).description("Returns a quaternion from the given w, x, y and z parameters.") - .examples("quaternionf(1.2, 5.6, 45.21, 10)") + .examples("quaternionf(1, 5.6, 45.21, 10)") .since("INSERT VERSION"); - } - + } diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java index d4d0d829df3..d45591f9f46 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java @@ -41,7 +41,7 @@ "Returns or changes the transformation rotation of displays.", "The left rotation is applied first, with the right rotation then being applied based on the rotated axis." }) -@Examples("set left transformation rotation of last spawned text display to quaternionf(1, 0, 0, 1)") +@Examples("set left transformation rotation of last spawned block display to quaternionf(1, 0, 0, 0) # reset block display") @Since("INSERT VERSION") public class ExprDisplayTransformationRotation extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java new file mode 100644 index 00000000000..6441f5e8baa --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java @@ -0,0 +1,126 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.expressions.quaternions; + +import org.bukkit.Location; +import org.bukkit.event.Event; +import org.bukkit.util.Vector; +import org.eclipse.jdt.annotation.Nullable; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import ch.njol.skript.Skript; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.ExpressionType; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.util.Kleenean; + +@Name("Rotate Quaternion") +@Description({ + "Rotates a Quaternion around an axis or a vector and by a set amount of degrees.", + "When you use a vector, the values will be used to rotate the x, y and z." +}) +@Examples("rotate {_quaternion} around vector from 1, 0, 0 at player by 90 degrees") +@Since("INSERT VERSION") +public class ExprRotateQuaternion extends SimpleExpression { + + static { + Skript.registerExpression(ExprRotateQuaternion.class, Quaternionf.class, ExpressionType.SIMPLE, + "%quaternions% rotated (around|on) [the] (:x|:y|:z)-axis by %number% [degrees|radians]", + "%quaternions% rotated by %vector%"); + } + + private Expression quaternions; + + @Nullable + private Expression degrees; + + @Nullable + private Expression vector; + + @Nullable + private String axis; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + quaternions = (Expression) exprs[0]; + if (parseResult.tags.size() > 0) { + axis = parseResult.tags.get(0); + degrees = (Expression) exprs[1]; + } else { + vector = (Expression) exprs[1]; + } + return true; + } + + @Override + protected Quaternionf @Nullable [] get(Event event) { + if (vector == null && axis != null) { + float degrees = this.degrees.getOptionalSingle(event).orElse(0).floatValue(); + switch (axis) { + case "x": + return quaternions.stream(event) + .map(quaternion -> quaternion.rotateX(degrees)) + .toArray(Quaternionf[]::new); + case "y": + return quaternions.stream(event) + .map(quaternion -> quaternion.rotateY(degrees)) + .toArray(Quaternionf[]::new); + case "z": + return quaternions.stream(event) + .map(quaternion -> quaternion.rotateZ(degrees)) + .toArray(Quaternionf[]::new); + } + } + Vector vector = this.vector.getSingle(event); + if (vector == null) + return new Quaternionf[0]; + Vector3f vector3f = new Vector3f((float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); + return quaternions.stream(event) + .map(quaternion -> quaternion.rotateZYX(vector3f.x(), vector3f.y(), vector3f.x())) + .toArray(Quaternionf[]::new); + } + + @Override + public boolean isSingle() { + return quaternions.isSingle(); + } + + @Override + public Class getReturnType() { + return Quaternionf.class; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + if (vector == null) + return quaternions.toString(event, debug) + + " rotated around the " + axis + "-axis " + + " by " + degrees.toString(event, debug) + " degrees"; + return quaternions.toString(event, debug) + + " rotated by " + vector.toString(event, debug); + } + +} From 36ab6cdf64485b9b2d7bd171150e2f18421ec8f7 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 25 May 2023 04:58:51 -0600 Subject: [PATCH 029/104] Change example --- src/main/java/ch/njol/skript/entity/DisplayData.java | 2 +- .../displays/ExprDisplayTransformationScaleTranslation.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index cb043db37b9..f8d9079bff1 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -40,7 +40,7 @@ public class DisplayData extends EntityData { - private static enum DisplayType { + private enum DisplayType { ANY(Display.class, "display"), BLOCK(BlockDisplay.class, "block display"), diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java index 9861453da6c..0bad880a0ae 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java @@ -39,7 +39,7 @@ @Name("Display Transformation Scale/Translation") @Description("Returns or changes the transformation scale or translation of displays.") -@Examples("set left transformation translation of last spawned text display to the angle between vector 2, 0, 0 and vector 0, 2, 1") +@Examples("set transformation translation of display to vector from -0.5, -0.5, -0.5 # Center the display in the same position as a block") @Since("INSERT VERSION") public class ExprDisplayTransformationScaleTranslation extends SimplePropertyExpression { From 725e9bcec474c1cd6fdb58c1e8a20d6017ec5c0c Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 25 May 2023 05:38:26 -0600 Subject: [PATCH 030/104] Fix tests --- .../ch/njol/skript/entity/DisplayData.java | 32 ++++++++++--------- .../njol/skript/entity/SimpleEntityData.java | 3 -- .../quaternions/ExprRotateQuaternion.java | 8 ++--- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index f8d9079bff1..a29d1b2450e 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -27,7 +27,6 @@ import org.bukkit.entity.BlockDisplay; import org.bukkit.entity.Display; import org.bukkit.entity.ItemDisplay; -import org.bukkit.entity.TextDisplay; import org.bukkit.inventory.ItemStack; import org.eclipse.jdt.annotation.Nullable; @@ -40,19 +39,29 @@ public class DisplayData extends EntityData { + static { + if (Skript.isRunningMinecraft(1, 19, 4)) { + EntityData.register(DisplayData.class, "display", Display.class, 0, DisplayType.codeNames); + Variables.yggdrasil.registerSingleClass(DisplayType.class, "DisplayType"); + } + } + private enum DisplayType { - ANY(Display.class, "display"), - BLOCK(BlockDisplay.class, "block display"), - ITEM(ItemDisplay.class, "item display"), - TEXT(TextDisplay.class, "text display"); + ANY("org.bukkit.entity.Display", "display"), + BLOCK("org.bukkit.entity.BlockDisplay", "block display"), + ITEM("org.bukkit.entity.ItemDisplay", "item display"), + TEXT("org.bukkit.entity.TextDisplay", "text display"); @Nullable - final Class c; + private Class c; private final String codeName; - DisplayType(@Nullable Class c, String codeName) { - this.c = c; + @SuppressWarnings("unchecked") + DisplayType(String className, String codeName) { + try { + this.c = (Class) Class.forName(className); + } catch (ClassNotFoundException e) {} this.codeName = codeName; } @@ -72,13 +81,6 @@ public String toString() { } } - static { - if (Skript.isRunningMinecraft(1, 19, 4)) { - EntityData.register(DisplayData.class, "display", Display.class, 0, DisplayType.codeNames); - Variables.yggdrasil.registerSingleClass(DisplayType.class, "DisplayType"); - } - } - private DisplayType type = DisplayType.ANY; @Nullable diff --git a/src/main/java/ch/njol/skript/entity/SimpleEntityData.java b/src/main/java/ch/njol/skript/entity/SimpleEntityData.java index 9af72e4d97b..7cd43f6424b 100644 --- a/src/main/java/ch/njol/skript/entity/SimpleEntityData.java +++ b/src/main/java/ch/njol/skript/entity/SimpleEntityData.java @@ -303,9 +303,6 @@ private static void addSuperEntity(String codeName, Class enti if (Skript.isRunningMinecraft(1, 19, 4)) { addSimpleEntity("sniffer", Sniffer.class); -// addSimpleEntity("text display", TextDisplay.class); -// addSimpleEntity("item display", ItemDisplay.class); -// addSimpleEntity("block display", BlockDisplay.class); addSimpleEntity("interaction", Interaction.class); } diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java index 6441f5e8baa..c8a2cfc3609 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java @@ -18,7 +18,6 @@ */ package org.skriptlang.skript.elements.expressions.quaternions; -import org.bukkit.Location; import org.bukkit.event.Event; import org.bukkit.util.Vector; import org.eclipse.jdt.annotation.Nullable; @@ -46,9 +45,10 @@ public class ExprRotateQuaternion extends SimpleExpression { static { - Skript.registerExpression(ExprRotateQuaternion.class, Quaternionf.class, ExpressionType.SIMPLE, - "%quaternions% rotated (around|on) [the] (:x|:y|:z)-axis by %number% [degrees|radians]", - "%quaternions% rotated by %vector%"); + if (Skript.isRunningMinecraft(1, 19, 4)) + Skript.registerExpression(ExprRotateQuaternion.class, Quaternionf.class, ExpressionType.SIMPLE, + "%quaternions% rotated (around|on) [the] (:x|:y|:z)-axis by %number% [degrees|radians]", + "%quaternions% rotated by %vector%"); } private Expression quaternions; From 17ae3c3a9903733073c6614e685de6d5176d5c61 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Sat, 27 May 2023 06:20:20 -0600 Subject: [PATCH 031/104] shadow syntax missing --- .../skript/elements/expressions/displays/ExprDisplayShadow.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java index 097a490dda9..34ffb87595b 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java @@ -42,7 +42,7 @@ public class ExprDisplayShadow extends SimplePropertyExpression static { if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprDisplayShadow.class, Float.class, "(:radius|strength)", "displays"); + registerDefault(ExprDisplayShadow.class, Float.class, "shadow (:radius|strength)", "displays"); } private boolean radius; From c43f3ec1478810e6c1239c2687f214742e50b2b0 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Fri, 23 Jun 2023 02:30:37 -0600 Subject: [PATCH 032/104] Change setting --- .../displays/ExprDisplayTransformationRotation.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java index d45591f9f46..772a508344a 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java @@ -80,13 +80,14 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { Quaternionf quaternion = (Quaternionf) delta[0]; for (Display display : displays) { Transformation transformation = display.getTransformation(); - Transformation change; if (left) { - change = new Transformation(transformation.getTranslation(), quaternion, transformation.getScale(), transformation.getRightRotation()); + // change = new Transformation(transformation.getTranslation(), quaternion, transformation.getScale(), transformation.getRightRotation()); + transformation.getLeftRotation().set(quaternion); } else { - change = new Transformation(transformation.getTranslation(), transformation.getLeftRotation(), transformation.getScale(), quaternion); + // change = new Transformation(transformation.getTranslation(), transformation.getLeftRotation(), transformation.getScale(), quaternion); + transformation.getRightRotation().set(quaternion); } - display.setTransformation(change); + display.setTransformation(transformation); } } From e1782820a5835fa9c6fc254e0a932f2423e21ec4 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Fri, 7 Jul 2023 08:46:18 -0600 Subject: [PATCH 033/104] Revert change --- .../displays/ExprDisplayTransformationRotation.java | 9 ++++----- src/main/resources/lang/default.lang | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java index 772a508344a..a6cc38d3d8d 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java @@ -80,14 +80,13 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { Quaternionf quaternion = (Quaternionf) delta[0]; for (Display display : displays) { Transformation transformation = display.getTransformation(); + Transformation change = null; if (left) { - // change = new Transformation(transformation.getTranslation(), quaternion, transformation.getScale(), transformation.getRightRotation()); - transformation.getLeftRotation().set(quaternion); + change = new Transformation(transformation.getTranslation(), quaternion, transformation.getScale(), transformation.getRightRotation()); } else { - // change = new Transformation(transformation.getTranslation(), transformation.getLeftRotation(), transformation.getScale(), quaternion); - transformation.getRightRotation().set(quaternion); + change = new Transformation(transformation.getTranslation(), transformation.getLeftRotation(), transformation.getScale(), quaternion); } - display.setTransformation(transformation); + display.setTransformation(change); } } diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 6e406b881fd..63a214c1e7a 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1230,16 +1230,16 @@ entities: pattern: interaction(|1¦s) display: name: display¦s - pattern: [a] display(|1¦s) + pattern: [a] display(|1¦s) [entity] block display: name: block display¦s - pattern: [a] block display(|1¦s) [of %-blockdata%] + pattern: [a] block display(|1¦s) [entity] [of %-blockdata%] item display: name: item display¦s - pattern: item display(|1¦s) [of %-itemtype%] + pattern: item display(|1¦s) [entity] [of %-itemtype%] text display: name: text display¦s - pattern: [a] text display(|1¦s) + pattern: [a] text display(|1¦s) [entity] # -- Heal Reasons -- heal reasons: From 3da7b372eab0db6e2a08f38b9e66279bb0ef83c3 Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Fri, 15 Sep 2023 20:23:59 -0600 Subject: [PATCH 034/104] Update src/main/java/ch/njol/skript/conditions/CondCanSee.java --- src/main/java/ch/njol/skript/conditions/CondCanSee.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/conditions/CondCanSee.java b/src/main/java/ch/njol/skript/conditions/CondCanSee.java index aca6494d409..5557b0a4329 100644 --- a/src/main/java/ch/njol/skript/conditions/CondCanSee.java +++ b/src/main/java/ch/njol/skript/conditions/CondCanSee.java @@ -86,7 +86,7 @@ public boolean check(Event event) { @Override public String toString(@Nullable Event event, boolean debug) { return PropertyCondition.toString(this, PropertyType.CAN, event, debug, players, - "see" + entities.toString(event, debug)); + "see " + entities.toString(event, debug)); } } From 3b50595c2198c54abbb29e8ed3dc605fa8698e11 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Fri, 15 Sep 2023 20:29:20 -0600 Subject: [PATCH 035/104] Fix imports from master merge --- src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index a209d55bfa5..7fb01b64119 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -25,6 +25,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.util.Vector; From fa7b0d4b516c01b36aaf078f28a4b5862a1078b3 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Fri, 15 Sep 2023 21:53:38 -0600 Subject: [PATCH 036/104] Get tests working --- .../ch/njol/skript/entity/DisplayData.java | 23 ++++++++++++++++++- src/test/skript/tests/misc/displays.sk | 1 - 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index a29d1b2450e..4678aaa557c 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -27,6 +27,7 @@ import org.bukkit.entity.BlockDisplay; import org.bukkit.entity.Display; import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.TextDisplay; import org.bukkit.inventory.ItemStack; import org.eclipse.jdt.annotation.Nullable; @@ -89,6 +90,9 @@ public String toString() { @Nullable private ItemStack item; + @Nullable + private String text; + public DisplayData() {} public DisplayData(DisplayType type) { @@ -140,6 +144,7 @@ protected boolean init(@Nullable Class c, @Nullable Display e item = ((ItemDisplay) entity).getItemStack(); break; case TEXT: + text = ((TextDisplay) entity).getText(); break; default: break; @@ -158,14 +163,22 @@ public void set(Display entity) { case ANY: break; case BLOCK: + if (!(entity instanceof BlockDisplay)) + return; if (blockData != null) ((BlockDisplay) entity).setBlock(blockData); break; case ITEM: + if (!(entity instanceof ItemDisplay)) + return; if (item != null) ((ItemDisplay) entity).setItemStack(item); break; case TEXT: + if (!(entity instanceof TextDisplay)) + return; + if (text != null) + ((TextDisplay) entity).setText(text); break; default: break; @@ -178,14 +191,22 @@ public boolean match(Display entity) { case ANY: break; case BLOCK: + if (!(entity instanceof BlockDisplay)) + return false; if (blockData != null && !((BlockDisplay) entity).getBlock().equals(blockData)) return false; break; case ITEM: + if (!(entity instanceof ItemDisplay)) + return false; if (item != null && !((ItemDisplay) entity).getItemStack().isSimilar(item)) return false; break; case TEXT: + if (!(entity instanceof TextDisplay)) + return false; + if (item != null && !((TextDisplay) entity).getText().equals(text)) + return false; break; default: break; @@ -215,7 +236,7 @@ protected boolean equals_i(EntityData obj) { public boolean isSupertypeOf(EntityData e) { if (e instanceof DisplayData) return type == DisplayType.ANY || ((DisplayData) e).type == type; - return false; + return Display.class.isAssignableFrom(e.getType()); } @Override diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index 39ecf52304e..183e4681ab7 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -5,7 +5,6 @@ test "spawn displays" when running minecraft "1.19.4": set billboard of display to center assert billboard of display is center with "failed to set billboard to center" clear display - assert last spawned text display is a display with "failed to compare text display with superclass display" clear all entities # Requiring Lime's literal compare pull requests #spawn block display of grass_block[snowy=true] at spawn of world "world" From 5c3807ab7527692707bf7868bb1910a811346d2d Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Mon, 16 Oct 2023 20:01:44 -0600 Subject: [PATCH 037/104] Add color reset --- skript-aliases | 2 +- .../njol/skript/expressions/ExprColorOf.java | 29 ++++++++++++++----- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/skript-aliases b/skript-aliases index fb9c3044e55..1ee77d8573a 160000 --- a/skript-aliases +++ b/skript-aliases @@ -1 +1 @@ -Subproject commit fb9c3044e555667b4dc5558467608bd55fa32df0 +Subproject commit 1ee77d8573aa37456f1b49fe12aec7bb410d1dd7 diff --git a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java index a9e59ce6cf4..7a9054fb725 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java +++ b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java @@ -113,7 +113,11 @@ public Class[] acceptChange(ChangeMode mode) { Class returnType = getExpr().getReturnType(); if (FireworkEffect.class.isAssignableFrom(returnType)) return CollectionUtils.array(Color[].class); - if (mode != ChangeMode.SET && !getExpr().isSingle()) + if (!getExpr().isSingle()) + return null; + if (Display.class.isAssignableFrom(returnType) && (mode == ChangeMode.RESET || mode == ChangeMode.DELETE || mode == ChangeMode.SET)) + return CollectionUtils.array(Color.class); + if (mode != ChangeMode.SET) return null; if (Entity.class.isAssignableFrom(returnType)) return CollectionUtils.array(Color.class); @@ -121,16 +125,14 @@ else if (Block.class.isAssignableFrom(returnType)) return CollectionUtils.array(Color.class); if (ItemType.class.isAssignableFrom(returnType)) return CollectionUtils.array(Color.class); - if (Display.class.isAssignableFrom(returnType)) - return CollectionUtils.array(Color.class); return null; } @Override public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - if (delta == null) - return; - Color color = (Color) delta[0]; + Color color = null; + if (delta != null) + color = (Color) delta[0]; for (Object object : getExpr().getArray(event)) { if (object instanceof Item || object instanceof ItemType) { ItemStack stack = object instanceof Item ? ((Item) object).getItemStack() : ((ItemType) object).getRandom(); @@ -160,7 +162,20 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } } } else if (object instanceof TextDisplay) { - ((TextDisplay) object).setBackgroundColor(color.asBukkitColor()); + switch (mode) { + case DELETE: + case RESET: + ((TextDisplay) object).setDefaultBackground(true); + break; + case SET: + ((TextDisplay) object).setBackgroundColor(color.asBukkitColor()); + break; + case ADD: + case REMOVE: + case REMOVE_ALL: + default: + break; + } } else if (object instanceof FireworkEffect) { Color[] input = (Color[]) delta; FireworkEffect effect = ((FireworkEffect) object); From b1128a6cb06755aa79de32848d6b188503fd8da2 Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Sun, 12 Nov 2023 15:13:00 -0700 Subject: [PATCH 038/104] Update ExprXYZComponent.java --- src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index a52662eb4bd..1bce046f077 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -146,6 +146,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { vector.setZ(value); } getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); + break; default: assert false; } From 37046ba4faa5fc7e6e07336795224b3de851458c Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Sun, 12 Nov 2023 15:46:00 -0700 Subject: [PATCH 039/104] Update DisplayData.java --- src/main/java/ch/njol/skript/entity/DisplayData.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index 4678aaa557c..0fdc052ec8c 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -131,10 +131,10 @@ protected boolean init(@Nullable Class c, @Nullable Display e Class display = types[i].c; if (display == null) continue; - if (entity == null ? display.isAssignableFrom(c) : display.isInstance(entity)) { + if (c.isAssignableFrom(display)) { type = types[i]; - if (entity != null) { - switch (types[i]) { + if (entity != null && display.isInstance(entity)) { + switch (type) { case ANY: break; case BLOCK: @@ -241,7 +241,7 @@ public boolean isSupertypeOf(EntityData e) { @Override public EntityData getSuperType() { - return new DisplayData(type); + return new DisplayData(DisplayType.ANY); } } From e36b5df0811dbde01120e7db6f1e6a4c4c6eef98 Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Sun, 12 Nov 2023 16:39:34 -0700 Subject: [PATCH 040/104] Update DisplayData.java --- src/main/java/ch/njol/skript/entity/DisplayData.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index 0fdc052ec8c..8f2205c8c19 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -131,9 +131,9 @@ protected boolean init(@Nullable Class c, @Nullable Display e Class display = types[i].c; if (display == null) continue; - if (c.isAssignableFrom(display)) { + if (entity == null ? c.isAssignableFrom(display) : display.isInstance(entity)) { type = types[i]; - if (entity != null && display.isInstance(entity)) { + if (entity != null) { switch (type) { case ANY: break; From fce4fc302de06dc7b0af9eaed18d5f0272e27b64 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Tue, 9 Jan 2024 11:28:09 -0700 Subject: [PATCH 041/104] Change the package naming and merge item into its own class --- skript-aliases | 2 +- .../skript/util/slot/DisplayEntitySlot.java | 67 +++++++++++++++++++ .../expressions}/ExprDisplayBillboard.java | 2 +- .../expressions}/ExprDisplayBrightness.java | 2 +- .../expressions}/ExprDisplayGlowOverride.java | 2 +- .../expressions}/ExprDisplayHeightWidth.java | 2 +- .../ExprDisplayInterpolation.java | 2 +- .../expressions}/ExprDisplayShadow.java | 2 +- .../ExprDisplayTransformationRotation.java | 2 +- ...DisplayTransformationScaleTranslation.java | 2 +- .../expressions}/ExprDisplayViewRange.java | 2 +- .../expressions}/package-info.java | 2 +- .../item/ExprItemDisplayTransform.java | 2 +- .../displays/item/ExprItemOfItemDisplay.java | 2 +- .../displays/item/package-info.java | 2 +- .../text/ExprTextDisplayAlignment.java | 2 +- .../text/ExprTextDisplayLineWidth.java | 2 +- .../displays/text/ExprTextDisplayOpacity.java | 2 +- .../displays/text/package-info.java | 2 +- .../expressions/ExprItemFrameSlot.java | 51 +++++++++----- .../ExprRotateQuaternion.java | 2 +- 21 files changed, 119 insertions(+), 37 deletions(-) create mode 100644 src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/ExprDisplayBillboard.java (97%) rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/ExprDisplayBrightness.java (98%) rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/ExprDisplayGlowOverride.java (97%) rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/ExprDisplayHeightWidth.java (98%) rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/ExprDisplayInterpolation.java (98%) rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/ExprDisplayShadow.java (98%) rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/ExprDisplayTransformationRotation.java (98%) rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/ExprDisplayTransformationScaleTranslation.java (98%) rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/ExprDisplayViewRange.java (97%) rename src/main/java/org/skriptlang/skript/elements/{expressions/displays => displays/expressions}/package-info.java (93%) rename src/main/java/org/skriptlang/skript/elements/{expressions => }/displays/item/ExprItemDisplayTransform.java (97%) rename src/main/java/org/skriptlang/skript/elements/{expressions => }/displays/item/ExprItemOfItemDisplay.java (97%) rename src/main/java/org/skriptlang/skript/elements/{expressions => }/displays/item/package-info.java (93%) rename src/main/java/org/skriptlang/skript/elements/{expressions => }/displays/text/ExprTextDisplayAlignment.java (97%) rename src/main/java/org/skriptlang/skript/elements/{expressions => }/displays/text/ExprTextDisplayLineWidth.java (97%) rename src/main/java/org/skriptlang/skript/elements/{expressions => }/displays/text/ExprTextDisplayOpacity.java (98%) rename src/main/java/org/skriptlang/skript/elements/{expressions => }/displays/text/package-info.java (93%) rename src/main/java/{ch/njol/skript => org/skriptlang/skript/elements}/expressions/ExprItemFrameSlot.java (58%) rename src/main/java/org/skriptlang/skript/elements/expressions/{quaternions => }/ExprRotateQuaternion.java (98%) diff --git a/skript-aliases b/skript-aliases index 1ee77d8573a..0884ede0fdf 160000 --- a/skript-aliases +++ b/skript-aliases @@ -1 +1 @@ -Subproject commit 1ee77d8573aa37456f1b49fe12aec7bb410d1dd7 +Subproject commit 0884ede0fdf69e914b944500d9f24f1c000a90a2 diff --git a/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java b/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java new file mode 100644 index 00000000000..adfad8d9e64 --- /dev/null +++ b/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java @@ -0,0 +1,67 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package ch.njol.skript.util.slot; + +import org.bukkit.entity.ItemDisplay; +import org.bukkit.event.Event; +import org.bukkit.inventory.ItemStack; +import org.eclipse.jdt.annotation.Nullable; + +import ch.njol.skript.registrations.Classes; + +public class DisplayEntitySlot extends Slot { + + private ItemDisplay display; + + public DisplayEntitySlot(ItemDisplay display) { + this.display = display; + } + + @Override + @Nullable + public ItemStack getItem() { + return display.getItemStack(); + } + + @Override + public void setItem(@Nullable ItemStack item) { + display.setItemStack(item); + } + + @Override + public int getAmount() { + return 1; + } + + @Override + public void setAmount(int amount) {} + + @Override + public boolean isSameSlot(Slot other) { + if (other instanceof DisplayEntitySlot) // Same item frame + return ((DisplayEntitySlot) other).display.equals(display); + return false; + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + return Classes.toString(getItem()); + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java index 5e432e246ba..3bd745ec8c9 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.entity.Display.Billboard; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBrightness.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java index 9f60f00e394..b5772c674fc 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.entity.Display.Brightness; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java index 491d758b587..a51bc42cf73 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java index 6e5bc527a79..dff0d16fad4 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java index b94038cad83..f3b7765f341 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java index 34ffb87595b..3039282b0d2 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java index a6cc38d3d8d..c521f098cc1 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java index 0bad880a0ae..92b9d45997a 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java index cf8f6539113..48568282eb9 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/package-info.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/package-info.java similarity index 93% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/package-info.java rename to src/main/java/org/skriptlang/skript/elements/displays/expressions/package-info.java index b59625add9f..8dae9f8441d 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/package-info.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/package-info.java @@ -17,7 +17,7 @@ * Copyright Peter Güttinger, SkriptLang team and contributors */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package org.skriptlang.skript.elements.expressions.displays; +package org.skriptlang.skript.elements.displays.expressions; import org.eclipse.jdt.annotation.DefaultLocation; import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTransform.java b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTransform.java rename to src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java index ff1f1a84638..bf7f6c9a0e2 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemDisplayTransform.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays.item; +package org.skriptlang.skript.elements.displays.item; import org.bukkit.entity.Display; import org.bukkit.entity.ItemDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java rename to src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java index e3aa6c4c6cd..3c9615ef75a 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/ExprItemOfItemDisplay.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays.item; +package org.skriptlang.skript.elements.displays.item; import org.bukkit.entity.Display; import org.bukkit.entity.ItemDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/package-info.java b/src/main/java/org/skriptlang/skript/elements/displays/item/package-info.java similarity index 93% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/item/package-info.java rename to src/main/java/org/skriptlang/skript/elements/displays/item/package-info.java index 7ef043453e2..8e6e52dc459 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/item/package-info.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/item/package-info.java @@ -17,7 +17,7 @@ * Copyright Peter Güttinger, SkriptLang team and contributors */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package org.skriptlang.skript.elements.expressions.displays.item; +package org.skriptlang.skript.elements.displays.item; import org.eclipse.jdt.annotation.DefaultLocation; import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java rename to src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java index d92fb633c0c..4cc363c199a 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayAlignment.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays.text; +package org.skriptlang.skript.elements.displays.text; import org.bukkit.entity.Display; import org.bukkit.entity.TextDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java rename to src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java index 0ee7af3e67b..57785dc54ae 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayLineWidth.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays.text; +package org.skriptlang.skript.elements.displays.text; import org.bukkit.entity.Display; import org.bukkit.entity.TextDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java rename to src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java index fd9b338aacc..773763f9ae2 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/ExprTextDisplayOpacity.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.displays.text; +package org.skriptlang.skript.elements.displays.text; import org.bukkit.entity.Display; import org.bukkit.entity.TextDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/package-info.java b/src/main/java/org/skriptlang/skript/elements/displays/text/package-info.java similarity index 93% rename from src/main/java/org/skriptlang/skript/elements/expressions/displays/text/package-info.java rename to src/main/java/org/skriptlang/skript/elements/displays/text/package-info.java index ba79ce2e8a7..1bfe2c58378 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/displays/text/package-info.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/text/package-info.java @@ -17,7 +17,7 @@ * Copyright Peter Güttinger, SkriptLang team and contributors */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package org.skriptlang.skript.elements.expressions.displays.text; +package org.skriptlang.skript.elements.displays.text; import org.eclipse.jdt.annotation.DefaultLocation; import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/ch/njol/skript/expressions/ExprItemFrameSlot.java b/src/main/java/org/skriptlang/skript/elements/expressions/ExprItemFrameSlot.java similarity index 58% rename from src/main/java/ch/njol/skript/expressions/ExprItemFrameSlot.java rename to src/main/java/org/skriptlang/skript/elements/expressions/ExprItemFrameSlot.java index f5d42ac3260..334d208adee 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprItemFrameSlot.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/ExprItemFrameSlot.java @@ -16,10 +16,11 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package ch.njol.skript.expressions; +package org.skriptlang.skript.elements.expressions; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; +import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.ItemFrame; import org.bukkit.entity.ThrowableProjectile; import org.eclipse.jdt.annotation.Nullable; @@ -31,35 +32,48 @@ import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.util.slot.DisplayEntitySlot; import ch.njol.skript.util.slot.DroppedItemSlot; import ch.njol.skript.util.slot.ItemFrameSlot; import ch.njol.skript.util.slot.Slot; import ch.njol.skript.util.slot.ThrowableProjectileSlot; @Name("Item of an Entity") -@Description("An item associated with an entity. For dropped item entities, it gets, obviously, the item that was dropped. " - + "For item frames, the item inside the frame is returned. For throwable projectiles (snowballs, enderpearls etc.)," - + "it gets the displayed item. Other entities do not have items associated with them.") -@Examples("") +@Description({ + "An item associated with an entity. For dropped item entities, it gets the item that was dropped. ", + "For item frames, the item inside the frame is returned.", + "For throwable projectiles (snowballs, enderpearls etc.) it gets the displayed item.", + "For display entities (snowballs, enderpearls etc.) it gets the displayed item.", + "Other entities do not have items associated with them." +}) +@Examples({ + "item of event-entity", + "", + "set the item inside of event-entity to a diamond sword named \"Example\"" +}) @Since("2.2-dev35, 2.2-dev36 (improved), 2.5.2 (throwable projectiles)") -@RequiredPlugins("Minecraft 1.15.2+ (throwable projectiles)") +@RequiredPlugins("Minecraft 1.15.2+ (throwable projectiles), 1.19.4+ (displays)") public class ExprItemFrameSlot extends SimplePropertyExpression { - + private static final boolean PROJECTILE_SUPPORT = Skript.classExists("org.bukkit.entity.ThrowableProjectile"); - + private static final boolean DISPLAYS_SUPPORT = Skript.classExists("org.bukkit.entity.ItemDisplay"); + static { - register(ExprItemFrameSlot.class, Slot.class, "item", "entities"); + register(ExprItemFrameSlot.class, Slot.class, "[the] item [inside]", "entities"); } - + @Override @Nullable - public Slot convert(Entity e) { - if (e instanceof ItemFrame) - return new ItemFrameSlot((ItemFrame) e); - else if (e instanceof Item) - return new DroppedItemSlot((Item) e); - else if (PROJECTILE_SUPPORT && e instanceof ThrowableProjectile) - return new ThrowableProjectileSlot((ThrowableProjectile) e); + public Slot convert(Entity entity) { + if (entity instanceof ItemFrame) { + return new ItemFrameSlot((ItemFrame) entity); + } else if (entity instanceof Item) { + return new DroppedItemSlot((Item) entity); + } else if (PROJECTILE_SUPPORT && entity instanceof ThrowableProjectile) { + return new ThrowableProjectileSlot((ThrowableProjectile) entity); + } else if (DISPLAYS_SUPPORT && entity instanceof ItemDisplay) { + return new DisplayEntitySlot((ItemDisplay) entity); + } return null; // Other entities don't have associated items } @@ -67,9 +81,10 @@ else if (PROJECTILE_SUPPORT && e instanceof ThrowableProjectile) protected String getPropertyName() { return "item of entity"; } - + @Override public Class getReturnType() { return Slot.class; } + } diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java rename to src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java index c8a2cfc3609..6e9d6584f81 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/quaternions/ExprRotateQuaternion.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions.quaternions; +package org.skriptlang.skript.elements.expressions; import org.bukkit.event.Event; import org.bukkit.util.Vector; From a4927cc36e21a2c07159bfe67554268175300a07 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Tue, 9 Jan 2024 11:42:45 -0700 Subject: [PATCH 042/104] Add versioning for hide effect --- src/main/java/ch/njol/skript/effects/EffHideEntity.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/ch/njol/skript/effects/EffHideEntity.java b/src/main/java/ch/njol/skript/effects/EffHideEntity.java index 59737d42893..7fc5c282899 100644 --- a/src/main/java/ch/njol/skript/effects/EffHideEntity.java +++ b/src/main/java/ch/njol/skript/effects/EffHideEntity.java @@ -27,6 +27,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Effect; import ch.njol.skript.lang.Expression; @@ -43,13 +44,15 @@ "spawn a block display at location infront of player:", "\thide event-entity from all players where [player input is not {_player}]" }) +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class EffHideEntity extends Effect { static { - Skript.registerEffect(EffHideEntity.class, - "hide %entities% from %players%", - "show %entities% to %players%"); + if (Skript.isRunningMinecraft(1, 19)) + Skript.registerEffect(EffHideEntity.class, + "hide %entities% from %players%", + "show %entities% to %players%"); } private Expression entities; From 46202dea7bd700c84182d415c01b8223a67e95dd Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Tue, 9 Jan 2024 11:43:30 -0700 Subject: [PATCH 043/104] Add versioning for hide effect --- src/main/java/ch/njol/skript/effects/EffHideEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/effects/EffHideEntity.java b/src/main/java/ch/njol/skript/effects/EffHideEntity.java index 7fc5c282899..42d0868a161 100644 --- a/src/main/java/ch/njol/skript/effects/EffHideEntity.java +++ b/src/main/java/ch/njol/skript/effects/EffHideEntity.java @@ -49,7 +49,7 @@ public class EffHideEntity extends Effect { static { - if (Skript.isRunningMinecraft(1, 19)) + if (Skript.isRunningMinecraft(1, 19, 4)) Skript.registerEffect(EffHideEntity.class, "hide %entities% from %players%", "show %entities% to %players%"); From 0eba425503442881611d4fe891f421226e462427 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Tue, 9 Jan 2024 11:59:16 -0700 Subject: [PATCH 044/104] Change tests --- src/test/skript/tests/misc/displays.sk | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index 183e4681ab7..91e98dd5d55 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -1,19 +1,17 @@ test "spawn displays" when running minecraft "1.19.4": spawn a text display at spawn of world "world": - assert billboard of display is fixed with "default billboard was not fixed" - set billboard of display to center - assert billboard of display is center with "failed to set billboard to center" - clear display - clear all entities - # Requiring Lime's literal compare pull requests - #spawn block display of grass_block[snowy=true] at spawn of world "world" - #assert last spawned block display is block display of grass_block[snowy=true] with "Failed to compare block display with block display" + set {_display} to event-display + assert billboard of display within {_display} is "fixed" parsed as billboard with "default billboard was not fixed" + set billboard of display within {_display} to "center" parsed as billboard + assert billboard of display within {_display} is "center" parsed as billboard with "failed to set billboard to center" clear all entities + spawn block display at spawn of world "world" + set block data of last spawned block display to grass_block[snowy=true] + assert block data of last spawned block display is grass_block[snowy=true] with "failed to compare block display block data" spawn an item display of a diamond sword of sharpness at spawn of world "world": - assert item transform of event-display is none with "item transform was not none" - set item transform of display to head - assert item transform of display is head with "failed to set item transform to head" - # Waiting on fix for issue #5711 - #assert display item of event-display is a diamond sword of sharpness with "failed to compare against the item of the display %display item of display%" - clear display + assert item transform of event-display is "none" parsed as item display transforms with "item transform was not none" + set item transform of display to "head" parsed as item display transforms + assert item transform of display is "head" parsed as item display transforms with "failed to set item transform to head" + assert item of event-item display is a diamond sword of sharpness with "failed to compare against the item of the display %item of display%" + clear all entities From 6d7bc501507b3b344ae28d69e79a7ea1cdf0b1fe Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Tue, 9 Jan 2024 12:04:01 -0700 Subject: [PATCH 045/104] Update submodule skript-aliases --- skript-aliases | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skript-aliases b/skript-aliases index 0884ede0fdf..703f47aa957 160000 --- a/skript-aliases +++ b/skript-aliases @@ -1 +1 @@ -Subproject commit 0884ede0fdf69e914b944500d9f24f1c000a90a2 +Subproject commit 703f47aa957346dcce8642a14a168e05e5f69f40 From 33ecaec847125f5819c7447eaf13780e8bc60171 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Tue, 9 Jan 2024 12:10:10 -0700 Subject: [PATCH 046/104] Fix tests --- src/test/skript/tests/misc/displays.sk | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index 91e98dd5d55..e43141bf8f7 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -4,14 +4,15 @@ test "spawn displays" when running minecraft "1.19.4": set {_display} to event-display assert billboard of display within {_display} is "fixed" parsed as billboard with "default billboard was not fixed" set billboard of display within {_display} to "center" parsed as billboard - assert billboard of display within {_display} is "center" parsed as billboard with "failed to set billboard to center" + assert billboard of display within {_display} is center with "failed to set billboard to center" clear all entities - spawn block display at spawn of world "world" - set block data of last spawned block display to grass_block[snowy=true] - assert block data of last spawned block display is grass_block[snowy=true] with "failed to compare block display block data" + spawn a block display at spawn of world "world" + set block data of event-block display to grass_block[snowy=true] + set {_display} to event-display + assert block data of display within {_display} is grass_block[snowy=true] with "failed to compare block display block data" spawn an item display of a diamond sword of sharpness at spawn of world "world": - assert item transform of event-display is "none" parsed as item display transforms with "item transform was not none" - set item transform of display to "head" parsed as item display transforms - assert item transform of display is "head" parsed as item display transforms with "failed to set item transform to head" + assert item transform of event-display is none with "item transform was not none" + set item transform of event-display to head transform + assert item transform of event-display is head with "failed to set item transform to head" assert item of event-item display is a diamond sword of sharpness with "failed to compare against the item of the display %item of display%" clear all entities From 436a9ae543e9e8b90d2305bfb3ce2a2f15ca0980 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Tue, 9 Jan 2024 12:33:44 -0700 Subject: [PATCH 047/104] Fix tests --- src/test/skript/tests/misc/displays.sk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index e43141bf8f7..b23e07edcbd 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -6,7 +6,7 @@ test "spawn displays" when running minecraft "1.19.4": set billboard of display within {_display} to "center" parsed as billboard assert billboard of display within {_display} is center with "failed to set billboard to center" clear all entities - spawn a block display at spawn of world "world" + spawn a block display at spawn of world "world": set block data of event-block display to grass_block[snowy=true] set {_display} to event-display assert block data of display within {_display} is grass_block[snowy=true] with "failed to compare block display block data" From 57c06efff44f9c29a37884f85e6112ad07f0c9ff Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Tue, 9 Jan 2024 12:40:37 -0700 Subject: [PATCH 048/104] Fix tests --- src/test/skript/tests/misc/displays.sk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index b23e07edcbd..c79ca93637b 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -7,12 +7,12 @@ test "spawn displays" when running minecraft "1.19.4": assert billboard of display within {_display} is center with "failed to set billboard to center" clear all entities spawn a block display at spawn of world "world": - set block data of event-block display to grass_block[snowy=true] + set block data of event-display to grass_block[snowy=true] set {_display} to event-display assert block data of display within {_display} is grass_block[snowy=true] with "failed to compare block display block data" spawn an item display of a diamond sword of sharpness at spawn of world "world": assert item transform of event-display is none with "item transform was not none" - set item transform of event-display to head transform + set item transform of event-display to head assert item transform of event-display is head with "failed to set item transform to head" - assert item of event-item display is a diamond sword of sharpness with "failed to compare against the item of the display %item of display%" + assert item of event-display is a diamond sword of sharpness with "failed to compare against the item of the display %item of display%" clear all entities From 25600ac41b0c15959a39571419a859b9ed4ded10 Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Mon, 12 Feb 2024 10:25:05 -0700 Subject: [PATCH 049/104] Apply suggestions from code review Co-authored-by: sovdee <10354869+sovdeeth@users.noreply.github.com> --- .../java/ch/njol/skript/expressions/ExprBlockData.java | 7 ++++--- .../java/ch/njol/skript/registrations/DefaultClasses.java | 4 ++-- .../java/ch/njol/skript/util/slot/DisplayEntitySlot.java | 2 +- .../displays/expressions/ExprDisplayInterpolation.java | 4 ++-- .../elements/displays/item/ExprItemOfItemDisplay.java | 5 ++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprBlockData.java b/src/main/java/ch/njol/skript/expressions/ExprBlockData.java index 06a8e121351..e9bfd44f493 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprBlockData.java +++ b/src/main/java/ch/njol/skript/expressions/ExprBlockData.java @@ -57,9 +57,10 @@ public class ExprBlockData extends SimplePropertyExpression { public BlockData convert(Object object) { if (object instanceof Block) return ((Block) object).getBlockData(); - if (!(object instanceof BlockDisplay)) - return null; - return ((BlockDisplay) object).getBlock(); + if (object instanceof BlockDisplay) + return ((BlockDisplay) object).getBlock(); + return null; + } @Nullable diff --git a/src/main/java/ch/njol/skript/registrations/DefaultClasses.java b/src/main/java/ch/njol/skript/registrations/DefaultClasses.java index 2bc4d201085..4422f1de5aa 100644 --- a/src/main/java/ch/njol/skript/registrations/DefaultClasses.java +++ b/src/main/java/ch/njol/skript/registrations/DefaultClasses.java @@ -42,11 +42,11 @@ public class DefaultClasses { public static ClassInfo STRING = getClassInfo(String.class); // Bukkit - public static ClassInfo OFFLINE_PLAYER = getClassInfo(OfflinePlayer.class); + public static ClassInfo OFFLINE_PLAYER = getClassInfo(OfflinePlayer.class); public static ClassInfo LOCATION = getClassInfo(Location.class); public static ClassInfo VECTOR = getClassInfo(Vector.class); public static ClassInfo PLAYER = getClassInfo(Player.class); - public static ClassInfo WORLD = getClassInfo(World.class); + public static ClassInfo WORLD = getClassInfo(World.class); // Skript public static ClassInfo COLOR = getClassInfo(Color.class); diff --git a/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java b/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java index adfad8d9e64..35feb81380b 100644 --- a/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java +++ b/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java @@ -54,7 +54,7 @@ public void setAmount(int amount) {} @Override public boolean isSameSlot(Slot other) { - if (other instanceof DisplayEntitySlot) // Same item frame + if (other instanceof DisplayEntitySlot) // Same display return ((DisplayEntitySlot) other).display.equals(display); return false; } diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java index f3b7765f341..c1bb7e995ee 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java @@ -61,7 +61,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @Nullable public Timespan convert(Display display) { - return Timespan.fromTicks_i(delay ? display.getInterpolationDelay() : display.getInterpolationDuration()); + return Timespan.fromTicks(delay ? display.getInterpolationDelay() : display.getInterpolationDuration()); } @Nullable @@ -72,7 +72,7 @@ public Class[] acceptChange(ChangeMode mode) { @Override public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - int ticks = (int) (delta == null ? 0 : (delta[0] instanceof Number ? ((Number) delta[0]).intValue() : ((Timespan) delta[0]).getTicks_i())); + int ticks = (int) (delta == null ? 0 : (delta[0] instanceof Number ? ((Number) delta[0]).intValue() : ((Timespan) delta[0]).getTicks())); ticks = Math.max(0, ticks); switch (mode) { case REMOVE_ALL: diff --git a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java index 3c9615ef75a..e90fcf5d5ba 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java @@ -72,9 +72,8 @@ public Class[] acceptChange(ChangeMode mode) { public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { ItemStack item = mode == ChangeMode.DELETE ? null : (ItemStack) delta[0]; for (Display display : getExpr().getArray(event)) { - if (!(display instanceof ItemDisplay)) - continue; - ((ItemDisplay) display).setItemStack(item); + if (display instanceof ItemDisplay) + ((ItemDisplay) display).setItemStack(item); } } From c1126453d56090de5adff2ec11a82172d627cbee Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 22 Feb 2024 17:05:04 -0700 Subject: [PATCH 050/104] Apply changes --- skript-aliases | 2 +- .../java/ch/njol/skript/SkriptConfig.java | 1 - .../ch/njol/skript/entity/DisplayData.java | 40 +++---- .../skript/expressions/ExprXYZComponent.java | 55 +++++---- .../expressions/ExprDisplayBillboard.java | 2 + .../expressions/ExprDisplayBrightness.java | 4 +- .../expressions/ExprDisplayGlowOverride.java | 2 + .../expressions/ExprDisplayHeightWidth.java | 2 + .../expressions/ExprDisplayInterpolation.java | 4 +- .../expressions/ExprDisplayShadow.java | 2 + .../ExprDisplayTeleportDuration.java | 105 ++++++++++++++++++ .../ExprDisplayTransformationRotation.java | 17 ++- ...DisplayTransformationScaleTranslation.java | 42 +++---- .../expressions/ExprDisplayViewRange.java | 4 +- .../item/ExprItemDisplayTransform.java | 2 + .../displays/item/ExprItemOfItemDisplay.java | 2 + .../text/ExprTextDisplayAlignment.java | 2 + .../text/ExprTextDisplayLineWidth.java | 2 + .../displays/text/ExprTextDisplayOpacity.java | 2 + .../expressions/ExprRotateQuaternion.java | 73 ++++++++---- .../skript/lang/util/JomlBukkitUtils.java | 28 +++++ src/main/resources/lang/default.lang | 7 +- 22 files changed, 299 insertions(+), 101 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTeleportDuration.java create mode 100644 src/main/java/org/skriptlang/skript/lang/util/JomlBukkitUtils.java diff --git a/skript-aliases b/skript-aliases index 703f47aa957..c6a515a9e4e 160000 --- a/skript-aliases +++ b/skript-aliases @@ -1 +1 @@ -Subproject commit 703f47aa957346dcce8642a14a168e05e5f69f40 +Subproject commit c6a515a9e4e249c2859f4cc2992bf0da559b63cc diff --git a/src/main/java/ch/njol/skript/SkriptConfig.java b/src/main/java/ch/njol/skript/SkriptConfig.java index 8b01aa118e3..13ce39f7620 100644 --- a/src/main/java/ch/njol/skript/SkriptConfig.java +++ b/src/main/java/ch/njol/skript/SkriptConfig.java @@ -23,7 +23,6 @@ import ch.njol.skript.config.Option; import ch.njol.skript.config.OptionSection; import ch.njol.skript.config.SectionNode; -import ch.njol.skript.entity.DisplayData; import ch.njol.skript.hooks.Hook; import ch.njol.skript.hooks.VaultHook; import ch.njol.skript.hooks.regions.GriefPreventionHook; diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index 8f2205c8c19..7f8b08280d3 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -55,13 +55,13 @@ private enum DisplayType { TEXT("org.bukkit.entity.TextDisplay", "text display"); @Nullable - private Class c; + private Class displaySubClass; private final String codeName; @SuppressWarnings("unchecked") DisplayType(String className, String codeName) { try { - this.c = (Class) Class.forName(className); + this.displaySubClass = (Class) Class.forName(className); } catch (ClassNotFoundException e) {} this.codeName = codeName; } @@ -75,7 +75,7 @@ public String toString() { static { List cn = new ArrayList<>(); for (DisplayType t : values()) { - if (t.c != null) + if (t.displaySubClass != null) cn.add(t.codeName); } codeNames = cn.toArray(new String[0]); @@ -104,22 +104,22 @@ public DisplayData(DisplayType type) { @SuppressWarnings("unchecked") protected boolean init(Literal[] exprs, int matchedPattern, ParseResult parseResult) { type = DisplayType.values()[matchedPattern]; - if (exprs.length > 0 && exprs[0] != null) { - if (type == DisplayType.BLOCK && exprs[0] != null) { - Object object = ((Literal) exprs[0]).getSingle(); - if (object instanceof ItemType) { - Material material = ((ItemType) object).getMaterial(); - if (!material.isBlock()) { - Skript.error("A block display must be a block item. " + Classes.toString(material) + " is not a block. If you want to spawn an item, use an 'item display'"); - return false; - } - blockData = Bukkit.createBlockData(material); - } else { - blockData = (BlockData) object; + if (exprs.length == 0 || exprs[0] == null) + return true; + if (type == DisplayType.BLOCK) { + Object object = ((Literal) exprs[0]).getSingle(); + if (object instanceof ItemType) { + Material material = ((ItemType) object).getMaterial(); + if (!material.isBlock()) { + Skript.error("A block display must be a block item. " + Classes.toString(material) + " is not a block. If you want to spawn an item, use an 'item display'"); + return false; } - } else if (type == DisplayType.ITEM) { - item = ((Literal) exprs[0]).getSingle().getRandom(); + blockData = Bukkit.createBlockData(material); + } else { + blockData = (BlockData) object; } + } else if (type == DisplayType.ITEM) { + item = ((Literal) exprs[0]).getSingle().getRandom(); } return true; } @@ -128,7 +128,7 @@ protected boolean init(Literal[] exprs, int matchedPattern, ParseResult parse protected boolean init(@Nullable Class c, @Nullable Display entity) { DisplayType[] types = DisplayType.values(); for (int i = types.length - 1; i >= 0; i--) { - Class display = types[i].c; + Class display = types[i].displaySubClass; if (display == null) continue; if (entity == null ? c.isAssignableFrom(display) : display.isInstance(entity)) { @@ -211,12 +211,12 @@ public boolean match(Display entity) { default: break; } - return type.c != null && type.c.isInstance(entity); + return type.displaySubClass != null && type.displaySubClass.isInstance(entity); } @Override public Class getType() { - return type.c != null ? type.c : Display.class; + return type.displaySubClass != null ? type.displaySubClass : Display.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 1bce046f077..03c3e0895fe 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -23,6 +23,8 @@ import org.eclipse.jdt.annotation.Nullable; import org.joml.Quaternionf; +import java.util.Locale; + import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer; import ch.njol.skript.classes.Changer.ChangeMode; @@ -65,36 +67,41 @@ public class ExprXYZComponent extends SimplePropertyExpression { String types = "vectors"; if (Skript.isRunningMinecraft(1, 19, 4)) types += "/quaternions"; - register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (0¦w|1¦x|2¦y|3¦z) [component[s]]", types); + register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (:w|:x|:y|:z) [component[s]]", types); } - private final static Character[] axes = new Character[] {'w', 'x', 'y', 'z'}; + private enum AXIS { + W, + X, + Y, + Z; + } - private int axis; + private AXIS axis; @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - axis = parseResult.mark; + axis = AXIS.valueOf(parseResult.tags.get(0).toUpperCase(Locale.ENGLISH)); return super.init(exprs, matchedPattern, isDelayed, parseResult); } @Override public Number convert(Object object) { if (object instanceof Vector) { - if (axis == 0) + if (axis == AXIS.W) return null; Vector vector = (Vector) object; - return axis == 1 ? vector.getX() : (axis == 2 ? vector.getY() : vector.getZ()); + return axis == AXIS.X ? vector.getX() : (axis == AXIS.Y ? vector.getY() : vector.getZ()); } else { Quaternionf quaternion = (Quaternionf) object; switch (axis) { - case 0: + case W: return quaternion.w(); - case 1: + case X: return quaternion.x(); - case 2: + case Y: return quaternion.y(); - case 3: + case Z: return quaternion.z(); default: return null; @@ -119,7 +126,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { assert delta != null; for (Object object : getExpr().getArray(event)) { if (object instanceof Vector) { - if (axis == 0) + if (axis == AXIS.W) return; Vector vector = (Vector) object; double value = ((Number) delta[0]).doubleValue(); @@ -128,9 +135,9 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { value = -value; //$FALL-THROUGH$ case ADD: - if (axis == 1) { + if (axis == AXIS.X) { vector.setX(vector.getX() + value); - } else if (axis == 2) { + } else if (axis == AXIS.Y) { vector.setY(vector.getY() + value); } else { vector.setZ(vector.getZ() + value); @@ -138,9 +145,9 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); break; case SET: - if (axis == 1) { + if (axis == AXIS.X) { vector.setX(value); - } else if (axis == 2) { + } else if (axis == AXIS.Y) { vector.setY(value); } else { vector.setZ(value); @@ -158,26 +165,26 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { value = -value; //$FALL-THROUGH$ case ADD: - if (axis == 0) { + if (axis == AXIS.W) { quaternion.set(quaternion.w() + value, quaternion.x(), quaternion.y(), quaternion.z()); - } else if (axis == 1) { + } else if (axis == AXIS.X) { quaternion.set(quaternion.w(), quaternion.x() + value, quaternion.y(), quaternion.z()); - } else if (axis == 2) { + } else if (axis == AXIS.Y) { quaternion.set(quaternion.w(), quaternion.x(), quaternion.y() + value, quaternion.z()); - } else if (axis == 3) { + } else if (axis == AXIS.Z) { quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), quaternion.z() + value); } if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) getExpr().change(event, new Quaternionf[] {quaternion}, ChangeMode.SET); break; case SET: - if (axis == 0) { + if (axis == AXIS.W) { quaternion.set(value, quaternion.x(), quaternion.y(), quaternion.z()); - } else if (axis == 1) { + } else if (axis == AXIS.X) { quaternion.set(quaternion.w(), value, quaternion.y(), quaternion.z()); - } else if (axis == 2) { + } else if (axis == AXIS.Y) { quaternion.set(quaternion.w(), quaternion.x(), value, quaternion.z()); - } else if (axis == 3) { + } else if (axis == AXIS.Z) { quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), value); } if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) @@ -199,7 +206,7 @@ public Class getReturnType() { @Override protected String getPropertyName() { - return axes[axis] + " component"; + return axis.name().toLowerCase(Locale.ENGLISH) + " component"; } } diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java index 3bd745ec8c9..98fd1b3f5f5 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java @@ -28,6 +28,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; @@ -39,6 +40,7 @@ "Displays spawn with the default setting as 'fixed'. Resetting this expression will also set it to 'fixed'." }) @Examples("set billboard of the last spawned text display to center") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayBillboard extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java index b5772c674fc..4a2c017f478 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java @@ -28,6 +28,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -41,6 +42,7 @@ "Value must be between 0 and 15." }) @Examples("set sky brightness of the last spawned text display to 5") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayBrightness extends SimplePropertyExpression { @@ -73,7 +75,6 @@ public Class[] acceptChange(ChangeMode mode) { public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); int change = delta == null ? 0 : (int) ((Number) delta[0]).intValue(); - change = Math.max(0, Math.min(15, change)); switch (mode) { case REMOVE_ALL: case REMOVE: @@ -100,6 +101,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { display.setBrightness(null); break; case SET: + change = Math.max(0, Math.min(15, change)); for (Display display : displays) { Brightness current = display.getBrightness(); if (sky) { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java index a51bc42cf73..364f31fd2ff 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java @@ -27,6 +27,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.util.Color; @@ -39,6 +40,7 @@ "This overrides whatever color is already set for the scoreboard team of the displays." }) @Examples("set glow color override of the last spawned text display to blue") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayGlowOverride extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java index dff0d16fad4..6e6b0630db1 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java @@ -27,6 +27,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -42,6 +43,7 @@ "If set to 0, no culling will occur on both the vertical and horizontal directions. Default is 0.0." }) @Examples("set height of the last spawned text display to 2.5") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayHeightWidth extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java index c1bb7e995ee..c7933ce6286 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java @@ -27,6 +27,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -42,6 +43,7 @@ "Setting to 0 seconds will make it immediate." }) @Examples("set interpolation delay of the last spawned text display to 2 ticks") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayInterpolation extends SimplePropertyExpression { @@ -73,7 +75,6 @@ public Class[] acceptChange(ChangeMode mode) { public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); int ticks = (int) (delta == null ? 0 : (delta[0] instanceof Number ? ((Number) delta[0]).intValue() : ((Timespan) delta[0]).getTicks())); - ticks = Math.max(0, ticks); switch (mode) { case REMOVE_ALL: case REMOVE: @@ -100,6 +101,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } break; case SET: + ticks = Math.max(0, ticks); for (Display display : displays) { if (delay) { display.setInterpolationDelay(ticks); diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java index 3039282b0d2..f440e5b9af3 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java @@ -27,6 +27,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -37,6 +38,7 @@ @Name("Display Shadow Radius/Strength") @Description("Returns or changes the shadow radius/strength of displays.") @Examples("set shadow radius of the last spawned text display to 1.75") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayShadow extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTeleportDuration.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTeleportDuration.java new file mode 100644 index 00000000000..8188d6e96a9 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTeleportDuration.java @@ -0,0 +1,105 @@ +/** + * This file is part of Skript. + * + * Skript is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Skript is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Skript. If not, see . + * + * Copyright Peter Güttinger, SkriptLang team and contributors + */ +package org.skriptlang.skript.elements.displays.expressions; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.util.Timespan; +import ch.njol.util.coll.CollectionUtils; + +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +@Name("Display Teleport Delay/Duration") +@Description({ + "The teleport duration of displays is the amount of time it takes to get between locations.", + "0 means that updates are applied immediately.", + "1 means that the display entity will move from current position to the updated one over one tick.", + "Higher values spread the movement over multiple ticks. Max of 59 ticks." +}) +@Examples({ + "set teleport delay of the last spawned text display to 2 ticks", + "wait 2 ticks", + "message \"display entity has arived at location\"" +}) +@RequiredPlugins("Spigot 1.20.4+") +@Since("INSERT VERSION") +public class ExprDisplayTeleportDuration extends SimplePropertyExpression { + + static { + if (Skript.isRunningMinecraft(1, 20, 4)) + registerDefault(ExprDisplayTeleportDuration.class, Timespan.class, "teleport duration[s]", "displays"); + } + + @Override + @Nullable + public Timespan convert(Display display) { + return Timespan.fromTicks(display.getTeleportDuration()); + } + + @Nullable + public Class[] acceptChange(ChangeMode mode) { + return CollectionUtils.array(Timespan.class, Number.class); + } + + @Override + public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Display[] displays = getExpr().getArray(event); + int ticks = (int) (delta == null ? 0 : (delta[0] instanceof Number ? ((Number) delta[0]).intValue() : ((Timespan) delta[0]).getTicks())); + switch (mode) { + case REMOVE_ALL: + case REMOVE: + ticks = -ticks; + case ADD: + for (Display display : displays) { + int value = Math.max(0, Math.min(59, display.getTeleportDuration() + ticks)); + display.setTeleportDuration(value); + } + break; + case DELETE: + case RESET: + for (Display display : displays) + display.setTeleportDuration(0); + break; + case SET: + ticks = Math.max(0, Math.min(59, ticks)); + for (Display display : displays) + display.setTeleportDuration(ticks); + break; + } + } + + @Override + public Class getReturnType() { + return Timespan.class; + } + + @Override + protected String getPropertyName() { + return "teleport duration"; + } + +} diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java index c521f098cc1..8be7f7ba852 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java @@ -29,6 +29,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -42,12 +43,13 @@ "The left rotation is applied first, with the right rotation then being applied based on the rotated axis." }) @Examples("set left transformation rotation of last spawned block display to quaternionf(1, 0, 0, 0) # reset block display") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayTransformationRotation extends SimplePropertyExpression { static { if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprDisplayTransformationRotation.class, Quaternionf.class, "(:left|right) transformation rotation", "displays"); + registerDefault(ExprDisplayTransformationRotation.class, Quaternionf.class, "(:left|right) [transformation] rotation", "displays"); } private boolean left; @@ -69,16 +71,21 @@ public Quaternionf convert(Display display) { public Class[] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET) return CollectionUtils.array(Quaternionf.class); + if (mode == ChangeMode.RESET) + return CollectionUtils.array(); return null; } @Override public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - Display[] displays = getExpr().getArray(event); - if (delta == null) + Quaternionf quaternion = null; + if (mode == ChangeMode.RESET) + quaternion = new Quaternionf(1, 0, 0, 0); + if (delta != null) + quaternion = (Quaternionf) delta[0]; + if (quaternion == null) return; - Quaternionf quaternion = (Quaternionf) delta[0]; - for (Display display : displays) { + for (Display display : getExpr().getArray(event)) { Transformation transformation = display.getTransformation(); Transformation change = null; if (left) { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java index 92b9d45997a..878edd650fd 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java @@ -18,18 +18,12 @@ */ package org.skriptlang.skript.elements.displays.expressions; -import org.bukkit.entity.Display; -import org.bukkit.event.Event; -import org.bukkit.util.Transformation; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; -import org.joml.Vector3f; - import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -37,15 +31,24 @@ import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.bukkit.util.Transformation; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; +import org.skriptlang.skript.lang.util.JomlBukkitUtils; + @Name("Display Transformation Scale/Translation") @Description("Returns or changes the transformation scale or translation of displays.") @Examples("set transformation translation of display to vector from -0.5, -0.5, -0.5 # Center the display in the same position as a block") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayTransformationScaleTranslation extends SimplePropertyExpression { static { if (Skript.isRunningMinecraft(1, 19, 4)) - register(ExprDisplayTransformationScaleTranslation.class, Vector.class, "transformation (:scale|translation)", "displays"); + register(ExprDisplayTransformationScaleTranslation.class, Vector.class, "[transformation] (:scale|translation)", "displays"); } private boolean scale; @@ -60,23 +63,28 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Nullable public Vector convert(Display display) { Transformation transformation = display.getTransformation(); - return toBukkitVector(scale ? transformation.getScale() : transformation.getTranslation()); + return JomlBukkitUtils.toBukkitVector(scale ? transformation.getScale() : transformation.getTranslation()); } @Nullable public Class[] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET) return CollectionUtils.array(Vector.class); + if (mode == ChangeMode.RESET) + return CollectionUtils.array(); return null; } @Override public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - Display[] displays = getExpr().getArray(event); - if (delta == null) + Vector3f vector = null; + if (mode == ChangeMode.RESET) + vector = new Vector3f(1F, 1F, 1F); + if (delta != null) + vector = JomlBukkitUtils.toVector((Vector) delta[0]); + if (vector == null) return; - Vector3f vector = toVector((Vector) delta[0]); - for (Display display : displays) { + for (Display display : getExpr().getArray(event)) { Transformation transformation = display.getTransformation(); Transformation change; if (scale) { @@ -88,14 +96,6 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } } - private Vector toBukkitVector(Vector3f vector) { - return new Vector(vector.x, vector.y, vector.z); - } - - private Vector3f toVector(Vector vector) { - return new Vector3f((float)vector.getX(), (float)vector.getY(), (float)vector.getZ()); - } - @Override public Class getReturnType() { return Vector.class; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java index 48568282eb9..aca711bfdab 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java @@ -27,6 +27,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; @@ -36,7 +37,8 @@ "Returns or changes the view range of displays.", "Default value is 1.0. This value is then multiplied by 64 and the player's entity view distance setting to determine the actual range." }) -@Examples("set view range of the last spawned text display to 2.7") +@Examples("set view range of the last spawned text display to 2.9") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayViewRange extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java index bf7f6c9a0e2..51e81d2bb73 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java @@ -29,6 +29,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; @@ -36,6 +37,7 @@ @Name("Item Display Transform") @Description("Returns or changes the item display transform of item displays.") @Examples("set the item transform of the last spawned item display to fixed # Reset to default") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprItemDisplayTransform extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java index e90fcf5d5ba..36e4fd180ea 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java @@ -29,6 +29,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; @@ -36,6 +37,7 @@ @Name("Item Display Item") @Description("Returns or changes the itemstack of item displays.") @Examples("set the display item of the last spawned item display to a diamond sword") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprItemOfItemDisplay extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java index 4cc363c199a..a63767029cc 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java @@ -29,6 +29,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; @@ -36,6 +37,7 @@ @Name("Text Display Alignment") @Description("Returns or changes the alignment setting of text displays.") @Examples("set text alignment of the last spawned text display to left") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprTextDisplayAlignment extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java index 57785dc54ae..48c8b8d6e57 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java @@ -28,6 +28,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; @@ -35,6 +36,7 @@ @Name("Text Display Line Width") @Description("Returns or changes the line width of text displays. Default is 200.") @Examples("set the line width of the last spawned text display to 300") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprTextDisplayLineWidth extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java index 773763f9ae2..6819b43c203 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java @@ -28,6 +28,7 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; @@ -38,6 +39,7 @@ "Values are between -127 and 127. The value of 127 represents it being completely opaque." }) @Examples("set the opacity of the last spawned text display to -1 # Reset") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprTextDisplayOpacity extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java index 6e9d6584f81..64801c0d53e 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java @@ -23,11 +23,13 @@ import org.eclipse.jdt.annotation.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; +import org.skriptlang.skript.lang.util.JomlBukkitUtils; import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; @@ -35,23 +37,25 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; -@Name("Rotate Quaternion") +@Name("Rotate Quaternion/Vector") @Description({ - "Rotates a Quaternion around an axis or a vector and by a set amount of degrees.", - "When you use a vector, the values will be used to rotate the x, y and z." + "Rotates a Quaternion around an axis a set amount of degrees or rotated by a vector.", + "When you use a vector, the values will be used to rotate the x, y and z.", + "Vector numbers will get converted from a double down to a float." }) -@Examples("rotate {_quaternion} around vector from 1, 0, 0 at player by 90 degrees") +@Examples("set {_new} to {_quaternion} rotated by vector(1, 0, 0)") +@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") -public class ExprRotateQuaternion extends SimpleExpression { +public class ExprRotateQuaternion extends SimpleExpression { static { if (Skript.isRunningMinecraft(1, 19, 4)) - Skript.registerExpression(ExprRotateQuaternion.class, Quaternionf.class, ExpressionType.SIMPLE, - "%quaternions% rotated (around|on) [the] (:x|:y|:z)-axis by %number% [degrees|radians]", + Skript.registerExpression(ExprRotateQuaternion.class, Object.class, ExpressionType.SIMPLE, + "%quaternions/vectors% rotated (around|on) [the] (:x|:y|:z)-axis by %number% [degrees|radians]", "%quaternions% rotated by %vector%"); } - private Expression quaternions; + private Expression objects; @Nullable private Expression degrees; @@ -65,7 +69,7 @@ public class ExprRotateQuaternion extends SimpleExpression { @Override @SuppressWarnings("unchecked") public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - quaternions = (Expression) exprs[0]; + objects = exprs[0]; if (parseResult.tags.size() > 0) { axis = parseResult.tags.get(0); degrees = (Expression) exprs[1]; @@ -76,36 +80,59 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } @Override - protected Quaternionf @Nullable [] get(Event event) { + @Nullable + protected Object[] get(Event event) { if (vector == null && axis != null) { float degrees = this.degrees.getOptionalSingle(event).orElse(0).floatValue(); switch (axis) { case "x": - return quaternions.stream(event) - .map(quaternion -> quaternion.rotateX(degrees)) - .toArray(Quaternionf[]::new); + return objects.stream(event) + .map(object -> { + if (object instanceof Quaternionf) { + return ((Quaternionf) object).rotateX(degrees); + } else if (object instanceof Vector3f) { + return JomlBukkitUtils.toVector(((Vector) object)).rotateX(degrees); + } + return null; + }) + .toArray(); case "y": - return quaternions.stream(event) - .map(quaternion -> quaternion.rotateY(degrees)) - .toArray(Quaternionf[]::new); + return objects.stream(event) + .map(object -> { + if (object instanceof Quaternionf) { + return ((Quaternionf) object).rotateY(degrees); + } else if (object instanceof Vector3f) { + return JomlBukkitUtils.toVector(((Vector) object)).rotateY(degrees); + } + return null; + }) + .toArray(); case "z": - return quaternions.stream(event) - .map(quaternion -> quaternion.rotateZ(degrees)) - .toArray(Quaternionf[]::new); + return objects.stream(event) + .map(object -> { + if (object instanceof Quaternionf) { + return ((Quaternionf) object).rotateZ(degrees); + } else if (object instanceof Vector3f) { + return JomlBukkitUtils.toVector(((Vector) object)).rotateZ(degrees); + } + return null; + }) + .toArray(); } } Vector vector = this.vector.getSingle(event); if (vector == null) return new Quaternionf[0]; Vector3f vector3f = new Vector3f((float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); - return quaternions.stream(event) + return objects.stream(event) + .map(Quaternionf.class::cast) .map(quaternion -> quaternion.rotateZYX(vector3f.x(), vector3f.y(), vector3f.x())) .toArray(Quaternionf[]::new); } @Override public boolean isSingle() { - return quaternions.isSingle(); + return objects.isSingle(); } @Override @@ -116,10 +143,10 @@ public Class getReturnType() { @Override public String toString(@Nullable Event event, boolean debug) { if (vector == null) - return quaternions.toString(event, debug) + + return objects.toString(event, debug) + " rotated around the " + axis + "-axis " + " by " + degrees.toString(event, debug) + " degrees"; - return quaternions.toString(event, debug) + + return objects.toString(event, debug) + " rotated by " + vector.toString(event, debug); } diff --git a/src/main/java/org/skriptlang/skript/lang/util/JomlBukkitUtils.java b/src/main/java/org/skriptlang/skript/lang/util/JomlBukkitUtils.java new file mode 100644 index 00000000000..135db9ee955 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/lang/util/JomlBukkitUtils.java @@ -0,0 +1,28 @@ +package org.skriptlang.skript.lang.util; + +import org.bukkit.util.Vector; +import org.joml.Vector3f; + +public class JomlBukkitUtils { + + /** + * Converts Joml {@link Vector3f} to Bukkit {@link Vector} + * + * @param vector {@link Vector3f} + * @return converted vector as Bukkit {@link Vector} + */ + public static Vector toBukkitVector(Vector3f vector) { + return new Vector(vector.x, vector.y, vector.z); + } + + /** + * Converts Bukkit {@link Vector} to Joml {@link Vector3f} + * + * @param vector {@link Vector} + * @return converted vector as Joml {@link Vector3f} + */ + public static Vector3f toVector(Vector vector) { + return new Vector3f((float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); + } + +} diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 664afe7fa17..b142a18ccfb 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1953,6 +1953,7 @@ moon phases: waxing_crescent: waxing crescent waxing_gibbous: waxing gibbous +# -- Quit Reasons -- quit reasons: disconnected: disconnected, quit erroneous_state: erroneous, erroneous state @@ -1981,9 +1982,9 @@ billboards: # -- Text Display Alignments -- text alignments: - center: center, middle - left: left - right: right + center: center, middle, centered text, centered, center aligned + left: left, left aligned + right: right, right aligned # -- Item Display Transforms -- item display transforms: From 84003108605657519743374b9da0026ac7d34a76 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 22 Feb 2024 18:00:09 -0700 Subject: [PATCH 051/104] Add axis angle --- .../skript/classes/data/DefaultFunctions.java | 61 +++++++++++----- .../njol/skript/classes/data/JavaClasses.java | 40 ++++++++++- .../skript/expressions/ExprXYZComponent.java | 70 ++++++++++++++++--- .../ExprDisplayTransformationRotation.java | 15 ++-- src/main/resources/lang/default.lang | 5 +- 5 files changed, 157 insertions(+), 34 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index 030f38f1cc7..780424c33f8 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -18,20 +18,6 @@ */ package ch.njol.skript.classes.data; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.Calendar; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; -import org.eclipse.jdt.annotation.Nullable; -import org.joml.Quaternionf; - import ch.njol.skript.Skript; import ch.njol.skript.expressions.base.EventValueExpression; import ch.njol.skript.lang.function.FunctionEvent; @@ -49,6 +35,21 @@ import ch.njol.util.StringUtils; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; +import org.eclipse.jdt.annotation.Nullable; +import org.joml.AxisAngle4f; +import org.joml.Quaternionf; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Calendar; +import java.util.UUID; + public class DefaultFunctions { private static String str(double n) { @@ -555,8 +556,8 @@ public Boolean[] executeSimple(Object[][] params) { .examples("isNaN(0) # false", "isNaN(0/0) # true", "isNaN(sqrt(-1)) # true") .since("2.8.0"); - if (Skript.classExists("org.joml.Quaternionf")) - Functions.registerFunction(new SimpleJavaFunction("quaternionf", new Parameter[] { + if (Skript.classExists("org.joml.Quaternionf")) + Functions.registerFunction(new SimpleJavaFunction("quaternion", new Parameter[] { new Parameter<>("w", DefaultClasses.NUMBER, true, null), new Parameter<>("x", DefaultClasses.NUMBER, true, null), new Parameter<>("y", DefaultClasses.NUMBER, true, null), @@ -570,9 +571,31 @@ public Quaternionf[] executeSimple(Object[][] params) { double z = ((Number) params[3][0]).doubleValue(); return CollectionUtils.array(new Quaternionf(x, y, z, w)); } - }).description("Returns a quaternion from the given w, x, y and z parameters.") - .examples("quaternionf(1, 5.6, 45.21, 10)") - .since("INSERT VERSION"); + }) + .description("Returns a quaternion from the given w, x, y and z parameters.") + .examples("quaternion(1, 5.6, 45.21, 10)") + .since("INSERT VERSION"); + + if (Skript.classExists("org.joml.AxisAngle4f")) + Functions.registerFunction(new SimpleJavaFunction("axisAngle", new Parameter[] { + new Parameter<>("angle", DefaultClasses.NUMBER, true, null), + new Parameter<>("x", DefaultClasses.NUMBER, true, null), + new Parameter<>("y", DefaultClasses.NUMBER, true, null), + new Parameter<>("z", DefaultClasses.NUMBER, true, null) + }, Classes.getExactClassInfo(AxisAngle4f.class), true) { + @Override + public AxisAngle4f[] executeSimple(Object[][] params) { + float angle = ((Number) params[0][0]).floatValue(); + float x = ((Number) params[1][0]).floatValue(); + float y = ((Number) params[2][0]).floatValue(); + float z = ((Number) params[3][0]).floatValue(); + return CollectionUtils.array(new AxisAngle4f(angle, x, y, z)); + } + }) + .description("Returns an axis angle from the given angle, x, y and z parameters.") + .examples("axisangle(90, 50.6, 20.0, 10.0)") + .since("INSERT VERSION"); + } } diff --git a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java index 41846b2b82a..3001a58bc27 100644 --- a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java @@ -21,6 +21,7 @@ import java.util.regex.Pattern; import org.eclipse.jdt.annotation.Nullable; +import org.joml.AxisAngle4f; import org.joml.Quaternionf; import ch.njol.skript.Skript; @@ -637,7 +638,7 @@ public boolean mustSyncDeserialization() { Classes.registerClass(new ClassInfo<>(Quaternionf.class, "quaternion") .user("quaternionf?s?") .name("Quaternion") - .description("Quaternions are used for representing four dimensions where all four numbers are real.") + .description("Quaternions are used for representing x y z while having w representing the scale. All four numbers are real.") .since("INSERT VERSION") .parser(new Parser() { public boolean canParse(ParseContext context) { @@ -660,7 +661,7 @@ public String toVariableNameString(Quaternionf quaternion) { public Quaternionf clone(Quaternionf quaternion) { try { // Implements cloneable, but doesn't return a Quaternionf. - // org.joml improperly override. Returns Object. + // org.joml improper override. Returns Object. return (Quaternionf) quaternion.clone(); } catch (CloneNotSupportedException e) { return null; @@ -668,6 +669,41 @@ public Quaternionf clone(Quaternionf quaternion) { } })); + if (Skript.classExists("org.joml.AxisAngle4f")) + Classes.registerClass(new ClassInfo<>(AxisAngle4f.class, "axisangle") + .user("axis ?angle(4f)?s?") + .name("Axis Angle") + .description("Represents a 3D rotation of a given radians about an axis represented as an unit 3D vector.") + .since("INSERT VERSION") + .parser(new Parser() { + public boolean canParse(ParseContext context) { + return false; + } + + @Override + public String toString(AxisAngle4f axisangle, int flags) { + return "angle:" + Skript.toString(axisangle.angle) + ", x:" + Skript.toString(axisangle.x) + ", y:" + Skript.toString(axisangle.y) + ", z:" + Skript.toString(axisangle.z); + } + + @Override + public String toVariableNameString(AxisAngle4f axisangle) { + return axisangle.angle + "," + axisangle.x + "," + axisangle.y + "," + axisangle.z; + } + }) + .defaultExpression(new EventValueExpression<>(AxisAngle4f.class)) + .cloner(new Cloner() { + @Override + public AxisAngle4f clone(AxisAngle4f axisangle) { + try { + // Implements cloneable, but doesn't return a AxisAngle4f. + // org.joml improper override. Returns Object. + return (AxisAngle4f) axisangle.clone(); + } catch (CloneNotSupportedException e) { + return null; + } + } + })); + } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 0a67ef4af91..5e186a29163 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -21,6 +21,7 @@ import org.bukkit.event.Event; import org.bukkit.util.Vector; import org.eclipse.jdt.annotation.Nullable; +import org.joml.AxisAngle4f; import org.joml.Quaternionf; import java.util.Locale; @@ -44,10 +45,10 @@ * Ported by Sashie from skript-vectors with bi0qaw's permission. * @author bi0qaw */ -@Name("Vector/Quaternion - XYZ Component") +@Name("Vector/Quaternion/AxisAngle - XYZ Component") @Description({ - "Gets or changes the x, y or z component of vectors/quaternions.", - "You cannot use w of vector. W is for quaternions only." + "Gets or changes the x, y or z component of vectors/quaternions/axis angles.", + "You cannot use w of vector. W/ANGLE is for quaternions/axis angles only." }) @Examples({ "set {_v} to vector 1, 2, 3", @@ -68,8 +69,8 @@ public class ExprXYZComponent extends SimplePropertyExpression { static { String types = "vectors"; if (Skript.isRunningMinecraft(1, 19, 4)) - types += "/quaternions"; - register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (:w|:x|:y|:z) [component[s]]", types); + types += "/quaternions/axisangle"; + register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (w:(w|angle)|:x|:y|:z) [component[s]]", types); } private enum AXIS { @@ -94,7 +95,7 @@ public Number convert(Object object) { return null; Vector vector = (Vector) object; return axis == AXIS.X ? vector.getX() : (axis == AXIS.Y ? vector.getY() : vector.getZ()); - } else { + } else if (object instanceof Quaternionf) { Quaternionf quaternion = (Quaternionf) object; switch (axis) { case W: @@ -108,12 +109,27 @@ public Number convert(Object object) { default: return null; } + } else if (object instanceof AxisAngle4f) { + AxisAngle4f axisAngle = (AxisAngle4f) object; + switch (axis) { + case W: + return axisAngle.angle; + case X: + return axisAngle.x; + case Y: + return axisAngle.y; + case Z: + return axisAngle.z; + default: + return null; + } } + return null; } @Override public Class[] acceptChange(ChangeMode mode) { - if (getExpr().getReturnType().equals(Quaternionf.class)) { + if (getExpr().getReturnType().equals(Quaternionf.class) || getExpr().getReturnType().equals(AxisAngle4f.class)) { if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE)) return new Class[] {Number.class}; } @@ -159,7 +175,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { default: assert false; } - } else { + } else if (object instanceof Quaternionf) { float value = ((Number) delta[0]).floatValue(); Quaternionf quaternion = (Quaternionf) object; switch (mode) { @@ -197,6 +213,44 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { case RESET: assert false; } + } else if (object instanceof AxisAngle4f) { + float value = ((Number) delta[0]).floatValue(); + AxisAngle4f axisAngle = (AxisAngle4f) object; + switch (mode) { + case REMOVE: + value = -value; + //$FALL-THROUGH$ + case ADD: + if (axis == AXIS.W) { + axisAngle.set(axisAngle.angle + value, axisAngle.x, axisAngle.y, axisAngle.z); + } else if (axis == AXIS.X) { + axisAngle.set(axisAngle.angle, axisAngle.x + value, axisAngle.y, axisAngle.z); + } else if (axis == AXIS.Y) { + axisAngle.set(axisAngle.angle, axisAngle.x, axisAngle.y + value, axisAngle.z); + } else if (axis == AXIS.Z) { + axisAngle.set(axisAngle.angle, axisAngle.x, axisAngle.y, axisAngle.z + value); + } + if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, AxisAngle4f.class)) + getExpr().change(event, new AxisAngle4f[] {axisAngle}, ChangeMode.SET); + break; + case SET: + if (axis == AXIS.W) { + axisAngle.set(value, axisAngle.x, axisAngle.y, axisAngle.z); + } else if (axis == AXIS.X) { + axisAngle.set(axisAngle.angle, value, axisAngle.y, axisAngle.z); + } else if (axis == AXIS.Y) { + axisAngle.set(axisAngle.angle, axisAngle.x, value, axisAngle.z); + } else if (axis == AXIS.Z) { + axisAngle.set(axisAngle.angle, axisAngle.x, axisAngle.y, value); + } + if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, AxisAngle4f.class)) + getExpr().change(event, new AxisAngle4f[] {axisAngle}, ChangeMode.SET); + break; + case DELETE: + case REMOVE_ALL: + case RESET: + assert false; + } } } } diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java index 8be7f7ba852..52532b56893 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java @@ -22,6 +22,7 @@ import org.bukkit.event.Event; import org.bukkit.util.Transformation; import org.jetbrains.annotations.Nullable; +import org.joml.AxisAngle4f; import org.joml.Quaternionf; import ch.njol.skript.Skript; @@ -42,7 +43,7 @@ "Returns or changes the transformation rotation of displays.", "The left rotation is applied first, with the right rotation then being applied based on the rotated axis." }) -@Examples("set left transformation rotation of last spawned block display to quaternionf(1, 0, 0, 0) # reset block display") +@Examples("set left transformation rotation of last spawned block display to quaternion(1, 0, 0, 0) # reset block display") @RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayTransformationRotation extends SimplePropertyExpression { @@ -70,7 +71,7 @@ public Quaternionf convert(Display display) { @Nullable public Class[] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET) - return CollectionUtils.array(Quaternionf.class); + return CollectionUtils.array(Quaternionf.class, AxisAngle4f.class); if (mode == ChangeMode.RESET) return CollectionUtils.array(); return null; @@ -78,11 +79,17 @@ public Class[] acceptChange(ChangeMode mode) { @Override public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + Object object = delta[0]; Quaternionf quaternion = null; if (mode == ChangeMode.RESET) quaternion = new Quaternionf(1, 0, 0, 0); - if (delta != null) - quaternion = (Quaternionf) delta[0]; + if (delta != null) { + if (object instanceof Quaternionf) { + quaternion = (Quaternionf) delta[0]; + } else if (object instanceof AxisAngle4f) { + quaternion = new Quaternionf((AxisAngle4f) delta[0]); + } + } if (quaternion == null) return; for (Display display : getExpr().getArray(event)) { diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 843c3bfce70..88c788ecf3d 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -2088,7 +2088,6 @@ types: billboard: billboard¦s @a textalignment: text alignment¦s @a itemdisplaytransform: item display transform¦s @an - quaternion: quaternion¦s @a # Skript weathertype: weather type¦s @a @@ -2112,3 +2111,7 @@ types: # Hooks money: money region: region¦s + + # Other + quaternion: quaternion¦s @a + axisangle: axisangle¦s @a From c54fc72600c6873644ef284e3f7ec19b67da64ce Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Thu, 22 Feb 2024 18:02:30 -0700 Subject: [PATCH 052/104] Add axis angle --- .../expressions/ExprDisplayTransformationRotation.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java index 52532b56893..ae613b334e1 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java @@ -85,9 +85,9 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { quaternion = new Quaternionf(1, 0, 0, 0); if (delta != null) { if (object instanceof Quaternionf) { - quaternion = (Quaternionf) delta[0]; + quaternion = (Quaternionf) object; } else if (object instanceof AxisAngle4f) { - quaternion = new Quaternionf((AxisAngle4f) delta[0]); + quaternion = new Quaternionf((AxisAngle4f) object); } } if (quaternion == null) From 138499488a1af4b07527e8c9f50db5f23655d719 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:22:32 -0700 Subject: [PATCH 053/104] Update skript-aliases --- skript-aliases | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skript-aliases b/skript-aliases index 9ea857f6b7d..16949c28e0d 160000 --- a/skript-aliases +++ b/skript-aliases @@ -1 +1 @@ -Subproject commit 9ea857f6b7dd1e4fc4a35a88149b9e463b537b06 +Subproject commit 16949c28e0d7bb25ea7c3479c3d6754ff3b5a3e6 From 7e33d726ef9848404fd2797283772c6d7df4d3d6 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:25:35 -0700 Subject: [PATCH 054/104] fix merge error --- .../skript/classes/data/BukkitClasses.java | 10 +-- .../skript/classes/data/DefaultFunctions.java | 72 +++++++++---------- 2 files changed, 40 insertions(+), 42 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index a5bce5ed54d..3e5f926900f 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -1530,21 +1530,21 @@ public String toVariableNameString(EnchantmentOffer eo) { if (Skript.classExists("org.bukkit.entity.Display")) { Classes.registerClass(new ClassInfo<>(Display.class, "display") .user("displays?") - .name("Display") - .description("A text display, block display or item display.") + .name("Display Entity") + .description("A text, block or item display entity.") .since("INSERT VERSION") .defaultExpression(new EventValueExpression<>(Display.class)) .changer(DefaultChangers.nonLivingEntityChanger)); Classes.registerClass(new EnumClassInfo<>(Billboard.class, "billboard", "billboards") .user("billboards?") - .name("Billboard") + .name("Display Billboard") .description("Represents the billboard setting of a display.") .since("INSERT VERSION")); Classes.registerClass(new EnumClassInfo<>(TextAlignment.class, "textalignment", "text alignments") .user("text ?alignments?") - .name("Text Alignment") + .name("Display Text Alignment") .description("Represents the text alignment setting of a text display.") .since("INSERT VERSION")); @@ -1553,7 +1553,7 @@ public String toVariableNameString(EnchantmentOffer eo) { .name("Item Display Transforms") .description("Represents the transform setting of an item display.") .since("INSERT VERSION")); - } + } // end displays } diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index 60af2258f58..325a82e48ed 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -619,26 +619,42 @@ public Boolean[] executeSimple(Object[][] params) { .examples("isNaN(0) # false", "isNaN(0/0) # true", "isNaN(sqrt(-1)) # true") .since("2.8.0"); -<<<<<<< HEAD + Functions.registerFunction(new SimpleJavaFunction("concat", new Parameter[] { + new Parameter<>("texts", DefaultClasses.OBJECT, false, null) + }, DefaultClasses.STRING, true) { + @Override + public String[] executeSimple(Object[][] params) { + StringBuilder builder = new StringBuilder(); + for (Object object : params[0]) { + builder.append(Classes.toString(object)); + } + return new String[] {builder.toString()}; + } + }).description("Joins the provided texts (and other things) into a single text.") + .examples( + "concat(\"hello \", \"there\") # hello there", + "concat(\"foo \", 100, \" bar\") # foo 100 bar" + ).since("2.9.0"); + if (Skript.classExists("org.joml.Quaternionf")) - Functions.registerFunction(new SimpleJavaFunction("quaternion", new Parameter[] { - new Parameter<>("w", DefaultClasses.NUMBER, true, null), - new Parameter<>("x", DefaultClasses.NUMBER, true, null), - new Parameter<>("y", DefaultClasses.NUMBER, true, null), - new Parameter<>("z", DefaultClasses.NUMBER, true, null) - }, Classes.getExactClassInfo(Quaternionf.class), true) { - @Override - public Quaternionf[] executeSimple(Object[][] params) { - double w = ((Number) params[0][0]).doubleValue(); - double x = ((Number) params[1][0]).doubleValue(); - double y = ((Number) params[2][0]).doubleValue(); - double z = ((Number) params[3][0]).doubleValue(); - return CollectionUtils.array(new Quaternionf(x, y, z, w)); - } - }) - .description("Returns a quaternion from the given w, x, y and z parameters.") - .examples("quaternion(1, 5.6, 45.21, 10)") - .since("INSERT VERSION"); + Functions.registerFunction(new SimpleJavaFunction("quaternion", new Parameter[] { + new Parameter<>("w", DefaultClasses.NUMBER, true, null), + new Parameter<>("x", DefaultClasses.NUMBER, true, null), + new Parameter<>("y", DefaultClasses.NUMBER, true, null), + new Parameter<>("z", DefaultClasses.NUMBER, true, null) + }, Classes.getExactClassInfo(Quaternionf.class), true) { + @Override + public Quaternionf[] executeSimple(Object[][] params) { + double w = ((Number) params[0][0]).doubleValue(); + double x = ((Number) params[1][0]).doubleValue(); + double y = ((Number) params[2][0]).doubleValue(); + double z = ((Number) params[3][0]).doubleValue(); + return CollectionUtils.array(new Quaternionf(x, y, z, w)); + } + }) + .description("Returns a quaternion from the given w, x, y and z parameters.") + .examples("quaternion(1, 5.6, 45.21, 10)") + .since("INSERT VERSION"); if (Skript.classExists("org.joml.AxisAngle4f")) Functions.registerFunction(new SimpleJavaFunction("axisAngle", new Parameter[] { @@ -659,24 +675,6 @@ public AxisAngle4f[] executeSimple(Object[][] params) { .description("Returns an axis angle from the given angle, x, y and z parameters.") .examples("axisangle(90, 50.6, 20.0, 10.0)") .since("INSERT VERSION"); -======= - Functions.registerFunction(new SimpleJavaFunction("concat", new Parameter[] { - new Parameter<>("texts", DefaultClasses.OBJECT, false, null) - }, DefaultClasses.STRING, true) { - @Override - public String[] executeSimple(Object[][] params) { - StringBuilder builder = new StringBuilder(); - for (Object object : params[0]) { - builder.append(Classes.toString(object)); - } - return new String[] {builder.toString()}; - } - }).description("Joins the provided texts (and other things) into a single text.") - .examples( - "concat(\"hello \", \"there\") # hello there", - "concat(\"foo \", 100, \" bar\") # foo 100 bar" - ).since("2.9.0"); ->>>>>>> upstream/dev/feature } From ad69bbe7b3290fa5a41317659f1ffc802340fb5f Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 12 Jul 2024 21:02:05 -0700 Subject: [PATCH 055/104] Remove axisangle and only present quaternion to users --- .../skript/classes/data/DefaultFunctions.java | 78 +++++++++--------- .../njol/skript/classes/data/JavaClasses.java | 67 +++------------- .../skript/expressions/ExprXYZComponent.java | 80 +++---------------- .../ExprDisplayTransformationRotation.java | 23 ++---- src/main/resources/lang/default.lang | 1 - 5 files changed, 73 insertions(+), 176 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index 325a82e48ed..1df2d3422a4 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -45,6 +45,7 @@ import org.jetbrains.annotations.Nullable; import org.joml.AxisAngle4f; import org.joml.Quaternionf; +import org.joml.Vector3f; import java.math.BigDecimal; import java.math.RoundingMode; @@ -636,45 +637,46 @@ public String[] executeSimple(Object[][] params) { "concat(\"foo \", 100, \" bar\") # foo 100 bar" ).since("2.9.0"); - if (Skript.classExists("org.joml.Quaternionf")) - Functions.registerFunction(new SimpleJavaFunction("quaternion", new Parameter[] { - new Parameter<>("w", DefaultClasses.NUMBER, true, null), - new Parameter<>("x", DefaultClasses.NUMBER, true, null), - new Parameter<>("y", DefaultClasses.NUMBER, true, null), - new Parameter<>("z", DefaultClasses.NUMBER, true, null) - }, Classes.getExactClassInfo(Quaternionf.class), true) { - @Override - public Quaternionf[] executeSimple(Object[][] params) { - double w = ((Number) params[0][0]).doubleValue(); - double x = ((Number) params[1][0]).doubleValue(); - double y = ((Number) params[2][0]).doubleValue(); - double z = ((Number) params[3][0]).doubleValue(); - return CollectionUtils.array(new Quaternionf(x, y, z, w)); - } - }) - .description("Returns a quaternion from the given w, x, y and z parameters.") - .examples("quaternion(1, 5.6, 45.21, 10)") - .since("INSERT VERSION"); + // display entities + { + if (Skript.classExists("org.joml.Quaternionf")) { + Functions.registerFunction(new SimpleJavaFunction<>("quaternion", new Parameter[]{ + new Parameter<>("w", DefaultClasses.NUMBER, true, null), + new Parameter<>("x", DefaultClasses.NUMBER, true, null), + new Parameter<>("y", DefaultClasses.NUMBER, true, null), + new Parameter<>("z", DefaultClasses.NUMBER, true, null) + }, Classes.getExactClassInfo(Quaternionf.class), true) { + @Override + public Quaternionf[] executeSimple(Object[][] params) { + double w = ((Number) params[0][0]).doubleValue(); + double x = ((Number) params[1][0]).doubleValue(); + double y = ((Number) params[2][0]).doubleValue(); + double z = ((Number) params[3][0]).doubleValue(); + return CollectionUtils.array(new Quaternionf(x, y, z, w)); + } + }) + .description("Returns a quaternion from the given w, x, y and z parameters. ") + .examples("quaternion(1, 5.6, 45.21, 10)") + .since("INSERT VERSION"); + } - if (Skript.classExists("org.joml.AxisAngle4f")) - Functions.registerFunction(new SimpleJavaFunction("axisAngle", new Parameter[] { - new Parameter<>("angle", DefaultClasses.NUMBER, true, null), - new Parameter<>("x", DefaultClasses.NUMBER, true, null), - new Parameter<>("y", DefaultClasses.NUMBER, true, null), - new Parameter<>("z", DefaultClasses.NUMBER, true, null) - }, Classes.getExactClassInfo(AxisAngle4f.class), true) { - @Override - public AxisAngle4f[] executeSimple(Object[][] params) { - float angle = ((Number) params[0][0]).floatValue(); - float x = ((Number) params[1][0]).floatValue(); - float y = ((Number) params[2][0]).floatValue(); - float z = ((Number) params[3][0]).floatValue(); - return CollectionUtils.array(new AxisAngle4f(angle, x, y, z)); - } - }) - .description("Returns an axis angle from the given angle, x, y and z parameters.") - .examples("axisangle(90, 50.6, 20.0, 10.0)") - .since("INSERT VERSION"); + if (Skript.classExists("org.joml.AxisAngle4f")) { + Functions.registerFunction(new SimpleJavaFunction<>("axisAngle", new Parameter[]{ + new Parameter<>("angle", DefaultClasses.NUMBER, true, null), + new Parameter<>("axis", DefaultClasses.VECTOR, true, null) + }, Classes.getExactClassInfo(Quaternionf.class), true) { + @Override + public Quaternionf[] executeSimple(Object[][] params) { + float angle = (float) (((Number) params[0][0]).floatValue() / 180 * Math.PI); + Vector3f axis = ((Vector) params[1][0]).toVector3f(); + return CollectionUtils.array(new Quaternionf(new AxisAngle4f(angle, axis))); + } + }) + .description("Returns a quaternion from the given angle (in degrees) and axis (as a vector). This represents a rotation around the given axis by the given angle.") + .examples("axisangle(90, (vector from player's facing))") + .since("INSERT VERSION"); + } + }// end display entities } diff --git a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java index 3001a58bc27..d852968c6e2 100644 --- a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java @@ -18,16 +18,9 @@ */ package ch.njol.skript.classes.data; -import java.util.regex.Pattern; - -import org.eclipse.jdt.annotation.Nullable; -import org.joml.AxisAngle4f; -import org.joml.Quaternionf; - import ch.njol.skript.Skript; import ch.njol.skript.SkriptConfig; import ch.njol.skript.classes.ClassInfo; -import ch.njol.skript.classes.Cloner; import ch.njol.skript.classes.Parser; import ch.njol.skript.classes.Serializer; import ch.njol.skript.expressions.base.EventValueExpression; @@ -40,6 +33,10 @@ import ch.njol.skript.util.Utils; import ch.njol.util.StringUtils; import ch.njol.yggdrasil.Fields; +import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; + +import java.util.regex.Pattern; public class JavaClasses { @@ -640,7 +637,7 @@ public boolean mustSyncDeserialization() { .name("Quaternion") .description("Quaternions are used for representing x y z while having w representing the scale. All four numbers are real.") .since("INSERT VERSION") - .parser(new Parser() { + .parser(new Parser<>() { public boolean canParse(ParseContext context) { return false; } @@ -652,55 +649,17 @@ public String toString(Quaternionf quaternion, int flags) { @Override public String toVariableNameString(Quaternionf quaternion) { - return quaternion.w() + "," + quaternion.x() + "," + quaternion.y() + "," + quaternion.z(); + return quaternion.w() + "," + quaternion.x() + "," + quaternion.y() + "," + quaternion.z(); } }) .defaultExpression(new EventValueExpression<>(Quaternionf.class)) - .cloner(new Cloner() { - @Override - public Quaternionf clone(Quaternionf quaternion) { - try { - // Implements cloneable, but doesn't return a Quaternionf. - // org.joml improper override. Returns Object. - return (Quaternionf) quaternion.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } - })); - - if (Skript.classExists("org.joml.AxisAngle4f")) - Classes.registerClass(new ClassInfo<>(AxisAngle4f.class, "axisangle") - .user("axis ?angle(4f)?s?") - .name("Axis Angle") - .description("Represents a 3D rotation of a given radians about an axis represented as an unit 3D vector.") - .since("INSERT VERSION") - .parser(new Parser() { - public boolean canParse(ParseContext context) { - return false; - } - - @Override - public String toString(AxisAngle4f axisangle, int flags) { - return "angle:" + Skript.toString(axisangle.angle) + ", x:" + Skript.toString(axisangle.x) + ", y:" + Skript.toString(axisangle.y) + ", z:" + Skript.toString(axisangle.z); - } - - @Override - public String toVariableNameString(AxisAngle4f axisangle) { - return axisangle.angle + "," + axisangle.x + "," + axisangle.y + "," + axisangle.z; - } - }) - .defaultExpression(new EventValueExpression<>(AxisAngle4f.class)) - .cloner(new Cloner() { - @Override - public AxisAngle4f clone(AxisAngle4f axisangle) { - try { - // Implements cloneable, but doesn't return a AxisAngle4f. - // org.joml improper override. Returns Object. - return (AxisAngle4f) axisangle.clone(); - } catch (CloneNotSupportedException e) { - return null; - } + .cloner(quaternion -> { + try { + // Implements cloneable, but doesn't return a Quaternionf. + // org.joml improper override. Returns Object. + return (Quaternionf) quaternion.clone(); + } catch (CloneNotSupportedException e) { + return null; } })); diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 5e186a29163..1b113806db0 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -18,14 +18,6 @@ */ package ch.njol.skript.expressions; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.eclipse.jdt.annotation.Nullable; -import org.joml.AxisAngle4f; -import org.joml.Quaternionf; - -import java.util.Locale; - import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer; import ch.njol.skript.classes.Changer.ChangeMode; @@ -33,22 +25,27 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.event.Event; +import org.bukkit.util.Vector; +import org.eclipse.jdt.annotation.Nullable; +import org.joml.Quaternionf; + +import java.util.Locale; /** * Ported by Sashie from skript-vectors with bi0qaw's permission. * @author bi0qaw */ -@Name("Vector/Quaternion/AxisAngle - XYZ Component") +@Name("Vector/Quaternion - XYZ Component") @Description({ - "Gets or changes the x, y or z component of vectors/quaternions/axis angles.", - "You cannot use w of vector. W/ANGLE is for quaternions/axis angles only." + "Gets or changes the x, y or z component of vectors/quaternions.", + "You cannot use w of vector. W is for quaternions only." }) @Examples({ "set {_v} to vector 1, 2, 3", @@ -62,15 +59,14 @@ "set z component of {_v} to 3", "send \"%x component of {_v}%, %y component of {_v}%, %z component of {_v}%\"" }) -@RequiredPlugins("Spigot 1.19.4+ for Quaternions") @Since("2.2-dev28, INSERT VERSION (Quaternions)") public class ExprXYZComponent extends SimplePropertyExpression { static { String types = "vectors"; if (Skript.isRunningMinecraft(1, 19, 4)) - types += "/quaternions/axisangle"; - register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (w:(w|angle)|:x|:y|:z) [component[s]]", types); + types += "/quaternions"; + register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (:w|:x|:y|:z) [component[s]]", types); } private enum AXIS { @@ -109,27 +105,13 @@ public Number convert(Object object) { default: return null; } - } else if (object instanceof AxisAngle4f) { - AxisAngle4f axisAngle = (AxisAngle4f) object; - switch (axis) { - case W: - return axisAngle.angle; - case X: - return axisAngle.x; - case Y: - return axisAngle.y; - case Z: - return axisAngle.z; - default: - return null; - } } return null; } @Override public Class[] acceptChange(ChangeMode mode) { - if (getExpr().getReturnType().equals(Quaternionf.class) || getExpr().getReturnType().equals(AxisAngle4f.class)) { + if (getExpr().getReturnType().equals(Quaternionf.class)) { if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE)) return new Class[] {Number.class}; } @@ -213,44 +195,6 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { case RESET: assert false; } - } else if (object instanceof AxisAngle4f) { - float value = ((Number) delta[0]).floatValue(); - AxisAngle4f axisAngle = (AxisAngle4f) object; - switch (mode) { - case REMOVE: - value = -value; - //$FALL-THROUGH$ - case ADD: - if (axis == AXIS.W) { - axisAngle.set(axisAngle.angle + value, axisAngle.x, axisAngle.y, axisAngle.z); - } else if (axis == AXIS.X) { - axisAngle.set(axisAngle.angle, axisAngle.x + value, axisAngle.y, axisAngle.z); - } else if (axis == AXIS.Y) { - axisAngle.set(axisAngle.angle, axisAngle.x, axisAngle.y + value, axisAngle.z); - } else if (axis == AXIS.Z) { - axisAngle.set(axisAngle.angle, axisAngle.x, axisAngle.y, axisAngle.z + value); - } - if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, AxisAngle4f.class)) - getExpr().change(event, new AxisAngle4f[] {axisAngle}, ChangeMode.SET); - break; - case SET: - if (axis == AXIS.W) { - axisAngle.set(value, axisAngle.x, axisAngle.y, axisAngle.z); - } else if (axis == AXIS.X) { - axisAngle.set(axisAngle.angle, value, axisAngle.y, axisAngle.z); - } else if (axis == AXIS.Y) { - axisAngle.set(axisAngle.angle, axisAngle.x, value, axisAngle.z); - } else if (axis == AXIS.Z) { - axisAngle.set(axisAngle.angle, axisAngle.x, axisAngle.y, value); - } - if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, AxisAngle4f.class)) - getExpr().change(event, new AxisAngle4f[] {axisAngle}, ChangeMode.SET); - break; - case DELETE: - case REMOVE_ALL: - case RESET: - assert false; - } } } } diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java index ae613b334e1..219a56638a3 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java @@ -18,13 +18,6 @@ */ package org.skriptlang.skript.elements.displays.expressions; -import org.bukkit.entity.Display; -import org.bukkit.event.Event; -import org.bukkit.util.Transformation; -import org.jetbrains.annotations.Nullable; -import org.joml.AxisAngle4f; -import org.joml.Quaternionf; - import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; @@ -37,6 +30,11 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.bukkit.util.Transformation; +import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; @Name("Display Transformation Rotation") @Description({ @@ -71,24 +69,19 @@ public Quaternionf convert(Display display) { @Nullable public Class[] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET) - return CollectionUtils.array(Quaternionf.class, AxisAngle4f.class); + return CollectionUtils.array(Quaternionf.class); if (mode == ChangeMode.RESET) return CollectionUtils.array(); return null; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - Object object = delta[0]; + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Quaternionf quaternion = null; if (mode == ChangeMode.RESET) quaternion = new Quaternionf(1, 0, 0, 0); if (delta != null) { - if (object instanceof Quaternionf) { - quaternion = (Quaternionf) object; - } else if (object instanceof AxisAngle4f) { - quaternion = new Quaternionf((AxisAngle4f) object); - } + quaternion = (Quaternionf) delta[0]; } if (quaternion == null) return; diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index da059a6c984..38d9cbebed8 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -2402,4 +2402,3 @@ types: # Other quaternion: quaternion¦s @a - axisangle: axisangle¦s @a From ee3d8a55d8654095dfa1c85ff36e76c6ebf216af Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 13 Jul 2024 09:38:41 -0700 Subject: [PATCH 056/104] Add tests for basic quaternion features, cleanup and fix bugs with ExprXYZComponent, add tests Notable changes include changing float comparison behavior (needs discussion) and allowing multiple vectors/quaternions to be changed at once (will overwrite list indices, needs discussion) --- .../classes/data/DefaultComparators.java | 13 +- .../skript/classes/data/DefaultFunctions.java | 3 + .../skript/expressions/ExprXYZComponent.java | 200 ++++++++---------- .../syntaxes/expressions/ExprVectorXYZ.sk | 16 -- .../syntaxes/expressions/ExprXYZComponent.sk | 62 ++++++ .../tests/syntaxes/functions/quaternions.sk | 23 ++ 6 files changed, 192 insertions(+), 125 deletions(-) delete mode 100644 src/test/skript/tests/syntaxes/expressions/ExprVectorXYZ.sk create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk create mode 100644 src/test/skript/tests/syntaxes/functions/quaternions.sk diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java index e5e42bf1423..3db554268d7 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java @@ -75,13 +75,20 @@ public DefaultComparators() {} static { // Number - Number - Comparators.registerComparator(Number.class, Number.class, new Comparator() { + Comparators.registerComparator(Number.class, Number.class, new Comparator<>() { @Override public Relation compare(Number n1, Number n2) { if (n1 instanceof Long && n2 instanceof Long) return Relation.get(n1.longValue() - n2.longValue()); - Double d1 = n1.doubleValue(), - d2 = n2.doubleValue(); + @SuppressWarnings("WrapperTypeMayBePrimitive") + Double d1, d2; + if (n1 instanceof Float || n2 instanceof Float) { + d1 = (double) n1.floatValue(); + d2 = (double) n2.floatValue(); + } else { + d1 = n1.doubleValue(); + d2 = n2.doubleValue(); + } if (d1.isNaN() || d2.isNaN()) { return Relation.SMALLER; } else if (d1.isInfinite() || d2.isInfinite()) { diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index 1df2d3422a4..c3638c5de30 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -668,6 +668,9 @@ public Quaternionf[] executeSimple(Object[][] params) { @Override public Quaternionf[] executeSimple(Object[][] params) { float angle = (float) (((Number) params[0][0]).floatValue() / 180 * Math.PI); + Vector v = ((Vector) params[1][0]); + if (v.isZero() || !Double.isFinite(v.getX()) || !Double.isFinite(v.getY()) || !Double.isFinite(v.getZ())) + return new Quaternionf[0]; Vector3f axis = ((Vector) params[1][0]).toVector3f(); return CollectionUtils.array(new Quaternionf(new AxisAngle4f(angle, axis))); } diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 1b113806db0..2d3a2e788b6 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -21,7 +21,6 @@ import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer; import ch.njol.skript.classes.Changer.ChangeMode; -import ch.njol.skript.classes.Changer.ChangerUtils; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; @@ -33,15 +32,12 @@ import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; import org.bukkit.util.Vector; -import org.eclipse.jdt.annotation.Nullable; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; import org.joml.Quaternionf; import java.util.Locale; -/** - * Ported by Sashie from skript-vectors with bi0qaw's permission. - * @author bi0qaw - */ @Name("Vector/Quaternion - XYZ Component") @Description({ "Gets or changes the x, y or z component of vectors/quaternions.", @@ -59,7 +55,7 @@ "set z component of {_v} to 3", "send \"%x component of {_v}%, %y component of {_v}%, %z component of {_v}%\"" }) -@Since("2.2-dev28, INSERT VERSION (Quaternions)") +@Since("2.2-dev28, INSERT VERSION (quaternions)") public class ExprXYZComponent extends SimplePropertyExpression { static { @@ -76,7 +72,7 @@ private enum AXIS { Z; } - private AXIS axis; + private @UnknownNullability AXIS axis; @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { @@ -85,117 +81,109 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } @Override - public Number convert(Object object) { - if (object instanceof Vector) { - if (axis == AXIS.W) - return null; - Vector vector = (Vector) object; - return axis == AXIS.X ? vector.getX() : (axis == AXIS.Y ? vector.getY() : vector.getZ()); - } else if (object instanceof Quaternionf) { - Quaternionf quaternion = (Quaternionf) object; - switch (axis) { - case W: - return quaternion.w(); - case X: - return quaternion.x(); - case Y: - return quaternion.y(); - case Z: - return quaternion.z(); - default: - return null; - } + public @Nullable Number convert(Object object) { + if (object instanceof Vector vector) { + return switch (axis) { + case W -> null; + case X -> vector.getX(); + case Y -> vector.getY(); + case Z -> vector.getZ(); + }; + } else if (object instanceof Quaternionf quaternion) { + return switch (axis) { + case W -> quaternion.w(); + case X -> quaternion.x(); + case Y -> quaternion.y(); + case Z -> quaternion.z(); + }; } return null; } @Override - public Class[] acceptChange(ChangeMode mode) { - if (getExpr().getReturnType().equals(Quaternionf.class)) { - if ((mode == ChangeMode.SET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE)) - return new Class[] {Number.class}; - } + public Class @Nullable [] acceptChange(ChangeMode mode) { if ((mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET) - && getExpr().isSingle() && Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class)) + && Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class, Quaternionf.class)) return CollectionUtils.array(Number.class); return null; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - assert delta != null; - for (Object object : getExpr().getArray(event)) { - if (object instanceof Vector) { - if (axis == AXIS.W) - continue; - Vector vector = (Vector) object; - double value = ((Number) delta[0]).doubleValue(); - switch (mode) { - case REMOVE: - value = -value; - //$FALL-THROUGH$ - case ADD: - if (axis == AXIS.X) { - vector.setX(vector.getX() + value); - } else if (axis == AXIS.Y) { - vector.setY(vector.getY() + value); - } else { - vector.setZ(vector.getZ() + value); - } - getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); - break; - case SET: - if (axis == AXIS.X) { - vector.setX(value); - } else if (axis == AXIS.Y) { - vector.setY(value); - } else { - vector.setZ(value); - } - getExpr().change(event, new Vector[] {vector}, ChangeMode.SET); - break; - default: - assert false; + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + assert delta != null; // reset/delete not supported + Object[] objects = getExpr().getArray(event); + double value = ((Number) delta[0]).doubleValue(); + for (Object object : objects) { + if (object instanceof Vector vector) { + changeVector(vector, value, mode); + } else if (object instanceof Quaternionf quaternion) { + changeQuaternion(quaternion, (float) value, mode); + } + } + getExpr().change(event, objects, ChangeMode.SET); + } + + /** + * Helper method to modify a single vector's component. Does not call .change(). + * + * @param vector the vector to modify + * @param value the value to modify by + * @param mode the change mode to determine the modification type + */ + private void changeVector(Vector vector, double value, ChangeMode mode) { + if (axis == AXIS.W) + return; + switch (mode) { + case REMOVE: + value = -value; + //$FALL-THROUGH$ + case ADD: + switch (axis) { + case X -> vector.setX(vector.getX() + value); + case Y -> vector.setY(vector.getY() + value); + case Z -> vector.setZ(vector.getZ() + value); } - } else if (object instanceof Quaternionf) { - float value = ((Number) delta[0]).floatValue(); - Quaternionf quaternion = (Quaternionf) object; - switch (mode) { - case REMOVE: - value = -value; - //$FALL-THROUGH$ - case ADD: - if (axis == AXIS.W) { - quaternion.set(quaternion.w() + value, quaternion.x(), quaternion.y(), quaternion.z()); - } else if (axis == AXIS.X) { - quaternion.set(quaternion.w(), quaternion.x() + value, quaternion.y(), quaternion.z()); - } else if (axis == AXIS.Y) { - quaternion.set(quaternion.w(), quaternion.x(), quaternion.y() + value, quaternion.z()); - } else if (axis == AXIS.Z) { - quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), quaternion.z() + value); - } - if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) - getExpr().change(event, new Quaternionf[] {quaternion}, ChangeMode.SET); - break; - case SET: - if (axis == AXIS.W) { - quaternion.set(value, quaternion.x(), quaternion.y(), quaternion.z()); - } else if (axis == AXIS.X) { - quaternion.set(quaternion.w(), value, quaternion.y(), quaternion.z()); - } else if (axis == AXIS.Y) { - quaternion.set(quaternion.w(), quaternion.x(), value, quaternion.z()); - } else if (axis == AXIS.Z) { - quaternion.set(quaternion.w(), quaternion.x(), quaternion.y(), value); - } - if (ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) - getExpr().change(event, new Quaternionf[] {quaternion}, ChangeMode.SET); - break; - case DELETE: - case REMOVE_ALL: - case RESET: - assert false; + break; + case SET: + switch (axis) { + case X -> vector.setX(value); + case Y -> vector.setY(value); + case Z -> vector.setZ(value); } - } + break; + default: + assert false; + } + } + + /** + * Helper method to modify a single quaternion's component. Does not call .change(). + * + * @param quaternion the vector to modify + * @param value the value to modify by + * @param mode the change mode to determine the modification type + */ + private void changeQuaternion(Quaternionf quaternion, float value, ChangeMode mode) { + switch (mode) { + case REMOVE: + value = -value; + //$FALL-THROUGH$ + case ADD: + switch (axis) { + case W -> quaternion.set(quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w() + value); + case X -> quaternion.set(quaternion.x() + value, quaternion.y(), quaternion.z(), quaternion.w()); + case Y -> quaternion.set(quaternion.x(), quaternion.y() + value, quaternion.z(), quaternion.w()); + case Z -> quaternion.set(quaternion.x(), quaternion.y(), quaternion.z() + value, quaternion.w()); + } + break; + case SET: + switch (axis) { + case W -> quaternion.set(quaternion.x(), quaternion.y(), quaternion.z(), value); + case X -> quaternion.set(value, quaternion.y(), quaternion.z(), quaternion.w()); + case Y -> quaternion.set(quaternion.x(), value, quaternion.z(), quaternion.w()); + case Z -> quaternion.set(quaternion.x(), quaternion.y(), value, quaternion.w()); + } + break; } } diff --git a/src/test/skript/tests/syntaxes/expressions/ExprVectorXYZ.sk b/src/test/skript/tests/syntaxes/expressions/ExprVectorXYZ.sk deleted file mode 100644 index 2691fa58975..00000000000 --- a/src/test/skript/tests/syntaxes/expressions/ExprVectorXYZ.sk +++ /dev/null @@ -1,16 +0,0 @@ -test "vector xyz": - assert the x component of vector(0, 0, 0) is 0 with "x = 0 vector component failed" - assert the x component of vector(1, 0, 0) is 1 with "x = 1 vector component failed" - assert the y component of vector(1, 1, 0) is 1 with "y = 1 vector component failed" - assert the z component of vector(1, 1, 1) is 1 with "z = 1 vector component failed" - loop 60 times: - set {_x} to a random number between -100 and 100 - set {_y} to a random number between -100 and 100 - set {_z} to a random number between -100 and 100 - set {_vector} to vector({_x}, {_y}, {_z}) - assert the x component of {_vector} is {_x} with "randomly-created vector x equality failed (expected %{_x}%, got %x component of {_vector}%)" - assert the y component of {_vector} is {_y} with "randomly-created vector y equality failed (expected %{_y}%, got %y component of {_vector}%)" - assert the z component of {_vector} is {_z} with "randomly-created vector z equality failed (expected %{_z}%, got %z component of {_vector}%)" - set {_random} to a random vector - set {_vector} to a new vector from x component of {_random}, y component of {_random}, z component of {_random} - assert {_vector} is {_random} with "random vector to created component equality failed (expected %{_random}%, got %{_vector}%)" diff --git a/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk b/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk new file mode 100644 index 00000000000..ee34a8b53d6 --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk @@ -0,0 +1,62 @@ +test "vector xyz": + assert the w component of vector(0, 0, 0) is not set with "w vector component return value for vector unexpectedly" + assert the x component of vector(1, 0, 0) is 1 with "x vector component failed" + assert the y component of vector(0, 1, 0) is 1 with "y vector component failed" + assert the z component of vector(0, 0, 1) is 1 with "z vector component failed" + + set {_v} to vector(0,0,0) + set x of {_v} to infinity value + assert the w component of {_v} is not set with "set x of vector created w component somehow" + assert the x component of {_v} is infinity value with "set x of vector failed" + assert the y component of {_v} is 0 with "set x of vector modified other components" + assert the z component of {_v} is 0 with "set x of vector modified other components" + + loop 60 times: + set {_x} to a random number between -100 and 100 + set {_y} to a random number between -100 and 100 + set {_z} to a random number between -100 and 100 + set {_vector} to vector({_x}, {_y}, {_z}) + assert the x component of {_vector} is {_x} with "randomly-created vector x equality failed" + assert the y component of {_vector} is {_y} with "randomly-created vector y equality failed" + assert the z component of {_vector} is {_z} with "randomly-created vector z equality failed" + set {_random} to a random vector + set {_vector} to a new vector from x component of {_random}, y component of {_random}, z component of {_random} + assert {_vector} is {_random} with "random vector to created component equality failed (expected %{_random}%, got %{_vector}%)" + + set {_v::*} to vector(1,2,3), vector(2,3,4), and vector(3,4,5) + set x component of {_v::*} to -1.5 + assert the x component of {_v::*} is (-1.5, -1.5, and -1.5) with "x component of multiple vectors failed" + assert the y component of {_v::*} is (2, 3, and 4) with "changing x component of multiple vectors changed y components too" + +test "quaternion xyz": + assert the w component of quaternion(1, 0, 0, 0) is 1 with "w vector component failed" + assert the x component of quaternion(1, 0, 0, 0) is 0 with "x vector component failed" + assert the y component of quaternion(1, 0, 0, 0) is 0 with "y vector component failed" + assert the z component of quaternion(1, 0, 0, 0) is 0 with "z vector component failed" + + assert the x component of quaternion(0, 1, 0, 0) is 1 with "x vector component failed" + assert the y component of quaternion(0, 0, 1, 0) is 1 with "y vector component failed" + assert the z component of quaternion(0, 0, 0, 1) is 1 with "z vector component failed" + + set {_q} to quaternion(0,0,0,0) + set x of {_q} to infinity value + assert the w component of {_q} is 0 with "set x of quaternion modified other components" + assert the x component of {_q} is infinity value with "set x of quaternion failed" + assert the y component of {_q} is 0 with "set x of quaternion modified other components" + assert the z component of {_q} is 0 with "set x of quaternion modified other components" + + loop 60 times: + set {_w} to a random number between -100 and 100 + set {_x} to a random number between -100 and 100 + set {_y} to a random number between -100 and 100 + set {_z} to a random number between -100 and 100 + set {_quaternion} to quaternion({_w}, {_x}, {_y}, {_z}) + assert the w component of {_quaternion} is {_w} with "randomly-created quaternion w equality failed" + assert the x component of {_quaternion} is {_x} with "randomly-created quaternion x equality failed" + assert the y component of {_quaternion} is {_y} with "randomly-created quaternion y equality failed" + assert the z component of {_quaternion} is {_z} with "randomly-created quaternion z equality failed" + + set {_v::*} to quaternion(0,1,2,3), quaternion(1,2,3,4), and quaternion(2,3,4,5) + set x component of {_v::*} to -1.5 + assert the x component of {_v::*} is (-1.5, -1.5, and -1.5) with "x component of multiple quaternions failed" + assert the y component of {_v::*} is (2, 3, and 4) with "changing x component of multiple quaternions changed y components too" diff --git a/src/test/skript/tests/syntaxes/functions/quaternions.sk b/src/test/skript/tests/syntaxes/functions/quaternions.sk new file mode 100644 index 00000000000..892d24006aa --- /dev/null +++ b/src/test/skript/tests/syntaxes/functions/quaternions.sk @@ -0,0 +1,23 @@ +test "quaternions" when running minecraft "1.19": + set {_a} to quaternion(1, 2, 3, 4) + assert w of {_a} is 1 with error "failed to get w component of quaternion" + assert x of {_a} is 2 with error "failed to get x component of quaternion" + assert y of {_a} is 3 with error "failed to get y component of quaternion" + assert z of {_a} is 4 with error "failed to get z component of quaternion" + + + set {_a} to quaternion(-1.2, 0.0, -infinity value, NaN value) + assert w of {_a} is -1.2 with error "failed to get w component of quaternion" + assert x of {_a} is 0 with error "failed to get x component of quaternion" + assert y of {_a} is -infinity value with error "failed to get y component of quaternion" + assert isNaN(z of {_a}) is true with error "failed to get z component of quaternion" + +test "axis angle" when running minecraft "1.19": + set {_a} to axisAngle(100, vector(2, 3, 4)) + assert w of {_a} is 0.642787516117096 with error "failed to get w component of axis angle" + assert x of {_a} is 1.5320889949798584 with error "failed to get x component of axis angle" + assert y of {_a} is 2.298133373260498 with error "failed to get y component of axis angle" + assert z of {_a} is 3.064177989959717 with error "failed to get z component of axis angle" + + set {_a} to axisAngle(-1.2, vector(0.0, -infinity value, NaN value)) + assert {_a} is not set with error "invalid axis angle was set" From d1f09caa805b27e3d8d122b56f9ec4606920e1e3 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 13 Jul 2024 10:40:02 -0700 Subject: [PATCH 057/104] Add ExprQuaternionAxisAngle and tests. Change float comparison to use dynamic epsilon value. --- .../classes/data/DefaultComparators.java | 7 +- .../expressions/ExprQuaternionAxisAngle.java | 98 +++++++++++++++++++ .../expressions/ExprQuaternionAxisAngle.sk | 20 ++++ 3 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprQuaternionAxisAngle.sk diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java index 3db554268d7..844671f21ae 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java @@ -80,11 +80,12 @@ public DefaultComparators() {} public Relation compare(Number n1, Number n2) { if (n1 instanceof Long && n2 instanceof Long) return Relation.get(n1.longValue() - n2.longValue()); - @SuppressWarnings("WrapperTypeMayBePrimitive") - Double d1, d2; + double epsilon = Skript.EPSILON; + @SuppressWarnings("WrapperTypeMayBePrimitive") Double d1, d2; if (n1 instanceof Float || n2 instanceof Float) { d1 = (double) n1.floatValue(); d2 = (double) n2.floatValue(); + epsilon = Math.min(d1, d2) * 1e-6; // dynamic epsilon } else { d1 = n1.doubleValue(); d2 = n2.doubleValue(); @@ -95,7 +96,7 @@ public Relation compare(Number n1, Number n2) { return d1 > d2 ? Relation.GREATER : d1 < d2 ? Relation.SMALLER : Relation.EQUAL; } else { double diff = d1 - d2; - if (Math.abs(diff) < Skript.EPSILON) + if (Math.abs(diff) < epsilon) return Relation.EQUAL; return Relation.get(diff); } diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java new file mode 100644 index 00000000000..26f52e3b1e6 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java @@ -0,0 +1,98 @@ +package org.skriptlang.skript.elements.expressions; + +import ch.njol.skript.classes.Changer; +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import ch.njol.util.coll.CollectionUtils; +import org.bukkit.event.Event; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; +import org.joml.AxisAngle4f; +import org.joml.Quaternionf; + +@Name("Quaternion Axis/Angle of Rotation") +@Description({ + "Returns the axis or angle that a quaternion will rotate with.", + "All quaternions can be represented by a rotation of some amount around some axis, so this expression provides " + + "the ability to get that angle/axis." +}) +@Examples({ + "set {_quaternion} to axisAngle(45, vector(1, 2, 3))", + "send axis of {_quaternion} # 1, 2, 3", + "send angle of {_quaternion} # 45" +}) +@Since("INSERT VERSION") +public class ExprQuaternionAxisAngle extends SimplePropertyExpression { + + static { + register(ExprQuaternionAxisAngle.class, Object.class, "[rotation] (angle|:axis)", "quaternions"); + } + + boolean isAxis; + + @Override + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + isAxis = parseResult.hasTag("axis"); + return super.init(expressions, matchedPattern, isDelayed, parseResult); + } + + @Override + public @Nullable Object convert(Quaternionf from) { + AxisAngle4f axisAngle = new AxisAngle4f(from); + if (isAxis) + return new Vector(axisAngle.x, axisAngle.y, axisAngle.z); + return (float) (axisAngle.angle * 180 / Math.PI); + } + + @Override + public Class @Nullable [] acceptChange(ChangeMode mode) { + switch (mode) { + case ADD, SET, REMOVE -> { + if (Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) + return CollectionUtils.array(isAxis ? Vector.class : Number.class); + return null; + } + } + return null; + } + + @Override + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + assert delta != null; // reset/delete not supported + Quaternionf[] quaternions = getExpr().getArray(event); + AxisAngle4f axisAngle = new AxisAngle4f(); + if (isAxis && delta[0] instanceof Vector vector) { + for (Quaternionf quaternion : quaternions) { + axisAngle.set(quaternion); + axisAngle.set(axisAngle.angle, (float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); + quaternion.set(axisAngle); + } + } else if (delta[0] instanceof Number number) { + float angle = (float) (number.floatValue() / 180 * Math.PI); + for (Quaternionf quaternion : quaternions) { + axisAngle.set(quaternion); + axisAngle.set(angle, axisAngle.x, axisAngle.y, axisAngle.z); + quaternion.set(axisAngle); + } + } + getExpr().change(event, quaternions, ChangeMode.SET); + } + + @Override + protected String getPropertyName() { + return isAxis ? "axis" : "angle"; + } + + @Override + public Class getReturnType() { + return isAxis ? Vector.class : Float.class; + } + +} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprQuaternionAxisAngle.sk b/src/test/skript/tests/syntaxes/expressions/ExprQuaternionAxisAngle.sk new file mode 100644 index 00000000000..2efac9b3746 --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprQuaternionAxisAngle.sk @@ -0,0 +1,20 @@ +test "quaternion axis angle" when running minecraft "1.19": + set {_v} to vector(1, 2, 3) + set {_q} to axisAngle(45, {_v}) + assert angle of {_q} is 45 with "angle of quaternion failed" + assert axis of {_q} is {_v} with "axis of quaternion failed" + + set angle of {_q} to 135 + assert angle of {_q} is 135 with "changing angle of quaternion failed" + assert axis of {_q} is {_v} with "changing angle of quaternion modified axis" + + set axis of {_q} to vector(0, 10, 0) + assert angle of {_q} is 135 with "changing axis of quaternion failed modified angle" + assert axis of {_q} is vector(0, 10, 0) with "changing axis of quaternion failed" + + + set {_q} to quaternion(1, 0, 0, 0) + + assert angle of {_q} is 0 with "angle of identity quaternion failed" + assert axis of {_q} is vector(0,0,1) with "axis of identity quaternion failed" + From 07e6f23230d7e71c6fb69ba981fe82c4dc353615 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 13 Jul 2024 10:40:23 -0700 Subject: [PATCH 058/104] Temporary change to build.gradle for java 17 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e15516d3421..c6f90b48026 100644 --- a/build.gradle +++ b/build.gradle @@ -244,7 +244,7 @@ def java11 = 11 def latestEnv = 'java21/paper-1.21.0.json' def latestJava = java21 -def oldestJava = java11 +def oldestJava = java17 def latestJUnitEnv = 'java17/paper-1.20.4.json' def latestJUnitJava = java17 From 2fb8fc238cc5c2e6f4ba8243f77680320167d0c8 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 13 Jul 2024 10:49:20 -0700 Subject: [PATCH 059/104] Revert "Update src/main/java/ch/njol/skript/conditions/CondCanSee.java" This reverts commit 3da7b372eab0db6e2a08f38b9e66279bb0ef83c3. --- src/main/java/ch/njol/skript/conditions/CondCanSee.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ch/njol/skript/conditions/CondCanSee.java b/src/main/java/ch/njol/skript/conditions/CondCanSee.java index 5557b0a4329..aca6494d409 100644 --- a/src/main/java/ch/njol/skript/conditions/CondCanSee.java +++ b/src/main/java/ch/njol/skript/conditions/CondCanSee.java @@ -86,7 +86,7 @@ public boolean check(Event event) { @Override public String toString(@Nullable Event event, boolean debug) { return PropertyCondition.toString(this, PropertyType.CAN, event, debug, players, - "see " + entities.toString(event, debug)); + "see" + entities.toString(event, debug)); } } From a02074f8a879b3074739ab3d340a6b065f9f0977 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 13 Jul 2024 10:54:59 -0700 Subject: [PATCH 060/104] Reverts entity hiding commits in favor of #6867 Shouldn't be in the scope of this PR. --- .../ch/njol/skript/conditions/CondCanSee.java | 55 +++++------ .../ch/njol/skript/effects/EffHideEntity.java | 92 ------------------- 2 files changed, 24 insertions(+), 123 deletions(-) delete mode 100644 src/main/java/ch/njol/skript/effects/EffHideEntity.java diff --git a/src/main/java/ch/njol/skript/conditions/CondCanSee.java b/src/main/java/ch/njol/skript/conditions/CondCanSee.java index aca6494d409..3e5d66d1bb3 100644 --- a/src/main/java/ch/njol/skript/conditions/CondCanSee.java +++ b/src/main/java/ch/njol/skript/conditions/CondCanSee.java @@ -18,7 +18,6 @@ */ package ch.njol.skript.conditions; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.eclipse.jdt.annotation.Nullable; @@ -36,57 +35,51 @@ import ch.njol.util.Kleenean; @Name("Can See") -@Description({ - "Checks whether the given players can see other entities.", - "Note this means if the entities have been manually hidden from the player, " + - "and not if they have line of sight to eachother." -}) -@Examples({ - "if the player can't see the player-argument:", - "\tmessage \"&cThe player %player-argument% is not online!\"" -}) -@Since("2.3, INSERT VERSION (entities)") +@Description("Checks whether the given players can see another players.") +@Examples({"if the player can't see the player-argument:", + "\tmessage \"<light red>The player %player-argument% is not online!\""}) +@Since("2.3") public class CondCanSee extends Condition { static { Skript.registerCondition(CondCanSee.class, - "%entities% (is|are) [:in]visible for %players%", - "%players% can see %entities%", - "%entities% (is|are)(n't| not) [:in]visible for %players%", - "%players% can('t| not) see %entities%"); + "%players% (is|are) [(1¦in)]visible for %players%", + "%players% can see %players%", + "%players% (is|are)(n't| not) [(1¦in)]visible for %players%", + "%players% can('t| not) see %players%"); } - - private Expression entities; + + @SuppressWarnings("null") private Expression players; + @SuppressWarnings("null") + private Expression targetPlayers; + @SuppressWarnings({"unchecked", "null"}) @Override - @SuppressWarnings("unchecked") public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { if (matchedPattern == 1 || matchedPattern == 3) { players = (Expression) exprs[0]; - entities = (Expression) exprs[1]; + targetPlayers = (Expression) exprs[1]; } else { players = (Expression) exprs[1]; - entities = (Expression) exprs[0]; + targetPlayers = (Expression) exprs[0]; } - setNegated(matchedPattern > 1 ^ parseResult.hasTag("in")); + setNegated(matchedPattern > 1 ^ parseResult.mark == 1); return true; } @Override - public boolean check(Event event) { - return entities.check(event, entity -> { - // Old Spigot API (< 1.19) has Player#canSee(Player) and still exists. So lets directly use it. - if (entity instanceof Player) - return players.check(event, player -> player.canSee((Player) entity)); - return players.check(event, player -> player.canSee(entity)); - }, isNegated()); + public boolean check(Event e) { + return players.check(e, + player -> targetPlayers.check(e, + player::canSee + ), isNegated()); } @Override - public String toString(@Nullable Event event, boolean debug) { - return PropertyCondition.toString(this, PropertyType.CAN, event, debug, players, - "see" + entities.toString(event, debug)); + public String toString(@Nullable Event e, boolean debug) { + return PropertyCondition.toString(this, PropertyType.CAN, e, debug, players, + "see" + targetPlayers.toString(e, debug)); } } diff --git a/src/main/java/ch/njol/skript/effects/EffHideEntity.java b/src/main/java/ch/njol/skript/effects/EffHideEntity.java deleted file mode 100644 index 42d0868a161..00000000000 --- a/src/main/java/ch/njol/skript/effects/EffHideEntity.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ -package ch.njol.skript.effects; - -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.eclipse.jdt.annotation.Nullable; - -import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Examples; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; -import ch.njol.skript.doc.Since; -import ch.njol.skript.lang.Effect; -import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.util.Kleenean; - -@Name("Hide Entities From Players") -@Description({ - "Hide entities from players", - "Do note that hidden entities still exist in the server space and can interact with the world." -}) -@Examples({ - "set {_player} to player", - "spawn a block display at location infront of player:", - "\thide event-entity from all players where [player input is not {_player}]" -}) -@RequiredPlugins("Spigot 1.19.4+") -@Since("INSERT VERSION") -public class EffHideEntity extends Effect { - - static { - if (Skript.isRunningMinecraft(1, 19, 4)) - Skript.registerEffect(EffHideEntity.class, - "hide %entities% from %players%", - "show %entities% to %players%"); - } - - private Expression entities; - private Expression players; - boolean hide; - - @Override - @SuppressWarnings("unchecked") - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - entities = (Expression) exprs[0]; - players = (Expression) exprs[1]; - hide = matchedPattern == 0; - return true; - } - - @Override - protected void execute(Event event) { - Skript skript = Skript.getInstance(); - if (hide) { - for (Player player : players.getArray(event)) { - for (Entity entity : entities.getArray(event)) - player.hideEntity(skript, entity); - } - } else { - for (Player player : players.getArray(event)) { - for (Entity entity : entities.getArray(event)) - player.showEntity(skript, entity); - } - } - } - - @Override - public String toString(@Nullable Event event, boolean debug) { - return (hide ? "hide " : "show ") + entities.toString(event, debug) + (hide ? " from " : " to " + players.toString(event, debug)); - } - -} From bf0b3abb9c5459fb602bea4806911a24a2be62cc Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 13 Jul 2024 11:18:48 -0700 Subject: [PATCH 061/104] version check for EQAA and displaydata cleanup --- .../ch/njol/skript/entity/DisplayData.java | 105 ++++++++---------- .../expressions/ExprQuaternionAxisAngle.java | 4 +- 2 files changed, 48 insertions(+), 61 deletions(-) diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index 7f8b08280d3..b06d9f60e41 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -18,9 +18,12 @@ */ package ch.njol.skript.entity; -import java.util.ArrayList; -import java.util.List; - +import ch.njol.skript.Skript; +import ch.njol.skript.aliases.ItemType; +import ch.njol.skript.lang.Literal; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.registrations.Classes; +import ch.njol.skript.variables.Variables; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.BlockData; @@ -31,12 +34,8 @@ import org.bukkit.inventory.ItemStack; import org.eclipse.jdt.annotation.Nullable; -import ch.njol.skript.Skript; -import ch.njol.skript.aliases.ItemType; -import ch.njol.skript.lang.Literal; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.skript.registrations.Classes; -import ch.njol.skript.variables.Variables; +import java.util.ArrayList; +import java.util.List; public class DisplayData extends EntityData { @@ -62,7 +61,7 @@ private enum DisplayType { DisplayType(String className, String codeName) { try { this.displaySubClass = (Class) Class.forName(className); - } catch (ClassNotFoundException e) {} + } catch (ClassNotFoundException ignored) {} this.codeName = codeName; } @@ -71,14 +70,14 @@ public String toString() { return codeName; } - public static String[] codeNames; + public static final String[] codeNames; static { - List cn = new ArrayList<>(); - for (DisplayType t : values()) { - if (t.displaySubClass != null) - cn.add(t.codeName); + List codeNamesList = new ArrayList<>(); + for (DisplayType type : values()) { + if (type.displaySubClass != null) + codeNamesList.add(type.codeName); } - codeNames = cn.toArray(new String[0]); + codeNames = codeNamesList.toArray(new String[0]); } } @@ -125,29 +124,20 @@ protected boolean init(Literal[] exprs, int matchedPattern, ParseResult parse } @Override - protected boolean init(@Nullable Class c, @Nullable Display entity) { + protected boolean init(@Nullable Class displayClass, @Nullable Display entity) { DisplayType[] types = DisplayType.values(); for (int i = types.length - 1; i >= 0; i--) { Class display = types[i].displaySubClass; if (display == null) continue; - if (entity == null ? c.isAssignableFrom(display) : display.isInstance(entity)) { + //noinspection ConstantConditions + if (entity == null ? displayClass.isAssignableFrom(display) : display.isInstance(entity)) { type = types[i]; if (entity != null) { switch (type) { - case ANY: - break; - case BLOCK: - blockData = ((BlockDisplay) entity).getBlock(); - break; - case ITEM: - item = ((ItemDisplay) entity).getItemStack(); - break; - case TEXT: - text = ((TextDisplay) entity).getText(); - break; - default: - break; + case BLOCK -> blockData = ((BlockDisplay) entity).getBlock(); + case ITEM -> item = ((ItemDisplay) entity).getItemStack(); + case TEXT -> text = ((TextDisplay) entity).getText(); } } return true; @@ -160,56 +150,52 @@ protected boolean init(@Nullable Class c, @Nullable Display e @Override public void set(Display entity) { switch (type) { - case ANY: - break; - case BLOCK: + case BLOCK -> { if (!(entity instanceof BlockDisplay)) return; if (blockData != null) ((BlockDisplay) entity).setBlock(blockData); - break; - case ITEM: + } + case ITEM -> { if (!(entity instanceof ItemDisplay)) return; if (item != null) ((ItemDisplay) entity).setItemStack(item); - break; - case TEXT: + } + case TEXT -> { if (!(entity instanceof TextDisplay)) return; if (text != null) ((TextDisplay) entity).setText(text); - break; - default: - break; + } } } @Override public boolean match(Display entity) { switch (type) { - case ANY: - break; - case BLOCK: + case BLOCK -> { if (!(entity instanceof BlockDisplay)) return false; if (blockData != null && !((BlockDisplay) entity).getBlock().equals(blockData)) return false; - break; - case ITEM: + } + case ITEM -> { if (!(entity instanceof ItemDisplay)) return false; if (item != null && !((ItemDisplay) entity).getItemStack().isSimilar(item)) return false; - break; - case TEXT: + } + case TEXT -> { if (!(entity instanceof TextDisplay)) return false; - if (item != null && !((TextDisplay) entity).getText().equals(text)) + if (text == null) // all text displays should match a blank one. + return true; + String displayText = ((TextDisplay) entity).getText(); + if (displayText == null) return false; - break; - default: - break; + return displayText.equals(text); + } } return type.displaySubClass != null && type.displaySubClass.isInstance(entity); } @@ -226,17 +212,16 @@ protected int hashCode_i() { @Override protected boolean equals_i(EntityData obj) { - if (!(obj instanceof DisplayData)) - return false; - DisplayData other = (DisplayData) obj; - return type == other.type; + if (obj instanceof DisplayData other) + return type == other.type; + return false; } @Override - public boolean isSupertypeOf(EntityData e) { - if (e instanceof DisplayData) - return type == DisplayType.ANY || ((DisplayData) e).type == type; - return Display.class.isAssignableFrom(e.getType()); + public boolean isSupertypeOf(EntityData entityData) { + if (entityData instanceof DisplayData displayData) + return type == DisplayType.ANY || displayData.type == type; + return Display.class.isAssignableFrom(entityData.getType()); } @Override diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java index 26f52e3b1e6..b02028cadb5 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java @@ -1,5 +1,6 @@ package org.skriptlang.skript.elements.expressions; +import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; @@ -32,7 +33,8 @@ public class ExprQuaternionAxisAngle extends SimplePropertyExpression { static { - register(ExprQuaternionAxisAngle.class, Object.class, "[rotation] (angle|:axis)", "quaternions"); + if (Skript.isRunningMinecraft(1, 19, 4)) + register(ExprQuaternionAxisAngle.class, Object.class, "[rotation] (angle|:axis)", "quaternions"); } boolean isAxis; From 093fa835c8247403194630eb1c1df68129655cae Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 13 Jul 2024 13:34:20 -0700 Subject: [PATCH 062/104] force 'rotation' in EQAA, fix classdef error, add itemtypes to block display entitydata pattern, add tests for display entitydata Not sure wh --- .../expressions/ExprQuaternionAxisAngle.java | 37 +++++++--- src/main/resources/lang/default.lang | 2 +- src/test/skript/tests/misc/displaydata.sk | 68 +++++++++++++++++++ .../expressions/ExprQuaternionAxisAngle.sk | 21 +++--- 4 files changed, 108 insertions(+), 20 deletions(-) create mode 100644 src/test/skript/tests/misc/displaydata.sk diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java index b02028cadb5..b382c2f56cd 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java @@ -16,25 +16,28 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import org.joml.AxisAngle4f; +import org.joml.Math; import org.joml.Quaternionf; -@Name("Quaternion Axis/Angle of Rotation") +@Name("Rotation Axis/Angle") @Description({ - "Returns the axis or angle that a quaternion will rotate with.", + "Returns the axis or angle that a quaternion will rotate by/around.", "All quaternions can be represented by a rotation of some amount around some axis, so this expression provides " + "the ability to get that angle/axis." }) @Examples({ "set {_quaternion} to axisAngle(45, vector(1, 2, 3))", - "send axis of {_quaternion} # 1, 2, 3", - "send angle of {_quaternion} # 45" + "send rotation axis of {_quaternion} # 1, 2, 3", + "send rotation angle of {_quaternion} # 45", + "set rotation angle of {_quaternion} to 135", + "set rotation axis of {_quaternion} to vector(0, 1, 0)" }) @Since("INSERT VERSION") public class ExprQuaternionAxisAngle extends SimplePropertyExpression { static { if (Skript.isRunningMinecraft(1, 19, 4)) - register(ExprQuaternionAxisAngle.class, Object.class, "[rotation] (angle|:axis)", "quaternions"); + register(ExprQuaternionAxisAngle.class, Object.class, "rotation (angle|:axis)", "quaternions"); } boolean isAxis; @@ -47,7 +50,8 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override public @Nullable Object convert(Quaternionf from) { - AxisAngle4f axisAngle = new AxisAngle4f(from); + AxisAngle4f axisAngle = new AxisAngle4f(); + setFromQuaternion(axisAngle, from); if (isAxis) return new Vector(axisAngle.x, axisAngle.y, axisAngle.z); return (float) (axisAngle.angle * 180 / Math.PI); @@ -72,14 +76,14 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { AxisAngle4f axisAngle = new AxisAngle4f(); if (isAxis && delta[0] instanceof Vector vector) { for (Quaternionf quaternion : quaternions) { - axisAngle.set(quaternion); + setFromQuaternion(axisAngle, quaternion); axisAngle.set(axisAngle.angle, (float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); quaternion.set(axisAngle); } } else if (delta[0] instanceof Number number) { float angle = (float) (number.floatValue() / 180 * Math.PI); for (Quaternionf quaternion : quaternions) { - axisAngle.set(quaternion); + setFromQuaternion(axisAngle, quaternion); axisAngle.set(angle, axisAngle.x, axisAngle.y, axisAngle.z); quaternion.set(axisAngle); } @@ -97,4 +101,21 @@ public Class getReturnType() { return isAxis ? Vector.class : Float.class; } + // avoid ClassNotFound exception on <1.19 + // TODO: remove after legacy tests removed + private static void setFromQuaternion(AxisAngle4f axisAngle4f, Quaternionf quaternionf) { + float acos = Math.safeAcos(quaternionf.w()); + float invSqrt = Math.invsqrt(1.0f - quaternionf.w() * quaternionf.w()); + if (Float.isInfinite(invSqrt)) { + axisAngle4f.x = 0.0f; + axisAngle4f.y = 0.0f; + axisAngle4f.z = 1.0f; + } else { + axisAngle4f.x = quaternionf.x() * invSqrt; + axisAngle4f.y = quaternionf.y() * invSqrt; + axisAngle4f.z = quaternionf.z() * invSqrt; + } + axisAngle4f.angle = acos + acos; + } + } diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 38d9cbebed8..a0e5ab84dea 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1246,7 +1246,7 @@ entities: pattern: [a] display(|1¦s) [entity] block display: name: block display¦s - pattern: [a] block display(|1¦s) [entity] [of %-blockdata%] + pattern: [a] block display(|1¦s) [entity] [of %-blockdata/itemtype%] item display: name: item display¦s pattern: item display(|1¦s) [entity] [of %-itemtype%] diff --git a/src/test/skript/tests/misc/displaydata.sk b/src/test/skript/tests/misc/displaydata.sk new file mode 100644 index 00000000000..e76990c99cf --- /dev/null +++ b/src/test/skript/tests/misc/displaydata.sk @@ -0,0 +1,68 @@ +test "display entity data" when running minecraft "1.19": + spawn a text display at spawn of world "world": + set {_text} to entity + + spawn a block display at spawn of world "world": + set {_block} to entity + + spawn an item display at spawn of world "world": + set {_item} to entity + + assert {_text} is a display with "text display was not a display" + assert {_text} is a text display with "text display was not a text display" + assert {_text} is not an item display with "text display was an item display" + assert {_text} is not a block display with "text display was a block display" + + assert {_block} is a display with "block display was not a display" + assert {_block} is a block display with "block display was not a block display" + assert {_block} is not an item display with "block display was an item display" + assert {_block} is not a text display with "block display was a text display" + + assert {_item} is a display with "item display was not a display" + assert {_item} is a item display with "item display was not an item display" + assert {_item} is not an text display with "item display was a text display" + assert {_item} is not a block display with "item display was a block display" + + spawn a block display of a spruce log at spawn of world "world": + set {_block1} to entity + + assert size of block displays is 2 with "did not find all block displays" + + spawn a block display of a red bed at spawn of world "world": + set {_block2} to entity + + assert size of block displays is 3 with "did not find all block displays" + assert size of block displays of a spruce log is 1 with "did not find correct amount of spruce block displays" + assert size of block displays of a red bed is 1 with "did not find correct amount of block display of a red beds" + + assert {_block2} is a display with "block display was not a display" + assert {_block2} is a block display with "block display was not a block display" + assert {_block2} is not a block display of a spruce log with "block display of a red bed was a block display of a spruce log" + assert {_block2} is a block display of a red bed with "block display of a red bed was not a block display of a red bed" + assert {_block2} is not an item display with "block display was an item display" + assert {_block2} is not a text display with "block display was a text display" + + spawn an item display of an oak log at spawn of world "world": + set {_item1} to entity + + spawn a item display of a diamond at spawn of world "world": + set {_item2} to entity + + assert size of item displays is 3 with "did not find all item displays" + assert size of item displays of oak log is 1 with "did not find correct amount of spruce item displays of oak logs" + assert size of item displays of diamond is 1 with "did not find correct amount of item displays of diamonds" + + assert {_item2} is a display with "item display was not a display" + assert {_item2} is a item display with "item display was not a block display" + assert {_item2} is not an item display of an oak log with "item display of a diamond was an oak log block display" + assert {_item2} is a item display of a diamond with "item display of a diamond was not a diamond block display" + assert {_item2} is not a block display with "item display was a block display" + assert {_item2} is not a text display with "item display was a text display" + + delete display within {_text} + delete display within {_item} + delete display within {_item1} + delete display within {_item2} + delete display within {_block} + delete display within {_block1} + delete display within {_block2} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprQuaternionAxisAngle.sk b/src/test/skript/tests/syntaxes/expressions/ExprQuaternionAxisAngle.sk index 2efac9b3746..1f4d69fe321 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprQuaternionAxisAngle.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprQuaternionAxisAngle.sk @@ -1,20 +1,19 @@ test "quaternion axis angle" when running minecraft "1.19": set {_v} to vector(1, 2, 3) set {_q} to axisAngle(45, {_v}) - assert angle of {_q} is 45 with "angle of quaternion failed" - assert axis of {_q} is {_v} with "axis of quaternion failed" + assert rotation angle of {_q} is 45 with "angle of quaternion failed" + assert rotation axis of {_q} is {_v} with "axis of quaternion failed" - set angle of {_q} to 135 - assert angle of {_q} is 135 with "changing angle of quaternion failed" - assert axis of {_q} is {_v} with "changing angle of quaternion modified axis" + set rotation angle of {_q} to 135 + assert rotation angle of {_q} is 135 with "changing angle of quaternion failed" + assert rotation axis of {_q} is {_v} with "changing angle of quaternion modified axis" - set axis of {_q} to vector(0, 10, 0) - assert angle of {_q} is 135 with "changing axis of quaternion failed modified angle" - assert axis of {_q} is vector(0, 10, 0) with "changing axis of quaternion failed" + set rotation axis of {_q} to vector(0, 10, 0) + assert rotation angle of {_q} is 135 with "changing axis of quaternion failed modified angle" + assert rotation axis of {_q} is vector(0, 10, 0) with "changing axis of quaternion failed" set {_q} to quaternion(1, 0, 0, 0) - assert angle of {_q} is 0 with "angle of identity quaternion failed" - assert axis of {_q} is vector(0,0,1) with "axis of identity quaternion failed" - + assert rotation angle of {_q} is 0 with "angle of identity quaternion failed" + assert rotation axis of {_q} is vector(0,0,1) with "axis of identity quaternion failed" From a00cf5b188c7d8af2be2f992a6e169a9c7b19917 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sun, 14 Jul 2024 00:08:14 -0700 Subject: [PATCH 063/104] Clean up colorOf, add tests, add alpha parameter to rgb function and color tostring, add rgba factory method + constructor Discussion needed surrounding type checking in colorof acceptChange --- .../classes/data/DefaultComparators.java | 6 + .../skript/classes/data/DefaultFunctions.java | 16 ++- .../ch/njol/skript/entity/DisplayData.java | 3 + .../skript/expressions/ExprBlockData.java | 24 ++-- .../njol/skript/expressions/ExprColorOf.java | 115 ++++++++++-------- .../java/ch/njol/skript/util/ColorRGB.java | 47 +++++-- .../tests/syntaxes/expressions/ExprColorOf.sk | 30 +++++ 7 files changed, 162 insertions(+), 79 deletions(-) create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprColorOf.sk diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java index 844671f21ae..c88a98bdf88 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java @@ -29,6 +29,7 @@ import ch.njol.skript.entity.EntityData; import ch.njol.skript.entity.RabbitData; import ch.njol.skript.util.BlockUtils; +import ch.njol.skript.util.Color; import ch.njol.skript.util.Date; import ch.njol.skript.util.EnchantmentType; import ch.njol.skript.util.Experience; @@ -664,6 +665,11 @@ public boolean supportsOrdering() { // Potion Effect Type Comparators.registerComparator(PotionEffectType.class, PotionEffectType.class, (one, two) -> Relation.get(one.equals(two))); + + // Color - Color + Comparators.registerComparator(Color.class, Color.class, (one, two) -> Relation.get(one.asBukkitColor().equals(two.asBukkitColor()))); + Comparators.registerComparator(Color.class, org.bukkit.Color.class, (one, two) -> Relation.get(one.asBukkitColor().equals(two))); + Comparators.registerComparator(org.bukkit.Color.class, org.bukkit.Color.class, (one, two) -> Relation.get(one.equals(two))); } } diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index c3638c5de30..610e90f1cfe 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -528,19 +528,25 @@ public Long[] executeSimple(Object[][] params) { Functions.registerFunction(new SimpleJavaFunction("rgb", new Parameter[] { new Parameter<>("red", DefaultClasses.LONG, true, null), new Parameter<>("green", DefaultClasses.LONG, true, null), - new Parameter<>("blue", DefaultClasses.LONG, true, null) + new Parameter<>("blue", DefaultClasses.LONG, true, null), + new Parameter<>("alpha", DefaultClasses.LONG, true, new SimpleLiteral<>(255L,true)) }, DefaultClasses.COLOR, true) { @Override public ColorRGB[] executeSimple(Object[][] params) { Long red = (Long) params[0][0]; Long green = (Long) params[1][0]; Long blue = (Long) params[2][0]; + Long alpha = (Long) params[3][0]; - return CollectionUtils.array(ColorRGB.fromRGB(red.intValue(), green.intValue(), blue.intValue())); + return CollectionUtils.array(ColorRGB.fromRGBA(red.intValue(), green.intValue(), blue.intValue(), alpha.intValue())); } - }).description("Returns a RGB color from the given red, green and blue parameters.") - .examples("dye player's leggings rgb(120, 30, 45)") - .since("2.5"); + }).description("Returns a RGB color from the given red, green and blue parameters. Alpha values can be added optionally, " + + "but these only take affect in certain situations, like text display backgrounds.") + .examples( + "dye player's leggings rgb(120, 30, 45)", + "set the colour of a text display to rgb(10, 50, 100, 50)" + ) + .since("2.5, INSERT VERSION (alpha)"); Functions.registerFunction(new SimpleJavaFunction("player", new Parameter[] { new Parameter<>("nameOrUUID", DefaultClasses.STRING, true, null), diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index b06d9f60e41..532eb829165 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -25,6 +25,7 @@ import ch.njol.skript.registrations.Classes; import ch.njol.skript.variables.Variables; import org.bukkit.Bukkit; +import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.entity.BlockDisplay; @@ -39,6 +40,8 @@ public class DisplayData extends EntityData { + public static final Color DEFAULT_BACKGROUND_COLOR = Color.fromARGB(64, 0, 0, 0); + static { if (Skript.isRunningMinecraft(1, 19, 4)) { EntityData.register(DisplayData.class, "display", Display.class, 0, DisplayType.codeNames); diff --git a/src/main/java/ch/njol/skript/expressions/ExprBlockData.java b/src/main/java/ch/njol/skript/expressions/ExprBlockData.java index e9bfd44f493..389a328e0a1 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprBlockData.java +++ b/src/main/java/ch/njol/skript/expressions/ExprBlockData.java @@ -18,12 +18,6 @@ */ package ch.njol.skript.expressions; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.entity.BlockDisplay; -import org.bukkit.event.Event; -import org.eclipse.jdt.annotation.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; @@ -32,6 +26,11 @@ import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.BlockDisplay; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Block Data") @Description({ @@ -52,29 +51,26 @@ public class ExprBlockData extends SimplePropertyExpression { register(ExprBlockData.class, BlockData.class, "block[ ]data", Skript.isRunningMinecraft(1, 19, 4) ? "blocks/displays" : "blocks"); } - @Nullable @Override - public BlockData convert(Object object) { + public @Nullable BlockData convert(Object object) { if (object instanceof Block) return ((Block) object).getBlockData(); if (object instanceof BlockDisplay) - return ((BlockDisplay) object).getBlock(); + return ((BlockDisplay) object).getBlock(); return null; } - @Nullable @Override - public Class[] acceptChange(ChangeMode mode) { + public Class @Nullable [] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET) return CollectionUtils.array(BlockData.class); return null; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - if (delta == null) - return; + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + assert delta != null; // reset/delete not supported BlockData blockData = ((BlockData) delta[0]); for (Object object : getExpr().getArray(event)) { if (object instanceof Block) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java index 7a9054fb725..d586f2be46e 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java +++ b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java @@ -18,31 +18,14 @@ */ package ch.njol.skript.expressions; -import java.util.ArrayList; -import java.util.List; - import ch.njol.skript.Skript; -import org.bukkit.DyeColor; -import org.bukkit.FireworkEffect; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.bukkit.entity.BlockDisplay; -import org.bukkit.entity.Display; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Item; -import org.bukkit.entity.TextDisplay; -import org.bukkit.event.Event; -import org.bukkit.inventory.ItemStack; -import org.bukkit.material.Colorable; -import org.bukkit.material.MaterialData; -import org.eclipse.jdt.annotation.Nullable; - import ch.njol.skript.aliases.ItemType; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; +import ch.njol.skript.entity.DisplayData; import ch.njol.skript.expressions.base.PropertyExpression; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -51,11 +34,29 @@ import ch.njol.skript.util.SkriptColor; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.DyeColor; +import org.bukkit.FireworkEffect; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.entity.Display; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.Event; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Colorable; +import org.bukkit.material.MaterialData; +import org.eclipse.jdt.annotation.Nullable; + +import java.util.ArrayList; +import java.util.List; @Name("Color of") @Description({ - "The color of an item", - "can also be used to color chat messages with \"<%color of ...%>this text is colored!\"." + "The color of an item, entity, block, firework effect, or text display.", + "This can also be used to color chat messages with \"<%color of ...%>this text is colored!\".", + "Do note that firework effects support setting, adding, removing, resetting, and deleting; text displays support " + + "setting and resetting; and items, entities, and blocks only support setting, and only for very few items/blocks." }) @Examples({ "on click on wool:", @@ -87,15 +88,18 @@ protected Color[] get(Event event, Object[] source) { .map(SkriptColor::fromBukkitColor) .forEach(colors::add); } - if (colors.size() == 0) - return null; return colors.toArray(new Color[0]); } return get(source, object -> { if (object instanceof Display) { - if (!(object instanceof TextDisplay)) + if (!(object instanceof TextDisplay display)) return null; - return ColorRGB.fromBukkitColor(((TextDisplay) object).getBackgroundColor()); + if (display.isDefaultBackground()) + return ColorRGB.fromBukkitColor(DisplayData.DEFAULT_BACKGROUND_COLOR); + org.bukkit.Color bukkitColor = display.getBackgroundColor(); + if (bukkitColor == null) + return null; + return ColorRGB.fromBukkitColor(bukkitColor); } Colorable colorable = getColorable(object); if (colorable == null) @@ -108,33 +112,41 @@ protected Color[] get(Event event, Object[] source) { } @Override - @Nullable - public Class[] acceptChange(ChangeMode mode) { + public Class @Nullable [] acceptChange(ChangeMode mode) { Class returnType = getExpr().getReturnType(); - if (FireworkEffect.class.isAssignableFrom(returnType)) + + if (returnType.isAssignableFrom(FireworkEffect.class)) return CollectionUtils.array(Color[].class); - if (!getExpr().isSingle()) - return null; - if (Display.class.isAssignableFrom(returnType) && (mode == ChangeMode.RESET || mode == ChangeMode.DELETE || mode == ChangeMode.SET)) + + // double assignable checks are to allow both parent and child types, since variables return Object + // This does mean we have to be more stringent in checking the validity of the change mode in change() itself. + if ((returnType.isAssignableFrom(Display.class) || Display.class.isAssignableFrom(returnType)) && (mode == ChangeMode.RESET || mode == ChangeMode.SET)) return CollectionUtils.array(Color.class); + + // the following only support SET if (mode != ChangeMode.SET) return null; - if (Entity.class.isAssignableFrom(returnType)) - return CollectionUtils.array(Color.class); - else if (Block.class.isAssignableFrom(returnType)) - return CollectionUtils.array(Color.class); - if (ItemType.class.isAssignableFrom(returnType)) + if (returnType.isAssignableFrom(Entity.class) + || Entity.class.isAssignableFrom(returnType) + || returnType.isAssignableFrom(Block.class) + || Block.class.isAssignableFrom(returnType) + || returnType.isAssignableFrom(ItemType.class) + ) { return CollectionUtils.array(Color.class); + } return null; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Color color = null; if (delta != null) color = (Color) delta[0]; for (Object object : getExpr().getArray(event)) { if (object instanceof Item || object instanceof ItemType) { + if (mode != ChangeMode.SET) + return; + assert color != null; ItemStack stack = object instanceof Item ? ((Item) object).getItemStack() : ((ItemType) object).getRandom(); if (stack == null) continue; @@ -146,10 +158,13 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { ((Colorable) data).setColor(color.asDyeColor()); stack.setData(data); - if (object instanceof Item) - ((Item) object).setItemStack(stack); + if (object instanceof Item item) + item.setItemStack(stack); } else if (object instanceof Block || object instanceof Colorable) { + if (mode != ChangeMode.SET) + return; Colorable colorable = getColorable(object); + assert color != null; if (colorable != null) { try { @@ -161,24 +176,18 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { "Instead, set the block to right material, such as a blue bed."); // Let's just assume it's a bed } } - } else if (object instanceof TextDisplay) { + } else if (object instanceof TextDisplay display) { switch (mode) { - case DELETE: - case RESET: - ((TextDisplay) object).setDefaultBackground(true); - break; - case SET: - ((TextDisplay) object).setBackgroundColor(color.asBukkitColor()); - break; - case ADD: - case REMOVE: - case REMOVE_ALL: - default: - break; + case RESET -> display.setDefaultBackground(true); + case SET -> { + assert color != null; + if (display.isDefaultBackground()) + display.setDefaultBackground(false); + display.setBackgroundColor(color.asBukkitColor()); + } } - } else if (object instanceof FireworkEffect) { + } else if (object instanceof FireworkEffect effect) { Color[] input = (Color[]) delta; - FireworkEffect effect = ((FireworkEffect) object); switch (mode) { case ADD: for (Color c : input) diff --git a/src/main/java/ch/njol/skript/util/ColorRGB.java b/src/main/java/ch/njol/skript/util/ColorRGB.java index 26872153701..2f687534ac7 100644 --- a/src/main/java/ch/njol/skript/util/ColorRGB.java +++ b/src/main/java/ch/njol/skript/util/ColorRGB.java @@ -24,6 +24,7 @@ import org.apache.commons.lang.math.NumberUtils; import org.bukkit.DyeColor; import org.eclipse.jdt.annotation.Nullable; +import org.jetbrains.annotations.Contract; import java.io.NotSerializableException; import java.io.StreamCorruptedException; @@ -51,6 +52,23 @@ public ColorRGB(int red, int green, int blue) { Math2.fit(0, blue, 255))); } + /** + * RGBA constructor. Clamps values to between 0 and 255. For internal use. Prefer {@link #fromRGBA(int, int, int, int)} + * @param red + * @param green + * @param blue + * @param alpha + * @see #fromRGBA(int, int, int, int) + * @see #fromRGB(int, int, int) + */ + private ColorRGB(int red, int green, int blue, int alpha) { + this(org.bukkit.Color.fromARGB( + Math2.fit(0, alpha, 255), + Math2.fit(0, red, 255), + Math2.fit(0, green, 255), + Math2.fit(0, blue, 255))); + } + /** * Subject to being private in the future. Use {@link #fromBukkitColor(org.bukkit.Color)} * This is to keep inline with other color classes. @@ -64,21 +82,34 @@ public ColorRGB(org.bukkit.Color bukkit) { /** * Returns a ColorRGB object from the provided arguments. * - * @param red - * @param green - * @param blue + * @param red red value (0 to 255) + * @param green green value (0 to 255) + * @param blue blue value (0 to 255) + * @param alpha alpha value (0 to 255) * @return ColorRGB */ + @Contract("_,_,_,_ -> new") + public static ColorRGB fromRGBA(int red, int green, int blue, int alpha) { + return new ColorRGB(red, green, blue, alpha); + } + + /** + * Returns a ColorRGB object from the provided arguments. + * + * @param red red value (0 to 255) + * @param green green value (0 to 255) + * @param blue blue value (0 to 255) + * @return ColorRGB + */ + @Contract("_,_,_ -> new") public static ColorRGB fromRGB(int red, int green, int blue) { return new ColorRGB(red, green, blue); } /** * Returns a ColorRGB object from a bukkit color. - * - * @param red - * @param green - * @param blue + * + * @param bukkit the bukkit color to replicate * @return ColorRGB */ public static ColorRGB fromBukkitColor(org.bukkit.Color bukkit) { @@ -98,6 +129,8 @@ public DyeColor asDyeColor() { @Override public String getName() { + if (bukkit.getAlpha() != 255) + return "argb " + bukkit.getAlpha() + ", " + bukkit.getRed() + ", " + bukkit.getGreen() + ", " + bukkit.getBlue(); return "rgb " + bukkit.getRed() + ", " + bukkit.getGreen() + ", " + bukkit.getBlue(); } diff --git a/src/test/skript/tests/syntaxes/expressions/ExprColorOf.sk b/src/test/skript/tests/syntaxes/expressions/ExprColorOf.sk new file mode 100644 index 00000000000..06e9931c958 --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprColorOf.sk @@ -0,0 +1,30 @@ +# TODO: write tests for non-display colors + +# test "color of blocks": + +# test "color of items": + +# test "color of entities": + +# test "color of fireworks": + +test "color of displays": + spawn a text display at spawn of world "world": + set {_e} to entity + + assert color of {_e} is rgb(0,0,0, 64) with "default background colour failed" + + set colour of {_e} to red + assert color of {_e} is red with "failed to set background colour" + + set colour of {_e} to rgb(1, 50, 200) + assert color of {_e} is rgb(1, 50, 200) with "failed to set background colour to rgb" + + reset colour of {_e} + assert color of {_e} is rgb(0, 0, 0, 64) with "delete background colour failed" + + set color of all text displays to rgb(0, 10, 0) + assert color of all text displays is rgb(0, 10, 0) with "set all background colour failed" + + delete entity within {_e} + From 400d9721dd0be646cb66a55252f7965aedf871f5 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sun, 14 Jul 2024 00:14:16 -0700 Subject: [PATCH 064/104] update Nullable annotations to jetbrains --- .../skript/classes/data/SkriptClasses.java | 18 ++++++++---------- .../ch/njol/skript/entity/DisplayData.java | 2 +- .../njol/skript/expressions/ExprColorOf.java | 2 +- .../java/ch/njol/skript/util/ColorRGB.java | 2 +- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/SkriptClasses.java b/src/main/java/ch/njol/skript/classes/data/SkriptClasses.java index 6f92502cd2a..df1fd8c5cff 100644 --- a/src/main/java/ch/njol/skript/classes/data/SkriptClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/SkriptClasses.java @@ -18,16 +18,6 @@ */ package ch.njol.skript.classes.data; -import java.io.StreamCorruptedException; -import java.util.Iterator; -import java.util.Locale; -import java.util.regex.Pattern; - -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; -import org.eclipse.jdt.annotation.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.aliases.Aliases; import ch.njol.skript.aliases.ItemData; @@ -64,8 +54,16 @@ import ch.njol.skript.util.visual.VisualEffect; import ch.njol.skript.util.visual.VisualEffects; import ch.njol.yggdrasil.Fields; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; +import java.io.StreamCorruptedException; import java.util.Arrays; +import java.util.Iterator; +import java.util.Locale; +import java.util.regex.Pattern; /** * @author Peter Güttinger diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index 532eb829165..0b79863faf8 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -33,7 +33,7 @@ import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.TextDisplay; import org.bukkit.inventory.ItemStack; -import org.eclipse.jdt.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java index d586f2be46e..18dd5004a2c 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java +++ b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java @@ -46,7 +46,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.material.Colorable; import org.bukkit.material.MaterialData; -import org.eclipse.jdt.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/ch/njol/skript/util/ColorRGB.java b/src/main/java/ch/njol/skript/util/ColorRGB.java index 2f687534ac7..6a97c30ee3d 100644 --- a/src/main/java/ch/njol/skript/util/ColorRGB.java +++ b/src/main/java/ch/njol/skript/util/ColorRGB.java @@ -23,8 +23,8 @@ import ch.njol.yggdrasil.Fields; import org.apache.commons.lang.math.NumberUtils; import org.bukkit.DyeColor; -import org.eclipse.jdt.annotation.Nullable; import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; import java.io.NotSerializableException; import java.io.StreamCorruptedException; From fa9e72b2422483b6f496fb2ecded4716daefe568 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sun, 14 Jul 2024 14:05:33 -0700 Subject: [PATCH 065/104] Fix <1.19 errors (just for actions) and fix subtle issues with xyz component changer --- .../ch/njol/skript/entity/DisplayData.java | 3 +- .../skript/expressions/ExprXYZComponent.java | 35 ++++++++++++++++--- .../ch/njol/skript/sections/EffSecSpawn.java | 22 ++++++------ .../java/ch/njol/skript/util/ColorRGB.java | 29 ++++++--------- .../tests/syntaxes/expressions/ExprColorOf.sk | 2 +- .../syntaxes/expressions/ExprXYZComponent.sk | 8 +++-- 6 files changed, 59 insertions(+), 40 deletions(-) diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/ch/njol/skript/entity/DisplayData.java index 0b79863faf8..b9411daeb30 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/ch/njol/skript/entity/DisplayData.java @@ -23,6 +23,7 @@ import ch.njol.skript.lang.Literal; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.registrations.Classes; +import ch.njol.skript.util.ColorRGB; import ch.njol.skript.variables.Variables; import org.bukkit.Bukkit; import org.bukkit.Color; @@ -40,7 +41,7 @@ public class DisplayData extends EntityData { - public static final Color DEFAULT_BACKGROUND_COLOR = Color.fromARGB(64, 0, 0, 0); + public static final Color DEFAULT_BACKGROUND_COLOR = ColorRGB.fromRGBA(0, 0, 0, 64).asBukkitColor(); static { if (Skript.isRunningMinecraft(1, 19, 4)) { diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 2d3a2e788b6..f105b3692ec 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -58,9 +58,11 @@ @Since("2.2-dev28, INSERT VERSION (quaternions)") public class ExprXYZComponent extends SimplePropertyExpression { + private static final boolean IS_RUNNING_1194 = Skript.isRunningMinecraft(1, 19, 4); + static { String types = "vectors"; - if (Skript.isRunningMinecraft(1, 19, 4)) + if (IS_RUNNING_1194) types += "/quaternions"; register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (:w|:x|:y|:z) [component[s]]", types); } @@ -102,9 +104,15 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override public Class @Nullable [] acceptChange(ChangeMode mode) { - if ((mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET) - && Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class, Quaternionf.class)) - return CollectionUtils.array(Number.class); + if ((mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET)) { + boolean acceptsChange; + if (IS_RUNNING_1194) + acceptsChange = Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class, Quaternionf.class); + else + acceptsChange = Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class); + if (acceptsChange) + return CollectionUtils.array(Number.class); + } return null; } @@ -113,13 +121,32 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { assert delta != null; // reset/delete not supported Object[] objects = getExpr().getArray(event); double value = ((Number) delta[0]).doubleValue(); + + boolean hasVectors = false; + boolean hasQuaternions = false; + boolean hasInvalidInput = false; + for (Object object : objects) { if (object instanceof Vector vector) { changeVector(vector, value, mode); + hasVectors = true; } else if (object instanceof Quaternionf quaternion) { changeQuaternion(quaternion, (float) value, mode); + hasQuaternions = true; + } else { + hasInvalidInput = true; } } + + // don't SET the expression if there were invalid inputs + if (hasInvalidInput) + return; + + // covers the edge case where an expression can be set to Vector but returns Quaternions, or similar. + if (hasVectors && !Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class)) + return; + if (hasQuaternions && !Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) + return; getExpr().change(event, objects, ChangeMode.SET); } diff --git a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java index c58fcd17b85..10b94ecb07f 100644 --- a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java +++ b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java @@ -18,18 +18,6 @@ */ package ch.njol.skript.sections; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Consumer; - -import ch.njol.skript.doc.RequiredPlugins; -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; -import org.eclipse.jdt.annotation.Nullable; -import org.jetbrains.annotations.NotNull; - import ch.njol.skript.Skript; import ch.njol.skript.config.SectionNode; import ch.njol.skript.doc.Description; @@ -47,6 +35,16 @@ import ch.njol.skript.util.Getter; import ch.njol.skript.variables.Variables; import ch.njol.util.Kleenean; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; @Name("Spawn") @Description({ diff --git a/src/main/java/ch/njol/skript/util/ColorRGB.java b/src/main/java/ch/njol/skript/util/ColorRGB.java index 6a97c30ee3d..276e6b6344a 100644 --- a/src/main/java/ch/njol/skript/util/ColorRGB.java +++ b/src/main/java/ch/njol/skript/util/ColorRGB.java @@ -18,6 +18,7 @@ */ package ch.njol.skript.util; +import ch.njol.skript.Skript; import ch.njol.skript.variables.Variables; import ch.njol.util.Math2; import ch.njol.yggdrasil.Fields; @@ -52,23 +53,6 @@ public ColorRGB(int red, int green, int blue) { Math2.fit(0, blue, 255))); } - /** - * RGBA constructor. Clamps values to between 0 and 255. For internal use. Prefer {@link #fromRGBA(int, int, int, int)} - * @param red - * @param green - * @param blue - * @param alpha - * @see #fromRGBA(int, int, int, int) - * @see #fromRGB(int, int, int) - */ - private ColorRGB(int red, int green, int blue, int alpha) { - this(org.bukkit.Color.fromARGB( - Math2.fit(0, alpha, 255), - Math2.fit(0, red, 255), - Math2.fit(0, green, 255), - Math2.fit(0, blue, 255))); - } - /** * Subject to being private in the future. Use {@link #fromBukkitColor(org.bukkit.Color)} * This is to keep inline with other color classes. @@ -79,6 +63,7 @@ public ColorRGB(org.bukkit.Color bukkit) { this.bukkit = bukkit; } + private static final boolean HAS_ARGB = Skript.methodExists(org.bukkit.Color.class, "getAlpha"); /** * Returns a ColorRGB object from the provided arguments. * @@ -90,7 +75,13 @@ public ColorRGB(org.bukkit.Color bukkit) { */ @Contract("_,_,_,_ -> new") public static ColorRGB fromRGBA(int red, int green, int blue, int alpha) { - return new ColorRGB(red, green, blue, alpha); + org.bukkit.Color bukkit; + if (HAS_ARGB) + bukkit = org.bukkit.Color.fromARGB(alpha, red ,green, blue); + else + bukkit = org.bukkit.Color.fromRGB(red, green, blue); + + return new ColorRGB(bukkit); } /** @@ -129,7 +120,7 @@ public DyeColor asDyeColor() { @Override public String getName() { - if (bukkit.getAlpha() != 255) + if (HAS_ARGB && bukkit.getAlpha() != 255) return "argb " + bukkit.getAlpha() + ", " + bukkit.getRed() + ", " + bukkit.getGreen() + ", " + bukkit.getBlue(); return "rgb " + bukkit.getRed() + ", " + bukkit.getGreen() + ", " + bukkit.getBlue(); } diff --git a/src/test/skript/tests/syntaxes/expressions/ExprColorOf.sk b/src/test/skript/tests/syntaxes/expressions/ExprColorOf.sk index 06e9931c958..ed68ede4f20 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprColorOf.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprColorOf.sk @@ -8,7 +8,7 @@ # test "color of fireworks": -test "color of displays": +test "color of displays" when running minecraft "1.19.4": spawn a text display at spawn of world "world": set {_e} to entity diff --git a/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk b/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk index ee34a8b53d6..eb8b03c4c4e 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk @@ -1,12 +1,14 @@ test "vector xyz": - assert the w component of vector(0, 0, 0) is not set with "w vector component return value for vector unexpectedly" + if running minecraft "1.19.4": + assert the w component of vector(0, 0, 0) is not set with "w vector component return value for vector unexpectedly" assert the x component of vector(1, 0, 0) is 1 with "x vector component failed" assert the y component of vector(0, 1, 0) is 1 with "y vector component failed" assert the z component of vector(0, 0, 1) is 1 with "z vector component failed" set {_v} to vector(0,0,0) set x of {_v} to infinity value - assert the w component of {_v} is not set with "set x of vector created w component somehow" + if running minecraft "1.19.4": + assert the w component of {_v} is not set with "set x of vector created w component somehow" assert the x component of {_v} is infinity value with "set x of vector failed" assert the y component of {_v} is 0 with "set x of vector modified other components" assert the z component of {_v} is 0 with "set x of vector modified other components" @@ -28,7 +30,7 @@ test "vector xyz": assert the x component of {_v::*} is (-1.5, -1.5, and -1.5) with "x component of multiple vectors failed" assert the y component of {_v::*} is (2, 3, and 4) with "changing x component of multiple vectors changed y components too" -test "quaternion xyz": +test "quaternion xyz" when running minecraft "1.19.4": assert the w component of quaternion(1, 0, 0, 0) is 1 with "w vector component failed" assert the x component of quaternion(1, 0, 0, 0) is 0 with "x vector component failed" assert the y component of quaternion(1, 0, 0, 0) is 0 with "y vector component failed" From 77a843b9ab93dc48e5c8404d11881d88bfc5c159 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sun, 14 Jul 2024 14:29:53 -0700 Subject: [PATCH 066/104] rename package to bukkit --- src/main/java/ch/njol/skript/util/ColorRGB.java | 4 ++-- .../displays/expressions/ExprDisplayBillboard.java | 2 +- .../displays/expressions/ExprDisplayBrightness.java | 2 +- .../displays/expressions/ExprDisplayGlowOverride.java | 2 +- .../displays/expressions/ExprDisplayHeightWidth.java | 2 +- .../displays/expressions/ExprDisplayInterpolation.java | 2 +- .../displays/expressions/ExprDisplayShadow.java | 2 +- .../displays/expressions/ExprDisplayTeleportDuration.java | 2 +- .../expressions/ExprDisplayTransformationRotation.java | 2 +- .../ExprDisplayTransformationScaleTranslation.java | 2 +- .../displays/expressions/ExprDisplayViewRange.java | 2 +- .../displays/expressions/package-info.java | 2 +- .../displays/item/ExprItemDisplayTransform.java | 2 +- .../displays/item/ExprItemOfItemDisplay.java | 2 +- .../{elements => bukkit}/displays/item/package-info.java | 2 +- .../displays/text/ExprTextDisplayAlignment.java | 2 +- .../displays/text/ExprTextDisplayLineWidth.java | 2 +- .../displays/text/ExprTextDisplayOpacity.java | 2 +- .../{elements => bukkit}/displays/text/package-info.java | 2 +- .../{elements => bukkit}/expressions/ExprItemFrameSlot.java | 2 +- .../expressions/ExprQuaternionAxisAngle.java | 2 +- .../expressions/ExprRotateQuaternion.java | 2 +- .../skript/{elements => bukkit}/expressions/ExprTextOf.java | 2 +- .../tests/syntaxes/expressions/ExprDisplayBillboard.sk | 6 ++++++ 24 files changed, 30 insertions(+), 24 deletions(-) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayBillboard.java (97%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayBrightness.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayGlowOverride.java (97%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayHeightWidth.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayInterpolation.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayShadow.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayTeleportDuration.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayTransformationRotation.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayTransformationScaleTranslation.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/ExprDisplayViewRange.java (97%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/expressions/package-info.java (93%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/item/ExprItemDisplayTransform.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/item/ExprItemOfItemDisplay.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/item/package-info.java (94%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/text/ExprTextDisplayAlignment.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/text/ExprTextDisplayLineWidth.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/text/ExprTextDisplayOpacity.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/displays/text/package-info.java (94%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/expressions/ExprItemFrameSlot.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/expressions/ExprQuaternionAxisAngle.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/expressions/ExprRotateQuaternion.java (98%) rename src/main/java/org/skriptlang/skript/{elements => bukkit}/expressions/ExprTextOf.java (98%) create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprDisplayBillboard.sk diff --git a/src/main/java/ch/njol/skript/util/ColorRGB.java b/src/main/java/ch/njol/skript/util/ColorRGB.java index 276e6b6344a..9ffbdc3ddc6 100644 --- a/src/main/java/ch/njol/skript/util/ColorRGB.java +++ b/src/main/java/ch/njol/skript/util/ColorRGB.java @@ -65,7 +65,7 @@ public ColorRGB(org.bukkit.Color bukkit) { private static final boolean HAS_ARGB = Skript.methodExists(org.bukkit.Color.class, "getAlpha"); /** - * Returns a ColorRGB object from the provided arguments. + * Returns a ColorRGB object from the provided arguments. Versions lower than 1.19 will not support alpha values. * * @param red red value (0 to 255) * @param green green value (0 to 255) @@ -77,7 +77,7 @@ public ColorRGB(org.bukkit.Color bukkit) { public static ColorRGB fromRGBA(int red, int green, int blue, int alpha) { org.bukkit.Color bukkit; if (HAS_ARGB) - bukkit = org.bukkit.Color.fromARGB(alpha, red ,green, blue); + bukkit = org.bukkit.Color.fromARGB(alpha, red, green, blue); else bukkit = org.bukkit.Color.fromRGB(red, green, blue); diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java index 98fd1b3f5f5..69a33f32206 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.entity.Display.Billboard; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java index 4a2c017f478..32400fa7a6a 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.entity.Display.Brightness; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java index 364f31fd2ff..21d786ecdf0 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java index 6e6b0630db1..67cefa11ff4 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java index c7933ce6286..6722f504525 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java index f440e5b9af3..d946bfd2ef4 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTeleportDuration.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTeleportDuration.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java index 8188d6e96a9..439504e8967 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTeleportDuration.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java index 219a56638a3..1c357163374 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java index 878edd650fd..243209c4c72 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java similarity index 97% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java index aca711bfdab..885d515745a 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/expressions/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java similarity index 93% rename from src/main/java/org/skriptlang/skript/elements/displays/expressions/package-info.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java index 8dae9f8441d..be8eff2966a 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/expressions/package-info.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java @@ -17,7 +17,7 @@ * Copyright Peter Güttinger, SkriptLang team and contributors */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package org.skriptlang.skript.elements.displays.expressions; +package org.skriptlang.skript.bukkit.displays.expressions; import org.eclipse.jdt.annotation.DefaultLocation; import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java index 51e81d2bb73..53bf4eb993a 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemDisplayTransform.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.item; +package org.skriptlang.skript.bukkit.displays.item; import org.bukkit.entity.Display; import org.bukkit.entity.ItemDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java index 36e4fd180ea..800ccb63f3a 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/item/ExprItemOfItemDisplay.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.item; +package org.skriptlang.skript.bukkit.displays.item; import org.bukkit.entity.Display; import org.bukkit.entity.ItemDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/item/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java similarity index 94% rename from src/main/java/org/skriptlang/skript/elements/displays/item/package-info.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java index 8e6e52dc459..1255cb614e2 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/item/package-info.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java @@ -17,7 +17,7 @@ * Copyright Peter Güttinger, SkriptLang team and contributors */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package org.skriptlang.skript.elements.displays.item; +package org.skriptlang.skript.bukkit.displays.item; import org.eclipse.jdt.annotation.DefaultLocation; import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java index a63767029cc..77194c843e8 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayAlignment.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.text; +package org.skriptlang.skript.bukkit.displays.text; import org.bukkit.entity.Display; import org.bukkit.entity.TextDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java index 48c8b8d6e57..5fde4869ca5 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayLineWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.text; +package org.skriptlang.skript.bukkit.displays.text; import org.bukkit.entity.Display; import org.bukkit.entity.TextDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java index 6819b43c203..19bc6c91d5a 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/text/ExprTextDisplayOpacity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.displays.text; +package org.skriptlang.skript.bukkit.displays.text; import org.bukkit.entity.Display; import org.bukkit.entity.TextDisplay; diff --git a/src/main/java/org/skriptlang/skript/elements/displays/text/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java similarity index 94% rename from src/main/java/org/skriptlang/skript/elements/displays/text/package-info.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java index 1bfe2c58378..6ce8a870a02 100644 --- a/src/main/java/org/skriptlang/skript/elements/displays/text/package-info.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java @@ -17,7 +17,7 @@ * Copyright Peter Güttinger, SkriptLang team and contributors */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package org.skriptlang.skript.elements.displays.text; +package org.skriptlang.skript.bukkit.displays.text; import org.eclipse.jdt.annotation.DefaultLocation; import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprItemFrameSlot.java b/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprItemFrameSlot.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/ExprItemFrameSlot.java rename to src/main/java/org/skriptlang/skript/bukkit/expressions/ExprItemFrameSlot.java index 334d208adee..96848c6606a 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/ExprItemFrameSlot.java +++ b/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprItemFrameSlot.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions; +package org.skriptlang.skript.bukkit.expressions; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprQuaternionAxisAngle.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java rename to src/main/java/org/skriptlang/skript/bukkit/expressions/ExprQuaternionAxisAngle.java index b382c2f56cd..22a5dcff44e 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprQuaternionAxisAngle.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.elements.expressions; +package org.skriptlang.skript.bukkit.expressions; import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprRotateQuaternion.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java rename to src/main/java/org/skriptlang/skript/bukkit/expressions/ExprRotateQuaternion.java index 64801c0d53e..7dbdc16e093 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/ExprRotateQuaternion.java +++ b/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprRotateQuaternion.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions; +package org.skriptlang.skript.bukkit.expressions; import org.bukkit.event.Event; import org.bukkit.util.Vector; diff --git a/src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprTextOf.java similarity index 98% rename from src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java rename to src/main/java/org/skriptlang/skript/bukkit/expressions/ExprTextOf.java index 561b4cd34c0..e430455fc8f 100644 --- a/src/main/java/org/skriptlang/skript/elements/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprTextOf.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.elements.expressions; +package org.skriptlang.skript.bukkit.expressions; import org.bukkit.entity.TextDisplay; import org.bukkit.event.Event; diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBillboard.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBillboard.sk new file mode 100644 index 00000000000..f2bc190f046 --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBillboard.sk @@ -0,0 +1,6 @@ +test "display billboard" when running minecraft "1.19.4": + + spawn a text display at spawn of world "world": + set {_e} to entity + + assert billboard of {_e} is From 937bb3764e75296798ab5a9985d86bffa4110aa6 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sun, 14 Jul 2024 14:31:44 -0700 Subject: [PATCH 067/104] finish package refactor --- src/main/java/ch/njol/skript/Skript.java | 2 +- .../skript/bukkit/{ => misc}/expressions/ExprItemFrameSlot.java | 2 +- .../bukkit/{ => misc}/expressions/ExprQuaternionAxisAngle.java | 2 +- .../bukkit/{ => misc}/expressions/ExprRotateQuaternion.java | 2 +- .../skript/bukkit/{ => misc}/expressions/ExprTextOf.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/org/skriptlang/skript/bukkit/{ => misc}/expressions/ExprItemFrameSlot.java (98%) rename src/main/java/org/skriptlang/skript/bukkit/{ => misc}/expressions/ExprQuaternionAxisAngle.java (98%) rename src/main/java/org/skriptlang/skript/bukkit/{ => misc}/expressions/ExprRotateQuaternion.java (98%) rename src/main/java/org/skriptlang/skript/bukkit/{ => misc}/expressions/ExprTextOf.java (98%) diff --git a/src/main/java/ch/njol/skript/Skript.java b/src/main/java/ch/njol/skript/Skript.java index 2703ef61c7d..b98afe1b526 100644 --- a/src/main/java/ch/njol/skript/Skript.java +++ b/src/main/java/ch/njol/skript/Skript.java @@ -556,7 +556,7 @@ public void onEnable() { try { getAddonInstance().loadClasses("ch.njol.skript", "conditions", "effects", "events", "expressions", "entity", "sections", "structures"); - getAddonInstance().loadClasses("org.skriptlang.skript", "elements"); + getAddonInstance().loadClasses("org.skriptlang.skript.bukkit", "displays", "misc"); } catch (final Exception e) { exception(e, "Could not load required .class files: " + e.getLocalizedMessage()); setEnabled(false); diff --git a/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprItemFrameSlot.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemFrameSlot.java similarity index 98% rename from src/main/java/org/skriptlang/skript/bukkit/expressions/ExprItemFrameSlot.java rename to src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemFrameSlot.java index 96848c6606a..2179e00810f 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprItemFrameSlot.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemFrameSlot.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.bukkit.expressions; +package org.skriptlang.skript.bukkit.misc.expressions; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; diff --git a/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java similarity index 98% rename from src/main/java/org/skriptlang/skript/bukkit/expressions/ExprQuaternionAxisAngle.java rename to src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java index 22a5dcff44e..6f72007880a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.expressions; +package org.skriptlang.skript.bukkit.misc.expressions; import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer; diff --git a/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java similarity index 98% rename from src/main/java/org/skriptlang/skript/bukkit/expressions/ExprRotateQuaternion.java rename to src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java index 7dbdc16e093..0a81e84d40d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprRotateQuaternion.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.bukkit.expressions; +package org.skriptlang.skript.bukkit.misc.expressions; import org.bukkit.event.Event; import org.bukkit.util.Vector; diff --git a/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java similarity index 98% rename from src/main/java/org/skriptlang/skript/bukkit/expressions/ExprTextOf.java rename to src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java index e430455fc8f..22090ac4e17 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.bukkit.expressions; +package org.skriptlang.skript.bukkit.misc.expressions; import org.bukkit.entity.TextDisplay; import org.bukkit.event.Event; From 5c4ecbe7c25a42dc2027539c5a5a99f4c7fcc066 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sun, 14 Jul 2024 19:16:55 -0700 Subject: [PATCH 068/104] Add tests for billboarding, rework display brightness and add tests, move joml utilities --- .../expressions/ExprDisplayBillboard.java | 8 +- .../expressions/ExprDisplayBrightness.java | 187 ++++++++++++------ ...DisplayTransformationScaleTranslation.java | 2 +- .../expressions/ExprRotateQuaternion.java | 2 +- .../util/JomlBukkitUtils.java | 2 +- .../expressions/ExprDisplayBillboard.sk | 46 ++++- .../expressions/ExprDisplayBrightness.sk | 58 ++++++ 7 files changed, 235 insertions(+), 70 deletions(-) rename src/main/java/org/skriptlang/skript/{lang => bukkit}/util/JomlBukkitUtils.java (97%) create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java index 69a33f32206..b5d9bb9274e 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java @@ -46,7 +46,7 @@ public class ExprDisplayBillboard extends SimplePropertyExpression[] acceptChange(ChangeMode mode) { + public Class @Nullable [] acceptChange(ChangeMode mode) { switch (mode) { case ADD: case DELETE: @@ -72,12 +71,13 @@ public Class[] acceptChange(ChangeMode mode) { } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { if (mode == ChangeMode.RESET) { for (Display display : getExpr().getArray(event)) display.setBillboard(Billboard.FIXED); return; } + assert delta != null; Billboard billboard = (Billboard) delta[0]; for (Display display : getExpr().getArray(event)) display.setBillboard(billboard); diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java index 32400fa7a6a..180b39fee02 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java @@ -18,11 +18,6 @@ */ package org.skriptlang.skript.bukkit.displays.expressions; -import org.bukkit.entity.Display; -import org.bukkit.entity.Display.Brightness; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; @@ -30,99 +25,167 @@ import ch.njol.skript.doc.Name; import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; -import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; +import ch.njol.util.Math2; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.entity.Display.Brightness; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; + +import java.util.ArrayList; +import java.util.List; @Name("Display Brightness") @Description({ - "Returns or changes the block or sky brightness of displays.", - "Value must be between 0 and 15." + "Returns or changes the brightness override of displays.", + "Unmodified displays will not have a brightness override value set. Resetting or deleting this value will remove the override.", + "Use the 'block' or 'sky' options to get/change specific values or get both values as a list by using neither option.", + "NOTE: setting only one of the sky/block light overrides of a display without an existing override will set both sky and block light to the given value. " + + "Make sure to set both block and sky levels to your desired values for the best results. " + + "Likewise, you can only clear the brightness override, you cannot clear/reset the sky/block values individually." +}) +@Examples({ + "set brightness override of the last spawned text display to brightness(5, 7)", + "set sky light override of the last spawned text display to 7", + "subtract 3 from the block light level override of the last spawned text display", + "if sky light level override of {_display} is 5:", + "\tclear brightness override of {_display}" }) -@Examples("set sky brightness of the last spawned text display to 5") @RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") -public class ExprDisplayBrightness extends SimplePropertyExpression { +public class ExprDisplayBrightness extends SimpleExpression { static { if (Skript.isRunningMinecraft(1, 19, 4)) - register(ExprDisplayBrightness.class, Integer.class, "(:sky|block) [light] brightness[es]", "displays"); + Skript.registerExpression(ExprDisplayBrightness.class, Integer.class, ExpressionType.PROPERTY, + "[the] [:block|:sky] (light [level]|brightness) override[s] of %displays%", + "%displays%'[s] [:block|:sky] (light [level]|brightness) override[s]"); } - private boolean sky; + private @UnknownNullability Expression displays; + private boolean blockLight; + private boolean skyLight; @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - sky = parseResult.hasTag("sky"); - return super.init(exprs, matchedPattern, isDelayed, parseResult); + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + blockLight = parseResult.hasTag("block"); + skyLight = parseResult.hasTag("sky"); + //noinspection unchecked + displays = (Expression) expressions[0]; + return true; } @Override - @Nullable - public Integer convert(Display display) { - Brightness brightness = display.getBrightness(); - return sky ? brightness.getSkyLight() : brightness.getBlockLight(); + protected Integer @Nullable [] get(Event event) { + List values = new ArrayList<>(); + if (skyLight) { + for (Display display : displays.getArray(event)) { + Brightness brightness = display.getBrightness(); + if (brightness == null) + continue; + values.add(brightness.getSkyLight()); + } + } else if (blockLight) { + for (Display display : displays.getArray(event)) { + Brightness brightness = display.getBrightness(); + if (brightness == null) + continue; + values.add(brightness.getBlockLight()); + } + } else { + for (Display display : displays.getArray(event)) { + Brightness brightness = display.getBrightness(); + if (brightness == null) + continue; + values.add(brightness.getBlockLight(), brightness.getSkyLight()); + } + } + return values.toArray(new Integer[0]); } - @Nullable - public Class[] acceptChange(ChangeMode mode) { - return CollectionUtils.array(Number.class); + public Class @Nullable [] acceptChange(ChangeMode mode) { + if (skyLight || blockLight) { + return switch (mode) { + case REMOVE_ALL, RESET, DELETE -> null; + case ADD, REMOVE, SET -> CollectionUtils.array(Number.class); + }; + } else { + return switch (mode) { + case ADD, SET, REMOVE, REMOVE_ALL -> null; + case RESET, DELETE -> CollectionUtils.array(Brightness.class); + }; + } } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - Display[] displays = getExpr().getArray(event); - int change = delta == null ? 0 : (int) ((Number) delta[0]).intValue(); - switch (mode) { - case REMOVE_ALL: - case REMOVE: - change = -change; - case ADD: - Brightness brightness; - for (Display display : displays) { - Brightness current = display.getBrightness(); - if (sky) { - int value = current.getSkyLight() + change; - value = Math.max(0, Math.min(15, value)); - brightness = new Brightness(current.getBlockLight(), value); - } else { - int value = current.getBlockLight() + change; - value = Math.max(0, Math.min(15, value)); - brightness = new Brightness(value, current.getSkyLight()); + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + if (skyLight || blockLight) { + int level = delta == null ? 0 : ((Number) delta[0]).intValue(); + switch (mode) { + case REMOVE: + level = -level; + // $FALL-THROUGH$ + case ADD: + for (Display display : displays.getArray(event)) { + Brightness brightness = display.getBrightness(); + if (brightness == null) { + int clamped = Math2.fit(0, level, 15); + display.setBrightness(new Brightness(clamped, clamped)); + } else if (skyLight) { + int clamped = Math2.fit(0, level + brightness.getSkyLight(), 15); + display.setBrightness(new Brightness(brightness.getBlockLight(), clamped)); + } else { + int clamped = Math2.fit(0, level + brightness.getBlockLight(), 15); + display.setBrightness(new Brightness(clamped, brightness.getSkyLight())); + } } - display.setBrightness(brightness); - } - break; - case DELETE: - case RESET: - for (Display display : displays) - display.setBrightness(null); - break; - case SET: - change = Math.max(0, Math.min(15, change)); - for (Display display : displays) { - Brightness current = display.getBrightness(); - if (sky) { - brightness = new Brightness(current.getBlockLight(), change); - } else { - brightness = new Brightness(change, current.getSkyLight()); + break; + case SET: + for (Display display : displays.getArray(event)) { + Brightness brightness = display.getBrightness(); + int clamped = Math2.fit(0, level, 15); + if (brightness == null) { + display.setBrightness(new Brightness(clamped, clamped)); + } else if (skyLight) { + display.setBrightness(new Brightness(brightness.getBlockLight(), clamped)); + } else { + display.setBrightness(new Brightness(clamped, brightness.getSkyLight())); + } } - display.setBrightness(brightness); - } - break; + break; + } + } else { + assert mode == ChangeMode.RESET || mode == ChangeMode.DELETE; + for (Display display : displays.getArray(event)) + display.setBrightness(null); } } + @Override + public boolean isSingle() { + return (skyLight || blockLight) && displays.isSingle(); + } + @Override public Class getReturnType() { return Integer.class; } @Override - protected String getPropertyName() { - return (sky ? "sky" : "block") + "brightness"; + public String toString(@Nullable Event event, boolean debug) { + if (skyLight) { + return "sky light override of " + displays.toString(event, debug); + } else if (blockLight) { + return "block light override of " + displays.toString(event, debug); + } else { + return "brightness override of " + displays.toString(event, debug); + } } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java index 243209c4c72..e8e97bb4c2b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java @@ -37,7 +37,7 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; -import org.skriptlang.skript.lang.util.JomlBukkitUtils; +import org.skriptlang.skript.bukkit.util.JomlBukkitUtils; @Name("Display Transformation Scale/Translation") @Description("Returns or changes the transformation scale or translation of displays.") diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java index 0a81e84d40d..8cd7b30aeab 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java @@ -23,7 +23,7 @@ import org.eclipse.jdt.annotation.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; -import org.skriptlang.skript.lang.util.JomlBukkitUtils; +import org.skriptlang.skript.bukkit.util.JomlBukkitUtils; import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; diff --git a/src/main/java/org/skriptlang/skript/lang/util/JomlBukkitUtils.java b/src/main/java/org/skriptlang/skript/bukkit/util/JomlBukkitUtils.java similarity index 97% rename from src/main/java/org/skriptlang/skript/lang/util/JomlBukkitUtils.java rename to src/main/java/org/skriptlang/skript/bukkit/util/JomlBukkitUtils.java index f0317e8ec2d..21b488bf09d 100644 --- a/src/main/java/org/skriptlang/skript/lang/util/JomlBukkitUtils.java +++ b/src/main/java/org/skriptlang/skript/bukkit/util/JomlBukkitUtils.java @@ -16,7 +16,7 @@ * * Copyright Peter Güttinger, SkriptLang team and contributors */ -package org.skriptlang.skript.lang.util; +package org.skriptlang.skript.bukkit.util; import org.bukkit.util.Vector; import org.joml.Vector3f; diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBillboard.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBillboard.sk index f2bc190f046..81550626e4b 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBillboard.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBillboard.sk @@ -3,4 +3,48 @@ test "display billboard" when running minecraft "1.19.4": spawn a text display at spawn of world "world": set {_e} to entity - assert billboard of {_e} is + assert bill-boarding of {_e} is fixed with "incorrect default bill-boarding" + + set bill-boarding of {_e} to vertical + assert bill-boarding of {_e} is vertical with "failed to set bill-boarding" + set bill-boarding of {_e} to horizontal + assert bill-boarding of {_e} is horizontal with "failed to set bill-boarding" + set bill-boarding of {_e} to center + assert bill-boarding of {_e} is center with "failed to set bill-boarding" + reset bill-boarding of {_e} + assert bill-boarding of {_e} is fixed with "failed to reset bill-boarding" + + delete entity within {_e} + + spawn an item display at spawn of world "world": + set {_e} to entity + + assert bill-boarding of {_e} is fixed with "incorrect default bill-boarding" + + set bill-boarding of {_e} to vertical + assert bill-boarding of {_e} is vertical with "failed to set bill-boarding" + set bill-boarding of {_e} to horizontal + assert bill-boarding of {_e} is horizontal with "failed to set bill-boarding" + set bill-boarding of {_e} to center + assert bill-boarding of {_e} is center with "failed to set bill-boarding" + reset bill-boarding of {_e} + assert bill-boarding of {_e} is fixed with "failed to reset bill-boarding" + + delete entity within {_e} + + + spawn a block display at spawn of world "world": + set {_e} to entity + + assert bill-boarding of {_e} is fixed with "incorrect default bill-boarding" + + set bill-boarding of {_e} to vertical + assert bill-boarding of {_e} is vertical with "failed to set bill-boarding" + set bill-boarding of {_e} to horizontal + assert bill-boarding of {_e} is horizontal with "failed to set bill-boarding" + set bill-boarding of {_e} to center + assert bill-boarding of {_e} is center with "failed to set bill-boarding" + reset bill-boarding of {_e} + assert bill-boarding of {_e} is fixed with "failed to reset bill-boarding" + + delete entity within {_e} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk new file mode 100644 index 00000000000..c56f7fdffa2 --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk @@ -0,0 +1,58 @@ +test "display brightness" when running minecraft "1.19.4": + spawn block display at spawn of world "world": + set {_e::1} to entity + spawn item display at spawn of world "world": + set {_e::2} to entity + spawn text display at spawn of world "world": + set {_e::3} to entity + + assert block light level override of {_e::*} is not set with "default displays have unexpected sky light override" + assert sky light override of {_e::*} is not set with "default displays have unexpected block light override" + + # sky light + + set sky light override of {_e::*} to 5 + assert block light level override of {_e::*} is 5 with "failed setting initial block light" + assert sky light override of {_e::*} is 5 with "failed setting sky light" + + set sky light override of {_e::*} to -1 + assert block light level override of {_e::*} is 5 with "failed setting sky light" + assert sky light override of {_e::*} is 0 with "failed setting sky light" + + add 5 to sky light override of {_e::*} + assert block light level override of {_e::*} is 5 with "failed adding sky light" + assert sky light override of {_e::*} is 5 with "failed adding sky light" + + set sky light override of {_e::*} to {_} + assert block light level override of {_e::*} is 5 with "failed setting sky light" + assert sky light override of {_e::*} is 5 with "failed setting sky light" + + remove 10 from sky light override of {_e::*} + assert block light level override of {_e::*} is 5 with "failed adding sky light" + assert sky light override of {_e::*} is 0 with "failed adding sky light" + + clear brightness override of {_e::*} + assert block light level override of {_e::*} is not set with "failed deleting brightness" + assert sky light override of {_e::*} is not set with "failed deleting brightness" + + # block light + + set block light override of {_e::*} to 5 + assert block light level override of {_e::*} is 5 with "failed setting initial block light" + assert sky light override of {_e::*} is 5 with "failed setting block light" + + set block light override of {_e::*} to infinity value + assert block light level override of {_e::*} is 15 with "failed setting block light" + assert sky light override of {_e::*} is 5 with "failed setting block light" + + add 5 to block light override of {_e::*} + assert block light level override of {_e::*} is 15 with "failed adding block light" + assert sky light override of {_e::*} is 5 with "failed adding block light" + + set block light override of {_e::*} to {_} + assert block light level override of {_e::*} is 15 with "failed setting block light" + assert sky light override of {_e::*} is 5 with "failed setting block light" + + remove 10 from block light override of {_e::*} + assert block light level override of {_e::*} is 5 with "failed adding block light" + assert sky light override of {_e::*} is 5 with "failed adding block light" From 0c151455a0f8ee66558f280426673fc7e727d302 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sun, 14 Jul 2024 20:23:44 -0700 Subject: [PATCH 069/104] tests + allow setting override to a single number --- .../expressions/ExprDisplayBrightness.java | 15 ++++++---- .../expressions/ExprDisplayBrightness.sk | 28 +++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java index 180b39fee02..5d0bfa37c84 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java @@ -103,7 +103,8 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is Brightness brightness = display.getBrightness(); if (brightness == null) continue; - values.add(brightness.getBlockLight(), brightness.getSkyLight()); + values.add(brightness.getBlockLight()); + values.add(brightness.getSkyLight()); } } return values.toArray(new Integer[0]); @@ -117,8 +118,8 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is }; } else { return switch (mode) { - case ADD, SET, REMOVE, REMOVE_ALL -> null; - case RESET, DELETE -> CollectionUtils.array(Brightness.class); + case ADD, REMOVE, REMOVE_ALL -> null; + case SET, RESET, DELETE -> CollectionUtils.array(Number.class); }; } } @@ -161,9 +162,13 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { break; } } else { - assert mode == ChangeMode.RESET || mode == ChangeMode.DELETE; + Brightness change = null; + if (delta != null) { + int value = Math2.fit(0, ((Number) delta[0]).intValue(), 15); + change = new Brightness(value, value); + } for (Display display : displays.getArray(event)) - display.setBrightness(null); + display.setBrightness(change); } } diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk index c56f7fdffa2..b925f2ea867 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk @@ -6,53 +6,81 @@ test "display brightness" when running minecraft "1.19.4": spawn text display at spawn of world "world": set {_e::3} to entity + assert brightness override of {_e::*} is not set with "default displays have unexpected brightness override" assert block light level override of {_e::*} is not set with "default displays have unexpected sky light override" assert sky light override of {_e::*} is not set with "default displays have unexpected block light override" + # brightness overrides + set brightness override of {_e::*} to 2 + assert brightness override of {_e::*} is 2, 2, 2, 2, 2, and 2 with "failed setting brightness" + assert block light level override of {_e::*} is 2 with "failed setting brightness" + assert sky light override of {_e::*} is 2 with "failed setting brightness" + + set brightness override of {_e::*} to -1 + assert brightness override of {_e::*} is 0, 0, 0, 0, 0, and 0 with "failed setting brightness" + assert block light level override of {_e::*} is 0 with "failed setting brightness" + assert sky light override of {_e::*} is 0 with "failed setting brightness" + + reset brightness override of {_e::*} + assert brightness override of {_e::*} is not set with "failed resetting brightness" + assert block light level override of {_e::*} is not set with "failed resetting brightness" + assert sky light override of {_e::*} is not set with "failed resetting brightness" + # sky light set sky light override of {_e::*} to 5 + assert brightness override of {_e::*} is 5 with "failed setting sky light" assert block light level override of {_e::*} is 5 with "failed setting initial block light" assert sky light override of {_e::*} is 5 with "failed setting sky light" set sky light override of {_e::*} to -1 + assert brightness override of {_e::*} is 5, 0, 5, 0, 5, 0 with "failed setting sky light" assert block light level override of {_e::*} is 5 with "failed setting sky light" assert sky light override of {_e::*} is 0 with "failed setting sky light" add 5 to sky light override of {_e::*} + assert brightness override of {_e::*} is 5 with "failed adding sky light" assert block light level override of {_e::*} is 5 with "failed adding sky light" assert sky light override of {_e::*} is 5 with "failed adding sky light" set sky light override of {_e::*} to {_} + assert brightness override of {_e::*} is 5 with "failed setting sky light" assert block light level override of {_e::*} is 5 with "failed setting sky light" assert sky light override of {_e::*} is 5 with "failed setting sky light" remove 10 from sky light override of {_e::*} + assert brightness override of {_e::*} is 5, 0, 5, 0, 5, 0 with "failed adding sky light" assert block light level override of {_e::*} is 5 with "failed adding sky light" assert sky light override of {_e::*} is 0 with "failed adding sky light" clear brightness override of {_e::*} + assert brightness override of {_e::*} is not set with "failed deleting brightness" assert block light level override of {_e::*} is not set with "failed deleting brightness" assert sky light override of {_e::*} is not set with "failed deleting brightness" # block light set block light override of {_e::*} to 5 + assert brightness override of {_e::*} is 5 with "failed setting block light" assert block light level override of {_e::*} is 5 with "failed setting initial block light" assert sky light override of {_e::*} is 5 with "failed setting block light" set block light override of {_e::*} to infinity value + assert brightness override of {_e::*} is 15, 5, 15, 5, 15, 5 with "failed setting block light" assert block light level override of {_e::*} is 15 with "failed setting block light" assert sky light override of {_e::*} is 5 with "failed setting block light" add 5 to block light override of {_e::*} + assert brightness override of {_e::*} is 15, 5, 15, 5, 15, 5 with "failed adding block light" assert block light level override of {_e::*} is 15 with "failed adding block light" assert sky light override of {_e::*} is 5 with "failed adding block light" set block light override of {_e::*} to {_} + assert brightness override of {_e::*} is 15, 5, 15, 5, 15, 5 with "failed setting block light" assert block light level override of {_e::*} is 15 with "failed setting block light" assert sky light override of {_e::*} is 5 with "failed setting block light" remove 10 from block light override of {_e::*} + assert brightness override of {_e::*} is 5 with "failed adding block light" assert block light level override of {_e::*} is 5 with "failed adding block light" assert sky light override of {_e::*} is 5 with "failed adding block light" From a9c71101000173f03c6245f4f9e95665a15e3df3 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Mon, 15 Jul 2024 15:08:13 -0700 Subject: [PATCH 070/104] tests, cleanup, and bug fixes for glow override and hegiht/width --- .../expressions/ExprDisplayGlowOverride.java | 7 ++-- .../expressions/ExprDisplayHeightWidth.java | 35 +++++++---------- .../expressions/ExprDisplayBrightness.sk | 2 + .../expressions/ExprDisplayGlowOverride.sk | 21 ++++++++++ .../expressions/ExprDisplayHeightWidth.sk | 39 +++++++++++++++++++ 5 files changed, 80 insertions(+), 24 deletions(-) create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprDisplayGlowOverride.sk create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprDisplayHeightWidth.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java index 21d786ecdf0..c2fbe4d8399 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java @@ -46,7 +46,7 @@ public class ExprDisplayGlowOverride extends SimplePropertyExpression[] acceptChange(ChangeMode mode) { + public Class @Nullable [] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET || mode == ChangeMode.RESET || mode == ChangeMode.DELETE) return CollectionUtils.array(Color.class); return null; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); if (mode != ChangeMode.SET) { for (Display display : displays) diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java index 67cefa11ff4..fe554de8ed6 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java @@ -38,11 +38,12 @@ @Name("Display Height/Width") @Description({ "Returns or changes the height or width of displays.", - "The rendering culling bounding box spans horizontally width/2 from entity position, "+ - "and the part beyond will be culled.", + "The rendering culling bounding box spans horizontally width/2 from entity position, " + + "which determines the point at which the display will be frustum culled (no longer rendered because the game " + + "determines you are no longer able to see it).", "If set to 0, no culling will occur on both the vertical and horizontal directions. Default is 0.0." }) -@Examples("set height of the last spawned text display to 2.5") +@Examples("set display height of the last spawned text display to 2.5") @RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayHeightWidth extends SimplePropertyExpression { @@ -66,28 +67,22 @@ public Float convert(Display display) { return height ? display.getDisplayHeight() : display.getDisplayWidth(); } - @Nullable - public Class[] acceptChange(ChangeMode mode) { - switch (mode) { - case ADD: - case DELETE: - case REMOVE: - case RESET: - case SET: - return CollectionUtils.array(Number.class); - case REMOVE_ALL: - default: - return null; - } + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case ADD, REMOVE, RESET, SET -> CollectionUtils.array(Number.class); + case DELETE, REMOVE_ALL -> null; + }; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); + float change = delta == null ? 0F : ((Number) delta[0]).floatValue(); - change = Math.max(0F, change); + if (Float.isInfinite(change) || Float.isNaN(change)) + return; + switch (mode) { - case REMOVE_ALL: case REMOVE: change = -change; case ADD: @@ -101,9 +96,9 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } } break; - case DELETE: case RESET: case SET: + change = Math.max(0F, change); for (Display display : displays) { if (height) { display.setDisplayHeight(change); diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk index b925f2ea867..ccb3fb7b532 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk @@ -84,3 +84,5 @@ test "display brightness" when running minecraft "1.19.4": assert brightness override of {_e::*} is 5 with "failed adding block light" assert block light level override of {_e::*} is 5 with "failed adding block light" assert sky light override of {_e::*} is 5 with "failed adding block light" + + delete entities within {_e::*} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayGlowOverride.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayGlowOverride.sk new file mode 100644 index 00000000000..2442d6ef49a --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayGlowOverride.sk @@ -0,0 +1,21 @@ +test "display glow color override" when running minecraft "1.19": + + spawn block display at spawn of world "world": + set {_e::1} to entity + spawn item display at spawn of world "world": + set {_e::2} to entity + spawn text display at spawn of world "world": + set {_e::3} to entity + + assert glow colour override of {_e::*} is not set with "default override was set" + + set glow colour override of {_e::*} to blue + assert glow colour override of {_e::*} is blue with "failed to set to colour" + + set glow colour override of {_e::*} to rgb(1, 2, 3) + assert glow colour override of {_e::*} is rgb(1, 2, 3) with "failed to set to rgb colour" + + reset glow colour override of {_e::*} + assert glow colour override of {_e::*} is not set with "failed to reset override" + + delete entities within {_e::*} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayHeightWidth.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayHeightWidth.sk new file mode 100644 index 00000000000..3b0e74e2d23 --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayHeightWidth.sk @@ -0,0 +1,39 @@ +test "display height/width" when running minecraft "1.19": + + spawn block display at spawn of world "world": + set {_e::1} to entity + spawn item display at spawn of world "world": + set {_e::2} to entity + spawn text display at spawn of world "world": + set {_e::3} to entity + + assert display width of {_e::*} is 0 with "default width was not 0" + assert display height of {_e::*} is 0 with "default height was not 0" + + set display height of {_e::*} to 5 + assert display height of {_e::*} is 5 with "failed to set to height" + assert display width of {_e::*} is 0 with "setting height modified width" + + set display width of {_e::*} to 0.1 + assert display height of {_e::*} is 5 with "setting width modified height" + assert display width of {_e::*} is 0.1 with "failed to set to width" + + set display height of {_e::*} to infinity value + assert display height of {_e::*} is 5 with "set to height to infinity" + + set display height of {_e::*} to -10 + assert display height of {_e::*} is 0 with "set to height to negative value" + + add 20 to display height of {_e::*} + assert display height of {_e::*} is 20 with "add 20 to height" + + subtract 25 from display height of {_e::*} + assert display height of {_e::*} is 0 with "subtract 25 from height" + + subtract -2.5 from display height of {_e::*} + assert display height of {_e::*} is 2.5 with "subtract -2.5 from height" + + reset display height of {_e::*} + assert display height of {_e::*} is 0 with "reset height" + + delete entities within {_e::*} From 41c61f1ce65b126f902f5ce93c99f1e3b62f1101 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 16 Jul 2024 23:58:23 -0700 Subject: [PATCH 071/104] Interpolation and Shadow tests + correct reset value for shadow strength + guard against NaN and init --- .../expressions/ExprDisplayInterpolation.java | 51 +++++++++++-------- .../expressions/ExprDisplayShadow.java | 29 +++++------ .../expressions/ExprDisplayBrightness.sk | 10 ++-- .../expressions/ExprDisplayInterpolation.sk | 39 ++++++++++++++ .../syntaxes/expressions/ExprDisplayShadow.sk | 39 ++++++++++++++ 5 files changed, 125 insertions(+), 43 deletions(-) create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprDisplayInterpolation.sk create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprDisplayShadow.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java index 6722f504525..9d7afc0c747 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java @@ -18,10 +18,6 @@ */ package org.skriptlang.skript.bukkit.displays.expressions; -import org.bukkit.entity.Display; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; @@ -35,12 +31,17 @@ import ch.njol.skript.util.Timespan; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Display Interpolation Delay/Duration") @Description({ "Returns or changes the interpolation delay/duration of displays.", - "Interpolation delay is the amount of ticks before client-side interpolation will commence.", - "Setting to 0 seconds will make it immediate." + "Interpolation duration is the amount of time a display will take to interpolate, or shift, between its current state and a new state.", + "Interpolation delay is the amount of ticks before client-side interpolation will commence." + + "Setting to 0 seconds will make it immediate.", + "Resetting either value will return it to 0." }) @Examples("set interpolation delay of the last spawned text display to 2 ticks") @RequiredPlugins("Spigot 1.19.4+") @@ -63,20 +64,35 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @Nullable public Timespan convert(Display display) { - return Timespan.fromTicks(delay ? display.getInterpolationDelay() : display.getInterpolationDuration()); + return new Timespan(Timespan.TimePeriod.TICK, delay ? display.getInterpolationDelay() : display.getInterpolationDuration()); } - @Nullable - public Class[] acceptChange(ChangeMode mode) { - return CollectionUtils.array(Timespan.class, Number.class); + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case ADD, REMOVE, SET -> CollectionUtils.array(Timespan.class, Number.class); + case RESET -> CollectionUtils.array(); + case DELETE, REMOVE_ALL -> null; + }; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - int ticks = (int) (delta == null ? 0 : (delta[0] instanceof Number ? ((Number) delta[0]).intValue() : ((Timespan) delta[0]).getTicks())); + int ticks = 0; + if (delta != null) { + if (delta[0] instanceof Number) { + double number = ((Number) delta[0]).doubleValue(); + if (Double.isInfinite(number) || Double.isNaN(number)) + return; + ticks = (int) number; + } else if (delta[0] instanceof Timespan timespan) { + ticks = (int) timespan.getTicks(); // TODO: use getAs when fixed + } else { + assert false; + } + } + switch (mode) { - case REMOVE_ALL: case REMOVE: ticks = -ticks; case ADD: @@ -90,16 +106,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } } break; - case DELETE: case RESET: - for (Display display : displays) { - if (delay) { - display.setInterpolationDelay(0); - } else { - display.setInterpolationDuration(0); - } - } - break; case SET: ticks = Math.max(0, ticks); for (Display display : displays) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java index d946bfd2ef4..fabd00d8df0 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java @@ -61,18 +61,21 @@ public Float convert(Display display) { return radius ? display.getShadowRadius() : display.getShadowStrength(); } - @Nullable - public Class[] acceptChange(ChangeMode mode) { - return CollectionUtils.array(Number.class); + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case ADD, SET, REMOVE -> CollectionUtils.array(Number.class); + case RESET -> CollectionUtils.array(); + case DELETE, REMOVE_ALL -> null; + }; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - float change = delta == null ? 0F : (int) ((Number) delta[0]).floatValue(); - change = Math.max(0F, change); + float change = delta == null ? 0F : ((Number) delta[0]).floatValue(); + if (Float.isInfinite(change) || Float.isNaN(change)) + return; switch (mode) { - case REMOVE_ALL: case REMOVE: change = -change; case ADD: @@ -86,17 +89,11 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { } } break; - case DELETE: case RESET: - for (Display display : displays) { - if (radius) { - display.setShadowRadius(0F); - } else { - display.setShadowStrength(0F); - } - } - break; + if (!radius) + change = 1; // default strength is 1 case SET: + change = Math.max(0F, change); for (Display display : displays) { if (radius) { display.setShadowRadius(change); diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk index ccb3fb7b532..97233552d85 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayBrightness.sk @@ -34,7 +34,7 @@ test "display brightness" when running minecraft "1.19.4": assert sky light override of {_e::*} is 5 with "failed setting sky light" set sky light override of {_e::*} to -1 - assert brightness override of {_e::*} is 5, 0, 5, 0, 5, 0 with "failed setting sky light" + assert brightness override of {_e::*} is 5, 0, 5, 0, 5, and 0 with "failed setting sky light" assert block light level override of {_e::*} is 5 with "failed setting sky light" assert sky light override of {_e::*} is 0 with "failed setting sky light" @@ -49,7 +49,7 @@ test "display brightness" when running minecraft "1.19.4": assert sky light override of {_e::*} is 5 with "failed setting sky light" remove 10 from sky light override of {_e::*} - assert brightness override of {_e::*} is 5, 0, 5, 0, 5, 0 with "failed adding sky light" + assert brightness override of {_e::*} is 5, 0, 5, 0, 5, and 0 with "failed adding sky light" assert block light level override of {_e::*} is 5 with "failed adding sky light" assert sky light override of {_e::*} is 0 with "failed adding sky light" @@ -66,17 +66,17 @@ test "display brightness" when running minecraft "1.19.4": assert sky light override of {_e::*} is 5 with "failed setting block light" set block light override of {_e::*} to infinity value - assert brightness override of {_e::*} is 15, 5, 15, 5, 15, 5 with "failed setting block light" + assert brightness override of {_e::*} is 15, 5, 15, 5, 15, and 5 with "failed setting block light" assert block light level override of {_e::*} is 15 with "failed setting block light" assert sky light override of {_e::*} is 5 with "failed setting block light" add 5 to block light override of {_e::*} - assert brightness override of {_e::*} is 15, 5, 15, 5, 15, 5 with "failed adding block light" + assert brightness override of {_e::*} is 15, 5, 15, 5, 15, and 5 with "failed adding block light" assert block light level override of {_e::*} is 15 with "failed adding block light" assert sky light override of {_e::*} is 5 with "failed adding block light" set block light override of {_e::*} to {_} - assert brightness override of {_e::*} is 15, 5, 15, 5, 15, 5 with "failed setting block light" + assert brightness override of {_e::*} is 15, 5, 15, 5, 15, and 5 with "failed setting block light" assert block light level override of {_e::*} is 15 with "failed setting block light" assert sky light override of {_e::*} is 5 with "failed setting block light" diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayInterpolation.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayInterpolation.sk new file mode 100644 index 00000000000..9a215e9e3bb --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayInterpolation.sk @@ -0,0 +1,39 @@ +test "display interpolation" when running minecraft "1.19.4": + + spawn block display at spawn of world "world": + set {_e::1} to entity + spawn item display at spawn of world "world": + set {_e::2} to entity + spawn text display at spawn of world "world": + set {_e::3} to entity + + assert interpolation delay of {_e::*} is 0 ticks with "default delay was not 0" + assert interpolation duration of {_e::*} is 0 seconds with "default duration was not 0" + + set interpolation delay of {_e::*} to 5 + assert interpolation delay of {_e::*} is 5 ticks with "failed to set to delay" + assert interpolation duration of {_e::*} is 0 seconds with "setting height modified duration" + + set interpolation duration of {_e::*} to 0.1 seconds + assert interpolation delay of {_e::*} is 5 ticks with "setting width modified delay" + assert interpolation duration of {_e::*} is 0.1 seconds with "failed to set to duration" + + set interpolation delay of {_e::*} to infinity value + assert interpolation delay of {_e::*} is 5 ticks with "set to delay to infinity" + + set interpolation delay of {_e::*} to -10 + assert interpolation delay of {_e::*} is 0 ticks with "set to delay to negative value" + + add 20 ticks to interpolation delay of {_e::*} + assert interpolation delay of {_e::*} is 20 ticks with "add 20 to delay" + + subtract 25 from interpolation delay of {_e::*} + assert interpolation delay of {_e::*} is 0 ticks with "subtract 25 from delay" + + subtract -2.5 from interpolation delay of {_e::*} + assert interpolation delay of {_e::*} is 2 ticks with "subtract -2.5 from delay" + + reset interpolation delay of {_e::*} + assert interpolation delay of {_e::*} is 0 seconds with "reset delay" + + delete entities within {_e::*} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayShadow.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayShadow.sk new file mode 100644 index 00000000000..ad2d9ef9088 --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayShadow.sk @@ -0,0 +1,39 @@ +test "display radius/strength" when running minecraft "1.19": + + spawn block display at spawn of world "world": + set {_e::1} to entity + spawn item display at spawn of world "world": + set {_e::2} to entity + spawn text display at spawn of world "world": + set {_e::3} to entity + + assert shadow strength of {_e::*} is 1 with "default strength was not 0" + assert shadow radius of {_e::*} is 0 with "default radius was not 0" + + set shadow radius of {_e::*} to 5 + assert shadow radius of {_e::*} is 5 with "failed to set to radius" + assert shadow strength of {_e::*} is 1 with "setting radius modified strength" + + set shadow strength of {_e::*} to 0.1 + assert shadow radius of {_e::*} is 5 with "setting strength modified radius" + assert shadow strength of {_e::*} is 0.1 with "failed to set to strength" + + set shadow radius of {_e::*} to infinity value + assert shadow radius of {_e::*} is 5 with "set to radius to infinity" + + set shadow radius of {_e::*} to -10 + assert shadow radius of {_e::*} is 0 with "set to radius to negative value" + + add 20 to shadow radius of {_e::*} + assert shadow radius of {_e::*} is 20 with "add 20 to radius" + + subtract 25 from shadow radius of {_e::*} + assert shadow radius of {_e::*} is 0 with "subtract 25 from radius" + + subtract -2.5 from shadow radius of {_e::*} + assert shadow radius of {_e::*} is 2.5 with "subtract -2.5 from radius" + + reset shadow radius of {_e::*} + assert shadow radius of {_e::*} is 0 with "reset radius" + + delete entities within {_e::*} From ed6208c7297b8b186f0ae06720133d9db61049f3 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:08:46 -0700 Subject: [PATCH 072/104] Tests and cleanup for teleportation duration, remove number from changers for tp duration and interpolation delay/duration --- .../expressions/ExprDisplayInterpolation.java | 18 +++-------- .../ExprDisplayTeleportDuration.java | 32 +++++++++---------- .../expressions/ExprDisplayInterpolation.sk | 14 +++----- .../ExprDisplayTeleportationDuration.sk | 30 +++++++++++++++++ 4 files changed, 54 insertions(+), 40 deletions(-) create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprDisplayTeleportationDuration.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java index 9d7afc0c747..67353c47087 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java @@ -41,7 +41,7 @@ "Interpolation duration is the amount of time a display will take to interpolate, or shift, between its current state and a new state.", "Interpolation delay is the amount of ticks before client-side interpolation will commence." + "Setting to 0 seconds will make it immediate.", - "Resetting either value will return it to 0." + "Resetting either value will return that value to 0." }) @Examples("set interpolation delay of the last spawned text display to 2 ticks") @RequiredPlugins("Spigot 1.19.4+") @@ -69,7 +69,7 @@ public Timespan convert(Display display) { public Class @Nullable [] acceptChange(ChangeMode mode) { return switch (mode) { - case ADD, REMOVE, SET -> CollectionUtils.array(Timespan.class, Number.class); + case ADD, REMOVE, SET -> CollectionUtils.array(Timespan.class); case RESET -> CollectionUtils.array(); case DELETE, REMOVE_ALL -> null; }; @@ -79,18 +79,8 @@ public Timespan convert(Display display) { public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); int ticks = 0; - if (delta != null) { - if (delta[0] instanceof Number) { - double number = ((Number) delta[0]).doubleValue(); - if (Double.isInfinite(number) || Double.isNaN(number)) - return; - ticks = (int) number; - } else if (delta[0] instanceof Timespan timespan) { - ticks = (int) timespan.getTicks(); // TODO: use getAs when fixed - } else { - assert false; - } - } + if (delta != null) + ticks = (int) ((Timespan) delta[0]).getTicks(); // TODO: use getAs when fixed switch (mode) { case REMOVE: diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java index 439504e8967..b486121926e 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java @@ -27,8 +27,9 @@ import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.util.Timespan; +import ch.njol.skript.util.Timespan.TimePeriod; +import ch.njol.util.Math2; import ch.njol.util.coll.CollectionUtils; - import org.bukkit.entity.Display; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; @@ -42,8 +43,9 @@ }) @Examples({ "set teleport delay of the last spawned text display to 2 ticks", + "teleport last spawned text display to {_location}", "wait 2 ticks", - "message \"display entity has arived at location\"" + "message \"display entity has arrived at %{_location}%\"" }) @RequiredPlugins("Spigot 1.20.4+") @Since("INSERT VERSION") @@ -51,41 +53,39 @@ public class ExprDisplayTeleportDuration extends SimplePropertyExpression[] acceptChange(ChangeMode mode) { - return CollectionUtils.array(Timespan.class, Number.class); + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case ADD, REMOVE, SET -> CollectionUtils.array(Timespan.class); + case RESET -> CollectionUtils.array(); + case DELETE, REMOVE_ALL -> null; + }; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - int ticks = (int) (delta == null ? 0 : (delta[0] instanceof Number ? ((Number) delta[0]).intValue() : ((Timespan) delta[0]).getTicks())); + int ticks = (int) (delta == null ? 0 : ((Timespan) delta[0]).getTicks()); // TODO: use getAs once fixed switch (mode) { - case REMOVE_ALL: case REMOVE: ticks = -ticks; case ADD: for (Display display : displays) { - int value = Math.max(0, Math.min(59, display.getTeleportDuration() + ticks)); + int value = Math2.fit(0, display.getTeleportDuration() + ticks, 59); display.setTeleportDuration(value); } break; - case DELETE: case RESET: - for (Display display : displays) - display.setTeleportDuration(0); - break; case SET: - ticks = Math.max(0, Math.min(59, ticks)); + ticks = Math2.fit(0, ticks, 59); for (Display display : displays) display.setTeleportDuration(ticks); break; diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayInterpolation.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayInterpolation.sk index 9a215e9e3bb..4f5061baf68 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprDisplayInterpolation.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayInterpolation.sk @@ -10,7 +10,7 @@ test "display interpolation" when running minecraft "1.19.4": assert interpolation delay of {_e::*} is 0 ticks with "default delay was not 0" assert interpolation duration of {_e::*} is 0 seconds with "default duration was not 0" - set interpolation delay of {_e::*} to 5 + set interpolation delay of {_e::*} to 5 ticks assert interpolation delay of {_e::*} is 5 ticks with "failed to set to delay" assert interpolation duration of {_e::*} is 0 seconds with "setting height modified duration" @@ -18,21 +18,15 @@ test "display interpolation" when running minecraft "1.19.4": assert interpolation delay of {_e::*} is 5 ticks with "setting width modified delay" assert interpolation duration of {_e::*} is 0.1 seconds with "failed to set to duration" - set interpolation delay of {_e::*} to infinity value - assert interpolation delay of {_e::*} is 5 ticks with "set to delay to infinity" - - set interpolation delay of {_e::*} to -10 - assert interpolation delay of {_e::*} is 0 ticks with "set to delay to negative value" + set interpolation delay of {_e::*} to 0 ticks + assert interpolation delay of {_e::*} is 0 ticks with "set to delay to 0 value" add 20 ticks to interpolation delay of {_e::*} assert interpolation delay of {_e::*} is 20 ticks with "add 20 to delay" - subtract 25 from interpolation delay of {_e::*} + subtract 25 ticks from interpolation delay of {_e::*} assert interpolation delay of {_e::*} is 0 ticks with "subtract 25 from delay" - subtract -2.5 from interpolation delay of {_e::*} - assert interpolation delay of {_e::*} is 2 ticks with "subtract -2.5 from delay" - reset interpolation delay of {_e::*} assert interpolation delay of {_e::*} is 0 seconds with "reset delay" diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayTeleportationDuration.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayTeleportationDuration.sk new file mode 100644 index 00000000000..5c08faf3a2f --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayTeleportationDuration.sk @@ -0,0 +1,30 @@ +test "display teleportation duration" when running minecraft "1.19.4": + + spawn block display at spawn of world "world": + set {_e::1} to entity + spawn item display at spawn of world "world": + set {_e::2} to entity + spawn text display at spawn of world "world": + set {_e::3} to entity + + assert teleportation duration of {_e::*} is 0 ticks with "default duration was not 0" + + set teleportation duration of {_e::*} to 5 ticks + assert teleportation duration of {_e::*} is 5 ticks with "failed to set to duration" + + set interpolation duration of {_e::*} to 0.1 seconds + assert teleportation duration of {_e::*} is 5 ticks with "setting width modified duration" + + set teleportation duration of {_e::*} to 0 ticks + assert teleportation duration of {_e::*} is 0 ticks with "set to duration to 0 value" + + add 20 ticks to teleportation duration of {_e::*} + assert teleportation duration of {_e::*} is 20 ticks with "add 20 to duration" + + subtract 25 ticks from teleportation duration of {_e::*} + assert teleportation duration of {_e::*} is 0 ticks with "subtract 25 from duration" + + reset teleportation duration of {_e::*} + assert teleportation duration of {_e::*} is 0 seconds with "reset duration" + + delete entities within {_e::*} From d4e1c8dc8075e74bfa9a2d7438f97c444670532f Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Wed, 17 Jul 2024 20:54:57 -0700 Subject: [PATCH 073/104] Transformation tests, cleanup, bugfixes. Removed unnecessary Joml utils class. --- .../ExprDisplayTransformationRotation.java | 12 ++-- ...DisplayTransformationScaleTranslation.java | 20 +++---- .../expressions/ExprRotateQuaternion.java | 13 ++-- .../skript/bukkit/util/JomlBukkitUtils.java | 46 --------------- .../expressions/ExprDisplayTransformation.sk | 59 +++++++++++++++++++ 5 files changed, 78 insertions(+), 72 deletions(-) delete mode 100644 src/main/java/org/skriptlang/skript/bukkit/util/JomlBukkitUtils.java create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprDisplayTransformation.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java index 1c357163374..b0086e74be1 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java @@ -60,14 +60,12 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } @Override - @Nullable - public Quaternionf convert(Display display) { + public @Nullable Quaternionf convert(Display display) { Transformation transformation = display.getTransformation(); return left ? transformation.getLeftRotation() : transformation.getRightRotation(); } - @Nullable - public Class[] acceptChange(ChangeMode mode) { + public Class @Nullable [] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET) return CollectionUtils.array(Quaternionf.class); if (mode == ChangeMode.RESET) @@ -79,15 +77,15 @@ public Class[] acceptChange(ChangeMode mode) { public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Quaternionf quaternion = null; if (mode == ChangeMode.RESET) - quaternion = new Quaternionf(1, 0, 0, 0); + quaternion = new Quaternionf(0, 0, 0, 1); if (delta != null) { quaternion = (Quaternionf) delta[0]; } - if (quaternion == null) + if (quaternion == null || !quaternion.isFinite()) return; for (Display display : getExpr().getArray(event)) { Transformation transformation = display.getTransformation(); - Transformation change = null; + Transformation change; if (left) { change = new Transformation(transformation.getTranslation(), quaternion, transformation.getScale(), transformation.getRightRotation()); } else { diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java index e8e97bb4c2b..ec9e11214db 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java @@ -30,14 +30,12 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; - import org.bukkit.entity.Display; import org.bukkit.event.Event; import org.bukkit.util.Transformation; import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; -import org.skriptlang.skript.bukkit.util.JomlBukkitUtils; @Name("Display Transformation Scale/Translation") @Description("Returns or changes the transformation scale or translation of displays.") @@ -48,7 +46,7 @@ public class ExprDisplayTransformationScaleTranslation extends SimplePropertyExp static { if (Skript.isRunningMinecraft(1, 19, 4)) - register(ExprDisplayTransformationScaleTranslation.class, Vector.class, "[transformation] (:scale|translation)", "displays"); + register(ExprDisplayTransformationScaleTranslation.class, Vector.class, "(display|[display] transformation) (:scale|translation)", "displays"); } private boolean scale; @@ -60,14 +58,12 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } @Override - @Nullable - public Vector convert(Display display) { + public @Nullable Vector convert(Display display) { Transformation transformation = display.getTransformation(); - return JomlBukkitUtils.toBukkitVector(scale ? transformation.getScale() : transformation.getTranslation()); + return Vector.fromJOML(scale ? transformation.getScale() : transformation.getTranslation()); } - @Nullable - public Class[] acceptChange(ChangeMode mode) { + public Class @Nullable [] acceptChange(ChangeMode mode) { if (mode == ChangeMode.SET) return CollectionUtils.array(Vector.class); if (mode == ChangeMode.RESET) @@ -76,13 +72,13 @@ public Class[] acceptChange(ChangeMode mode) { } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Vector3f vector = null; if (mode == ChangeMode.RESET) - vector = new Vector3f(1F, 1F, 1F); + vector = scale ? new Vector3f(1F, 1F, 1F) : new Vector3f(0F, 0F, 0F); if (delta != null) - vector = JomlBukkitUtils.toVector((Vector) delta[0]); - if (vector == null) + vector = ((Vector) delta[0]).toVector3f(); + if (vector == null || !vector.isFinite()) return; for (Display display : getExpr().getArray(event)) { Transformation transformation = display.getTransformation(); diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java index 8cd7b30aeab..e36903da9d7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java @@ -23,7 +23,6 @@ import org.eclipse.jdt.annotation.Nullable; import org.joml.Quaternionf; import org.joml.Vector3f; -import org.skriptlang.skript.bukkit.util.JomlBukkitUtils; import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; @@ -90,8 +89,8 @@ protected Object[] get(Event event) { .map(object -> { if (object instanceof Quaternionf) { return ((Quaternionf) object).rotateX(degrees); - } else if (object instanceof Vector3f) { - return JomlBukkitUtils.toVector(((Vector) object)).rotateX(degrees); + } else if (object instanceof Vector) { + return ((Vector) object).toVector3f().rotateX(degrees); } return null; }) @@ -101,8 +100,8 @@ protected Object[] get(Event event) { .map(object -> { if (object instanceof Quaternionf) { return ((Quaternionf) object).rotateY(degrees); - } else if (object instanceof Vector3f) { - return JomlBukkitUtils.toVector(((Vector) object)).rotateY(degrees); + } else if (object instanceof Vector) { + return ((Vector) object).toVector3f().rotateY(degrees); } return null; }) @@ -112,8 +111,8 @@ protected Object[] get(Event event) { .map(object -> { if (object instanceof Quaternionf) { return ((Quaternionf) object).rotateZ(degrees); - } else if (object instanceof Vector3f) { - return JomlBukkitUtils.toVector(((Vector) object)).rotateZ(degrees); + } else if (object instanceof Vector) { + return ((Vector) object).toVector3f().rotateZ(degrees); } return null; }) diff --git a/src/main/java/org/skriptlang/skript/bukkit/util/JomlBukkitUtils.java b/src/main/java/org/skriptlang/skript/bukkit/util/JomlBukkitUtils.java deleted file mode 100644 index 21b488bf09d..00000000000 --- a/src/main/java/org/skriptlang/skript/bukkit/util/JomlBukkitUtils.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ -package org.skriptlang.skript.bukkit.util; - -import org.bukkit.util.Vector; -import org.joml.Vector3f; - -public class JomlBukkitUtils { - - /** - * Converts Joml {@link Vector3f} to Bukkit {@link Vector} - * - * @param vector {@link Vector3f} - * @return converted vector as Bukkit {@link Vector} - */ - public static Vector toBukkitVector(Vector3f vector) { - return new Vector(vector.x, vector.y, vector.z); - } - - /** - * Converts Bukkit {@link Vector} to Joml {@link Vector3f} - * - * @param vector {@link Vector} - * @return converted vector as Joml {@link Vector3f} - */ - public static Vector3f toVector(Vector vector) { - return new Vector3f((float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); - } - -} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayTransformation.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayTransformation.sk new file mode 100644 index 00000000000..4eaac92da0b --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayTransformation.sk @@ -0,0 +1,59 @@ +test "display transformation rotations" when running minecraft "1.19.4": + + spawn block display at spawn of world "world": + set {_e::1} to entity + spawn item display at spawn of world "world": + set {_e::2} to entity + spawn text display at spawn of world "world": + set {_e::3} to entity + + assert left rotation of {_e::*} is quaternion(1, 0, 0, 0) with "default left rotation was wrong" + assert right rotation of {_e::*} is quaternion(1, 0, 0, 0) with "default right rotation was wrong" + + set left rotation of {_e::*} to quaternion(1, 2, 3, 4) + assert left rotation of {_e::*} is quaternion(1, 2, 3, 4) with "failed to set left rotation" + assert right rotation of {_e::*} is quaternion(1, 0, 0, 0) with "setting left affected right rotation" + + set left rotation of {_e::*} to quaternion(1, infinity value, 3, 4) + assert left rotation of {_e::*} is quaternion(1, 2, 3, 4) with "set left rotation to invalid value" + + set right rotation of {_e::*} to axisAngle(45, vector(0, 0, 1)) + assert left rotation of {_e::*} is quaternion(1, 2, 3, 4) with "setting right affected left rotation" + assert right rotation of {_e::*} is quaternion(0.923879504, 0, 0, 0.382683455) with "failed to set right to an axisangle" + + reset left rotation of {_e::*} + assert left rotation of {_e::*} is quaternion(1, 0, 0, 0) with "failed to reset left" + + delete entities within {_e::*} + + +test "display transformation translation / scales" when running minecraft "1.19.4": + spawn block display at spawn of world "world": + set {_e::1} to entity + spawn item display at spawn of world "world": + set {_e::2} to entity + spawn text display at spawn of world "world": + set {_e::3} to entity + + assert display scale of {_e::*} is vector(1,1,1) with "default display scale was wrong" + assert display translation of {_e::*} is vector(0,0,0) with "default display translation was wrong" + + set display scale of {_e::*} to vector(1,2,1) + assert display scale of {_e::*} is vector(1,2,1) with "failed to set display scale" + assert display translation of {_e::*} is vector(0,0,0) with "setting display scale affected display translation" + + set display translation of {_e::*} to vector(1,-2,1) + assert display scale of {_e::*} is vector(1,2,1) with "setting display translation affected display scale" + assert display translation of {_e::*} is vector(1,-2,1) with "failed to set display translation" + + set display scale of {_e::*} to vector(NaN value, 0, 0) + assert display scale of {_e::*} is vector(1,2,1) with "set display scale to invalid value" + + reset display scale of {_e::*} + assert display scale of {_e::*} is vector(1,1,1) with "failed to reset display scale" + + reset display translation of {_e::*} + assert display translation of {_e::*} is vector(0,0,0) with "failed to reset display scale" + + + delete entities within {_e::*} From 9148441f968db747ab193f51d1db5f43b5f90752 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Wed, 17 Jul 2024 22:01:34 -0700 Subject: [PATCH 074/104] wrong version check for teleportation duration --- .../syntaxes/expressions/ExprDisplayTeleportationDuration.sk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayTeleportationDuration.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayTeleportationDuration.sk index 5c08faf3a2f..9f57c210169 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprDisplayTeleportationDuration.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayTeleportationDuration.sk @@ -1,4 +1,4 @@ -test "display teleportation duration" when running minecraft "1.19.4": +test "display teleportation duration" when running minecraft "1.20.4": spawn block display at spawn of world "world": set {_e::1} to entity From 655550bad0fda3aba14ef299fc426b8e5fbee42f Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sun, 21 Jul 2024 14:46:01 -0700 Subject: [PATCH 075/104] Display view range tests, cleanup, finite guard, switch to Timespan#getAs --- .../expressions/ExprDisplayInterpolation.java | 3 +- .../ExprDisplayTeleportDuration.java | 2 +- .../expressions/ExprDisplayViewRange.java | 28 +++++++++---------- .../expressions/ExprDisplayViewRange.sk | 27 ++++++++++++++++++ 4 files changed, 44 insertions(+), 16 deletions(-) create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprDisplayViewRange.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java index 67353c47087..843f403cfc4 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java @@ -29,6 +29,7 @@ import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.util.Timespan; +import ch.njol.skript.util.Timespan.TimePeriod; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; import org.bukkit.entity.Display; @@ -80,7 +81,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); int ticks = 0; if (delta != null) - ticks = (int) ((Timespan) delta[0]).getTicks(); // TODO: use getAs when fixed + ticks = (int) ((Timespan) delta[0]).getAs(TimePeriod.TICK); switch (mode) { case REMOVE: diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java index b486121926e..7f99dfdf26b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java @@ -73,7 +73,7 @@ public Timespan convert(Display display) { @Override public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - int ticks = (int) (delta == null ? 0 : ((Timespan) delta[0]).getTicks()); // TODO: use getAs once fixed + int ticks = (int) (delta == null ? 0 : ((Timespan) delta[0]).getAs(TimePeriod.TICK)); switch (mode) { case REMOVE: ticks = -ticks; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java index 885d515745a..7a15a39e66c 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java @@ -35,7 +35,8 @@ @Name("Display View Range") @Description({ "Returns or changes the view range of displays.", - "Default value is 1.0. This value is then multiplied by 64 and the player's entity view distance setting to determine the actual range." + "Default value is 1.0. This value is then multiplied by 64 and the player's entity view distance setting to determine the actual range.", + "For example, a player with 150% entity view distance will see a block display with a view range of 1.2 at 1.2 * 64 * 150% = 115.2 blocks away." }) @Examples("set view range of the last spawned text display to 2.9") @RequiredPlugins("Spigot 1.19.4+") @@ -48,23 +49,25 @@ public class ExprDisplayViewRange extends SimplePropertyExpression[] acceptChange(ChangeMode mode) { - return CollectionUtils.array(Number.class); + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case ADD, SET, REMOVE -> CollectionUtils.array(Number.class); + case RESET -> CollectionUtils.array(); + case DELETE, REMOVE_ALL -> null; + }; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - float change = delta == null ? 0F : (int) ((Number) delta[0]).floatValue(); - change = Math.max(0F, change); + float change = delta == null ? 1F : ((Number) delta[0]).floatValue(); + if (Float.isNaN(change) || Float.isInfinite(change)) + return; switch (mode) { - case REMOVE_ALL: case REMOVE: change = -change; case ADD: @@ -73,12 +76,9 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { display.setViewRange(value); } break; - case DELETE: case RESET: - for (Display display : displays) - display.setViewRange(1.0F); - break; case SET: + change = Math.max(0F, change); for (Display display : displays) display.setViewRange(change); break; diff --git a/src/test/skript/tests/syntaxes/expressions/ExprDisplayViewRange.sk b/src/test/skript/tests/syntaxes/expressions/ExprDisplayViewRange.sk new file mode 100644 index 00000000000..5428dd8b8ba --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprDisplayViewRange.sk @@ -0,0 +1,27 @@ +test "display view range" when running minecraft "1.19": + + spawn block display at spawn of world "world": + set {_e::1} to entity + spawn item display at spawn of world "world": + set {_e::2} to entity + spawn text display at spawn of world "world": + set {_e::3} to entity + + assert view range of {_e::*} is 1 with "default view range is incorrect" + + set view range of {_e::*} to 0 + assert view range of {_e::*} is 0 with "failed to set view range" + + add 20.1 to view range of {_e::*} + assert view range of {_e::*} is 20.1 with "failed to add to view range" + + remove 50.75 from view range of {_e::*} + assert view range of {_e::*} is 0 with "failed to remove from view range" + + reset view range of {_e::*} + assert view range of {_e::*} is 1 with "failed to reset view range" + + set view range of {_e::*} to NaN value + assert view range of {_e::*} is 1 with "set view range to NaN value changed value" + + delete entities within {_e::*} From 2846e4b5a7a8b2dd944f6018c0d1772b59f830b3 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Mon, 22 Jul 2024 18:56:30 -0700 Subject: [PATCH 076/104] strip licenses --- .../expressions/ExprDisplayBillboard.java | 18 ------------------ .../expressions/ExprDisplayBrightness.java | 18 ------------------ .../expressions/ExprDisplayGlowOverride.java | 18 ------------------ .../expressions/ExprDisplayHeightWidth.java | 18 ------------------ .../expressions/ExprDisplayInterpolation.java | 18 ------------------ .../expressions/ExprDisplayShadow.java | 18 ------------------ .../ExprDisplayTeleportDuration.java | 18 ------------------ .../ExprDisplayTransformationRotation.java | 18 ------------------ ...rDisplayTransformationScaleTranslation.java | 18 ------------------ .../expressions/ExprDisplayViewRange.java | 18 ------------------ .../displays/expressions/package-info.java | 18 ------------------ .../item/ExprItemDisplayTransform.java | 18 ------------------ .../displays/item/ExprItemOfItemDisplay.java | 18 ------------------ .../bukkit/displays/item/package-info.java | 18 ------------------ .../text/ExprTextDisplayAlignment.java | 18 ------------------ .../text/ExprTextDisplayLineWidth.java | 18 ------------------ .../displays/text/ExprTextDisplayOpacity.java | 18 ------------------ .../bukkit/displays/text/package-info.java | 18 ------------------ .../misc/expressions/ExprItemFrameSlot.java | 18 ------------------ .../misc/expressions/ExprRotateQuaternion.java | 18 ------------------ .../bukkit/misc/expressions/ExprTextOf.java | 18 ------------------ 21 files changed, 378 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java index b5d9bb9274e..de789e68339 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java index 5d0bfa37c84..8563a4d2932 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import ch.njol.skript.Skript; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java index c2fbe4d8399..c163b6f2381 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java index fe554de8ed6..4cf64a35232 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java index 843f403cfc4..ec2440a2d06 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import ch.njol.skript.Skript; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java index fabd00d8df0..3709cfc76b2 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java index 7f99dfdf26b..f28ffd932e5 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import ch.njol.skript.Skript; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java index b0086e74be1..369be5b8012 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import ch.njol.skript.Skript; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java index ec9e11214db..c3e5a0485b0 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import ch.njol.skript.Skript; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java index 7a15a39e66c..953ac72e697 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.expressions; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java index be8eff2966a..6c8b5e1eeaa 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) package org.skriptlang.skript.bukkit.displays.expressions; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java index 53bf4eb993a..d4af4ed823f 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.item; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java index 800ccb63f3a..210e43875f7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.item; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java index 1255cb614e2..86afaa43700 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) package org.skriptlang.skript.bukkit.displays.item; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java index 77194c843e8..f3990e3c776 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.text; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java index 5fde4869ca5..783929be9c7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.text; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java index 19bc6c91d5a..c1aea4cf636 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.displays.text; import org.bukkit.entity.Display; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java index 6ce8a870a02..f6430661eed 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) package org.skriptlang.skript.bukkit.displays.text; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemFrameSlot.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemFrameSlot.java index 2179e00810f..a5a5708ce26 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemFrameSlot.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemFrameSlot.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.misc.expressions; import org.bukkit.entity.Entity; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java index e36903da9d7..4fafd254672 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.misc.expressions; import org.bukkit.event.Event; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java index 22090ac4e17..c2f674dddb7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package org.skriptlang.skript.bukkit.misc.expressions; import org.bukkit.entity.TextDisplay; From 949b454edc1344b8397b1836d581c190d9ab06e0 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Mon, 22 Jul 2024 19:33:30 -0700 Subject: [PATCH 077/104] cleanup, tests for ItemDisplayTransfrom. Fixed default from being FIXED to NONE, changed lang for NONE to be no transform to avoid confusion --- .../item/ExprItemDisplayTransform.java | 43 ++++++++----------- src/main/resources/lang/default.lang | 14 +++--- src/test/skript/tests/misc/displays.sk | 2 +- .../expressions/ExprItemDisplayTransform.sk | 40 +++++++++++++++++ 4 files changed, 65 insertions(+), 34 deletions(-) create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprItemDisplayTransform.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java index d4af4ed823f..e7dc9399cd1 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java @@ -18,47 +18,38 @@ @Name("Item Display Transform") @Description("Returns or changes the item display transform of item displays.") -@Examples("set the item transform of the last spawned item display to fixed # Reset to default") +@Examples("set the item transform of the last spawned item display to no transform # Reset to default") @RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprItemDisplayTransform extends SimplePropertyExpression { static { if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprItemDisplayTransform.class, ItemDisplayTransform.class, "[item] [display] transform", "displays"); + registerDefault(ExprItemDisplayTransform.class, ItemDisplayTransform.class, "item [display] transform", "displays"); } @Override - @Nullable - public ItemDisplayTransform convert(Display display) { - if (!(display instanceof ItemDisplay)) - return null; - return ((ItemDisplay) display).getItemDisplayTransform(); + public @Nullable ItemDisplayTransform convert(Display display) { + if (display instanceof ItemDisplay itemDisplay) + return itemDisplay.getItemDisplayTransform(); + return null; } - @Nullable - public Class[] acceptChange(ChangeMode mode) { - switch (mode) { - case ADD: - case REMOVE: - case REMOVE_ALL: - break; - case RESET: - case DELETE: - return CollectionUtils.array(); - case SET: - return CollectionUtils.array(ItemDisplayTransform.class); - } - return null; + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case RESET -> CollectionUtils.array(); + case SET -> CollectionUtils.array(ItemDisplayTransform.class); + default -> null; + }; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - ItemDisplayTransform transform = mode == ChangeMode.SET ? (ItemDisplayTransform) delta[0] : ItemDisplayTransform.FIXED; + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + //noinspection ConstantConditions + ItemDisplayTransform transform = mode == ChangeMode.SET ? (ItemDisplayTransform) delta[0] : ItemDisplayTransform.NONE; for (Display display : getExpr().getArray(event)) { - if (!(display instanceof ItemDisplay)) - continue; - ((ItemDisplay) display).setItemDisplayTransform(transform); + if (display instanceof ItemDisplay itemDisplay) + itemDisplay.setItemDisplayTransform(transform); } } diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 553fa9238c0..0f5e3df24e1 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -2275,16 +2275,16 @@ transform reasons: # -- Display Billboards -- billboards: - center: center, middle + center: center, middle, center pivot fixed: fixed - horizontal: horizontal - vertical: vertical + horizontal: horizontal, horizontal pivot + vertical: vertical, vertical pivot # -- Text Display Alignments -- text alignments: - center: center, middle, centered text, centered, center aligned - left: left, left aligned - right: right, right aligned + center: centered, center aligned, middle aligned + left: left aligned + right: right aligned # -- Item Display Transforms -- item display transforms: @@ -2294,7 +2294,7 @@ item display transforms: ground: ground, the ground gui: gui, menu head: head - none: none, nothing + none: no transform thirdperson_lefthand: third person left handed, third person left hand, left handed in third person thirdperson_righthand: third person right handed, third person right hand, right handed in third person diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index c79ca93637b..6c0c345daa7 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -11,7 +11,7 @@ test "spawn displays" when running minecraft "1.19.4": set {_display} to event-display assert block data of display within {_display} is grass_block[snowy=true] with "failed to compare block display block data" spawn an item display of a diamond sword of sharpness at spawn of world "world": - assert item transform of event-display is none with "item transform was not none" + assert item transform of event-display is no transform with "item transform was not default" set item transform of event-display to head assert item transform of event-display is head with "failed to set item transform to head" assert item of event-display is a diamond sword of sharpness with "failed to compare against the item of the display %item of display%" diff --git a/src/test/skript/tests/syntaxes/expressions/ExprItemDisplayTransform.sk b/src/test/skript/tests/syntaxes/expressions/ExprItemDisplayTransform.sk new file mode 100644 index 00000000000..70e676e7b0c --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprItemDisplayTransform.sk @@ -0,0 +1,40 @@ +test "item display transforms" when running minecraft "1.19.4": + + spawn block display at spawn of world "world": + set {_bd} to entity + + assert item transform of {_bd} is not set with "block display has item transform" + set item transform of {_bd} to fixed + assert item transform of {_bd} is not set with "block display has item transform" + reset item transform of {_bd} + assert item transform of {_bd} is not set with "block display has item transform" + + delete entity within {_bd} + spawn item display of a diamond sword at spawn of world "world": + set {_id} to entity + + assert item transform of {_id} is no transform with "item display has wrong default transform" + + set item transform of {_id} to third person left hand + assert item transform of {_id} is third person left hand with "failed to set item transform" + set item transform of {_id} to third person right hand + assert item transform of {_id} is third person right hand with "failed to set item transform" + set item transform of {_id} to first person left hand + assert item transform of {_id} is first person left hand with "failed to set item transform" + set item transform of {_id} to first person right hand + assert item transform of {_id} is first person right hand with "failed to set item transform" + set item transform of {_id} to no transform + assert item transform of {_id} is no transform with "failed to set item transform" + set item transform of {_id} to fixed + assert item transform of {_id} is fixed with "failed to set item transform" + set item transform of {_id} to head + assert item transform of {_id} is head with "failed to set item transform" + set item transform of {_id} to gui + assert item transform of {_id} is gui with "failed to set item transform" + set item transform of {_id} to ground + assert item transform of {_id} is ground with "failed to set item transform" + + reset item transform of {_id} + assert item transform of {_id} is no transform with "failed to reset item transform" + + delete entity within {_id} From c92f75ac63bae5a298087ea3974554cfb64b41ef Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Mon, 22 Jul 2024 19:59:49 -0700 Subject: [PATCH 078/104] Remove ItemOfItemDisplay (redundant), cleanup/test the text display expressions. --- .../displays/item/ExprItemOfItemDisplay.java | 74 ------------------- .../text/ExprTextDisplayAlignment.java | 34 ++++----- .../text/ExprTextDisplayLineWidth.java | 35 +++++---- .../displays/text/ExprTextDisplayOpacity.java | 57 ++++++-------- .../expressions/ExprTextDisplayAlignment.sk | 24 ++++++ .../expressions/ExprTextDisplayLineWidth.sk | 33 +++++++++ .../expressions/ExprTextDisplayOpacity.sk | 33 +++++++++ 7 files changed, 143 insertions(+), 147 deletions(-) delete mode 100644 src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprTextDisplayAlignment.sk create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprTextDisplayLineWidth.sk create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprTextDisplayOpacity.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java deleted file mode 100644 index 210e43875f7..00000000000 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemOfItemDisplay.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.skriptlang.skript.bukkit.displays.item; - -import org.bukkit.entity.Display; -import org.bukkit.entity.ItemDisplay; -import org.bukkit.event.Event; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; -import ch.njol.skript.classes.Changer.ChangeMode; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Examples; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; -import ch.njol.skript.doc.Since; -import ch.njol.skript.expressions.base.SimplePropertyExpression; -import ch.njol.util.coll.CollectionUtils; - -@Name("Item Display Item") -@Description("Returns or changes the itemstack of item displays.") -@Examples("set the display item of the last spawned item display to a diamond sword") -@RequiredPlugins("Spigot 1.19.4+") -@Since("INSERT VERSION") -public class ExprItemOfItemDisplay extends SimplePropertyExpression { - - static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprItemOfItemDisplay.class, ItemStack.class, "display item[stack]", "displays"); - } - - @Override - @Nullable - public ItemStack convert(Display display) { - if (!(display instanceof ItemDisplay)) - return null; - return ((ItemDisplay) display).getItemStack(); - } - - @Nullable - public Class[] acceptChange(ChangeMode mode) { - switch (mode) { - case ADD: - case RESET: - case REMOVE: - case REMOVE_ALL: - break; - case DELETE: - return CollectionUtils.array(); - case SET: - return CollectionUtils.array(ItemStack.class); - } - return null; - } - - @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { - ItemStack item = mode == ChangeMode.DELETE ? null : (ItemStack) delta[0]; - for (Display display : getExpr().getArray(event)) { - if (display instanceof ItemDisplay) - ((ItemDisplay) display).setItemStack(item); - } - } - - @Override - public Class getReturnType() { - return ItemStack.class; - } - - @Override - protected String getPropertyName() { - return "display item"; - } - -} diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java index f3990e3c776..f00000febd7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java @@ -31,34 +31,26 @@ public class ExprTextDisplayAlignment extends SimplePropertyExpression[] acceptChange(ChangeMode mode) { - switch (mode) { - case ADD: - case DELETE: - case REMOVE: - case REMOVE_ALL: - break; - case RESET: - return CollectionUtils.array(); - case SET: - return CollectionUtils.array(TextAlignment.class); - } - return null; + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case RESET -> CollectionUtils.array(); + case SET -> CollectionUtils.array(TextAlignment.class); + default -> null; + }; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + //noinspection ConstantConditions TextAlignment alignment = mode == ChangeMode.RESET ? TextAlignment.CENTER : (TextAlignment) delta[0]; for (Display display : getExpr().getArray(event)) { - if (!(display instanceof TextDisplay)) - continue; - ((TextDisplay)display).setAlignment(alignment); + if (display instanceof TextDisplay textDisplay) + textDisplay.setAlignment(alignment); } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java index 783929be9c7..a436064602a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java @@ -30,41 +30,40 @@ public class ExprTextDisplayLineWidth extends SimplePropertyExpression[] acceptChange(ChangeMode mode) { - return CollectionUtils.array(Number.class); + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case ADD, REMOVE, SET -> CollectionUtils.array(Number.class); + case RESET -> CollectionUtils.array(); + default -> null; + }; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); int change = delta == null ? 200 : ((Number) delta[0]).intValue(); - change = Math.max(0, change); switch (mode) { - case REMOVE_ALL: case REMOVE: change = -change; case ADD: for (Display display : displays) { - if (!(display instanceof TextDisplay)) - continue; - TextDisplay textDisplay = (TextDisplay) display; - int value = Math.max(0, textDisplay.getLineWidth() + change); - textDisplay.setLineWidth(value); + if (display instanceof TextDisplay textDisplay) { + int value = Math.max(0, textDisplay.getLineWidth() + change); + textDisplay.setLineWidth(value); + } } break; - case DELETE: case RESET: case SET: + change = Math.max(0, change); for (Display display : displays) { - if (!(display instanceof TextDisplay)) - continue; - ((TextDisplay) display).setLineWidth(change); + if (display instanceof TextDisplay textDisplay) + textDisplay.setLineWidth(change); } break; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java index c1aea4cf636..ba32a311e44 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java @@ -1,10 +1,5 @@ package org.skriptlang.skript.bukkit.displays.text; -import org.bukkit.entity.Display; -import org.bukkit.entity.TextDisplay; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; @@ -13,7 +8,12 @@ import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.Math2; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Text Display Opacity") @Description({ @@ -33,52 +33,41 @@ public class ExprTextDisplayOpacity extends SimplePropertyExpression[] acceptChange(ChangeMode mode) { - switch (mode) { - case ADD: - case DELETE: - case REMOVE: - case RESET: - case SET: - return CollectionUtils.array(Number.class); - case REMOVE_ALL: - default: - return null; - } + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case ADD, REMOVE, RESET, SET -> CollectionUtils.array(Number.class); + case REMOVE_ALL, DELETE -> null; + }; } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - byte change = delta == null ? -1 : ((Number) delta[0]).byteValue(); - change = (byte) Math.max(-127, change); + int change = delta == null ? -1 : ((Number) delta[0]).intValue(); switch (mode) { case REMOVE_ALL: case REMOVE: - change = (byte) -change; + change = -change; case ADD: for (Display display : displays) { - if (!(display instanceof TextDisplay)) - continue; - TextDisplay textDisplay = (TextDisplay) display; - byte value = (byte) Math.min(127, textDisplay.getTextOpacity() + change); - value = (byte) Math.max(-127, value); - textDisplay.setTextOpacity(value); + if (display instanceof TextDisplay textDisplay) { + byte value = (byte) Math2.fit(-127, textDisplay.getTextOpacity() + change, 127); + textDisplay.setTextOpacity(value); + } } break; case DELETE: case RESET: case SET: + change = Math2.fit(-127, change, 127); for (Display display : displays) { - if (!(display instanceof TextDisplay)) - continue; - ((TextDisplay) display).setTextOpacity(change); + if (display instanceof TextDisplay textDisplay) + textDisplay.setTextOpacity((byte) change); } break; } diff --git a/src/test/skript/tests/syntaxes/expressions/ExprTextDisplayAlignment.sk b/src/test/skript/tests/syntaxes/expressions/ExprTextDisplayAlignment.sk new file mode 100644 index 00000000000..e62d9f7172c --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprTextDisplayAlignment.sk @@ -0,0 +1,24 @@ +test "text alignment" when running minecraft "1.19.4": + + spawn item display at spawn of world "world": + set {_id} to entity + + assert text alignment of {_id} is not set with "item display has text alignment" + set text alignment of {_id} to centered + assert text alignment of {_id} is not set with "item display has text alignment" + reset text alignment of {_id} + assert text alignment of {_id} is not set with "item display has text alignment" + + delete entity within {_id} + spawn text display at spawn of world "world": + set {_td} to entity + + assert text alignment of {_td} is centered with "failed default text alignment" + set text alignment of {_td} to left aligned + assert text alignment of {_td} is left aligned with "failed to set text alignment" + set text alignment of {_td} to right aligned + assert text alignment of {_td} is right aligned with "failed to set text alignment" + reset text alignment of {_td} + assert text alignment of {_td} is centered with "failed to set text alignment" + + delete entity within {_td} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprTextDisplayLineWidth.sk b/src/test/skript/tests/syntaxes/expressions/ExprTextDisplayLineWidth.sk new file mode 100644 index 00000000000..9301419b8cd --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprTextDisplayLineWidth.sk @@ -0,0 +1,33 @@ +test "line width" when running minecraft "1.19.4": + + spawn item display at spawn of world "world": + set {_id} to entity + + assert line width of {_id} is not set with "item display has line width" + set line width of {_id} to 55 + assert line width of {_id} is not set with "item display has line width" + reset line width of {_id} + assert line width of {_id} is not set with "item display has line width" + + delete entity within {_id} + spawn text display at spawn of world "world": + set {_td} to entity + + assert line width of {_td} is 200 with "failed default line width" + set line width of {_td} to 185.4 + assert line width of {_td} is 185 with "failed to set line width" + set line width of {_td} to -50 + assert line width of {_td} is 0 with "failed to set line width" + set line width of {_td} to 900 + assert line width of {_td} is 900 with "failed to set line width" + add 50 to line width of {_td} + assert line width of {_td} is 950 with "failed to add to line width" + remove 1000 from line width of {_td} + assert line width of {_td} is 0 with "failed to remove from line width" + reset line width of {_td} + assert line width of {_td} is 200 with "failed to reset line width" + + set line width of {_td} to infinity value + assert line width of {_td} is 2147483647 with "failed to set line width" + + delete entity within {_td} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprTextDisplayOpacity.sk b/src/test/skript/tests/syntaxes/expressions/ExprTextDisplayOpacity.sk new file mode 100644 index 00000000000..521c659f931 --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprTextDisplayOpacity.sk @@ -0,0 +1,33 @@ +test "text opacity" when running minecraft "1.19.4": + + spawn item display at spawn of world "world": + set {_id} to entity + + assert opacity of {_id} is not set with "item display has opacity" + set opacity of {_id} to 55 + assert opacity of {_id} is not set with "item display has opacity" + reset opacity of {_id} + assert opacity of {_id} is not set with "item display has opacity" + + delete entity within {_id} + spawn text display at spawn of world "world": + set {_td} to entity + + assert opacity of {_td} is -1 with "failed default opacity" + set opacity of {_td} to 185.4 + assert opacity of {_td} is 127 with "failed to set opacity" + set opacity of {_td} to -50 + assert opacity of {_td} is -50 with "failed to set opacity" + set opacity of {_td} to -900 + assert opacity of {_td} is -127 with "failed to set opacity" + add 50 to opacity of {_td} + assert opacity of {_td} is -77 with "failed to add to opacity" + remove 1000 from opacity of {_td} + assert opacity of {_td} is -127 with "failed to remove from opacity" + reset opacity of {_td} + assert opacity of {_td} is -1 with "failed to reset opacity" + + set opacity of {_td} to infinity value + assert opacity of {_td} is 127 with "failed to set opacity" + + delete entity within {_td} From e089ddcdc4253ad7d44ed0b8e77a2737c0907cfe Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Mon, 22 Jul 2024 21:09:14 -0700 Subject: [PATCH 079/104] small cleanup to textdisplayexprs and rename ItemFrameSlot to be more generic --- .../text/ExprTextDisplayAlignment.java | 3 +-- .../text/ExprTextDisplayLineWidth.java | 3 +-- .../displays/text/ExprTextDisplayOpacity.java | 3 +-- ...emFrameSlot.java => ExprItemOfEntity.java} | 20 +++++++++---------- 4 files changed, 12 insertions(+), 17 deletions(-) rename src/main/java/org/skriptlang/skript/bukkit/misc/expressions/{ExprItemFrameSlot.java => ExprItemOfEntity.java} (90%) diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java index f00000febd7..c414f04e56e 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java @@ -29,8 +29,7 @@ public class ExprTextDisplayAlignment extends SimplePropertyExpression { +public class ExprItemOfEntity extends SimplePropertyExpression { private static final boolean PROJECTILE_SUPPORT = Skript.classExists("org.bukkit.entity.ThrowableProjectile"); private static final boolean DISPLAYS_SUPPORT = Skript.classExists("org.bukkit.entity.ItemDisplay"); static { - register(ExprItemFrameSlot.class, Slot.class, "[the] item [inside]", "entities"); + register(ExprItemOfEntity.class, Slot.class, "[the] item [inside]", "entities"); } @Override - @Nullable - public Slot convert(Entity entity) { + public @Nullable Slot convert(Entity entity) { if (entity instanceof ItemFrame) { return new ItemFrameSlot((ItemFrame) entity); } else if (entity instanceof Item) { From 045d75ccde202f1a16023236b3f210b593e93369 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Mon, 22 Jul 2024 21:52:23 -0700 Subject: [PATCH 080/104] rework ExprRotate --- .../bukkit/misc/expressions/ExprRotate.java | 259 ++++++++++++++++++ .../expressions/ExprRotateQuaternion.java | 134 --------- 2 files changed, 259 insertions(+), 134 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java delete mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java new file mode 100644 index 00000000000..eb1f366f943 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java @@ -0,0 +1,259 @@ +package org.skriptlang.skript.bukkit.misc.expressions; + +import ch.njol.skript.Skript; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.ExpressionType; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.skript.lang.util.SimpleExpression; +import ch.njol.util.Kleenean; +import org.bukkit.event.Event; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import java.util.Locale; +import java.util.Objects; +import java.util.function.BiFunction; + +@Name("Rotate Quaternion/Vector") +@Description({ + "Rotates a Quaternion or Vector around an axis a set amount of degrees, or around all 3 axes at once.", + "Vectors can only be rotated around the global X/Y/Z axes, or an arbitrary vector axis.", + "Quaternions are more flexible, allowing rotation around the global or local X/Y/Z axes, arbitrary vectors, or all 3 local axis at once.", + "Global axes are the ones in the Minecraft world. Local axes are relative to how the quaternion is already oriented.", + "", + "Note that rotating a quaternion around a vector results in a rotation around the local vector, so results may not be what you expect. " + + "For example, rotating around vector(1, 0, 0) is the same as rotating around the local x axis.", + "In addition, rotating around all three axes at once will rotate in ZYX order, meaning the Z rotation will be applied first, and the X rotation last." +}) +@Examples({ + "set {_new} to {_quaternion} rotated around x axis by 10 degrees", + "set {_new} to {_vector} rotated around vector(1, 1, 1) by 45", + "set {_new} to {_quaternion} rotated by x 45, y 90, z 135" +}) +@RequiredPlugins("Spigot 1.19.4+") +@Since("INSERT VERSION") +public class ExprRotate extends SimpleExpression { + + // NOTE: + // The apparent mismatch of X -> rotateLocalX and LOCAL_X -> rotateX is intentional. + // When rotating display entities, rotateLocalX appears as if rotating around the global X, + // and vice versa for rotateX. + public enum Axis { + /** + * The global X axis + */ + X ((object, angle) -> { + if (object instanceof Quaternionf quaternion) { + return quaternion.rotateLocalX(angle.floatValue(), new Quaternionf()); + } else if (object instanceof Vector vector) { + return vector.clone().rotateAroundX(angle); + } + return null; + }), + /** + * The global Y axis + */ + Y ((object, angle) -> { + if (object instanceof Quaternionf quaternion) { + return quaternion.rotateLocalY(angle.floatValue(), new Quaternionf()); + } else if (object instanceof Vector vector) { + return vector.clone().rotateAroundY(angle); + } + return null; + }), + /** + * The global Z axis + */ + Z ((object, angle) -> { + if (object instanceof Quaternionf quaternion) { + return quaternion.rotateLocalZ(angle.floatValue(), new Quaternionf()); + } else if (object instanceof Vector vector) { + return vector.clone().rotateAroundZ(angle); + } + return null; + }), + /** + * The local X axis for the given {@link Quaternionf} + */ + LOCAL_X ((object, angle) -> { + if (object instanceof Quaternionf quaternion) { + return quaternion.rotateX(angle.floatValue(), new Quaternionf()); + } + return null; + }), + /** + * The local Y axis for the given {@link Quaternionf} + */ + LOCAL_Y ((object, angle) -> { + if (object instanceof Quaternionf quaternion) { + return quaternion.rotateY(angle.floatValue(), new Quaternionf()); + } + return null; + }), + /** + * The local Z axis for the given {@link Quaternionf} + */ + LOCAL_Z ((object, angle) -> { + if (object instanceof Quaternionf quaternion) { + return quaternion.rotateZ(angle.floatValue(), new Quaternionf()); + } + return null; + }), + /** + * An unknown, arbitrary axis. {@link #applyRotation(Object, float)} is not supported. + */ + ARBITRARY (null); + + private final BiFunction rotation; + Axis(@UnknownNullability BiFunction rotation) { + this.rotation = rotation; + } + + /** + * Rotates the given {@link Quaternionf} or {@link Vector} around this axis. + * Vectors may not be rotated around local axes and will return null in these cases. + * {@link #ARBITRARY} does not support this method, as the axis in unknown. + * + * @param toRotate the {@link Quaternionf} or {@link Vector} to rotate. + * @param angle the angle in radians to rotate the object by. + * @return a rotated copy of the object. + */ + @Contract(value = "_, _ -> new", pure = true) + public @UnknownNullability Object applyRotation(Object toRotate, double angle) { + return rotation.apply(toRotate, angle); + } + + @Override + public String toString() { + return super.toString().toLowerCase(Locale.ENGLISH).replace("_", " "); + } + } + + static { + if (Skript.isRunningMinecraft(1, 19, 4)) + Skript.registerExpression(ExprRotate.class, Object.class, ExpressionType.SIMPLE, + "%quaternions/vectors% rotated (around|on) [the] ([global] (:x|:y|:z)(-| )axis|arbitrary:%-vector%) by %number% [degrees]", + "%quaternions% rotated (around|on) [the|its|their] local (:x|:y|:z)(-| )ax(i|e)s by %number% [degrees]", + "%quaternions% rotated by x %number%, y %number%(, [and]| and) z %number%"); + } + + private Expression toRotate; + + private @UnknownNullability Expression angle; + private @UnknownNullability Expression vector; + private Axis axis; + + private @UnknownNullability Expression x, y, z; + + private int matchedPattern; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + toRotate = exprs[0]; + this.matchedPattern = matchedPattern; + if (matchedPattern < 2) { + String axisString = parseResult.tags.get(0).toUpperCase(Locale.ENGLISH); + if (matchedPattern == 1) { + axisString = "LOCAL_" + axisString; + angle = (Expression) exprs[1]; + } else { + vector = (Expression) exprs[1]; + angle = (Expression) exprs[2]; + } + axis = Axis.valueOf(axisString); + } else { + x = (Expression) exprs[1]; + y = (Expression) exprs[2]; + z = (Expression) exprs[3]; + } + return true; + } + + @Override + @Nullable + protected Object[] get(Event event) { + if (matchedPattern == 2) { + Number x = this.x.getSingle(event); + Number y = this.y.getSingle(event); + Number z = this.z.getSingle(event); + if (x == null || y == null || z == null) + return new Quaternionf[0]; + + float radX = (float) (x.floatValue() * Math.PI / 180); + float radY = (float) (y.floatValue() * Math.PI / 180); + float radZ = (float) (z.floatValue() * Math.PI / 180); + + return toRotate.stream(event) + .map(Quaternionf.class::cast) + .map(quaternion -> quaternion.rotateZYX(radZ, radY, radX)) + .toArray(Quaternionf[]::new); + } + + // rotate around axis + Number angle = this.angle.getSingle(event); + if (angle == null) + return new Object[0]; + double jomlAngle = (angle.doubleValue() * Math.PI / 180); + if (Double.isInfinite(jomlAngle) || Double.isNaN(jomlAngle)) + return new Object[0]; + + if (axis != Axis.ARBITRARY) { + //noinspection ConstantConditions + return toRotate.stream(event) + .map(object -> axis.applyRotation(object, jomlAngle)) + .filter(Objects::nonNull) + .toArray(); + } + + // rotate around arbitrary axis + Vector axis = vector.getSingle(event); + if (axis == null || axis.isZero()) + return new Object[0]; + Vector3f jomlAxis = axis.toVector3f().normalize(); + + return toRotate.stream(event) + .map(object -> { + if (object instanceof Quaternionf quaternion) { + return quaternion.rotateAxis((float) jomlAngle, jomlAxis, new Quaternionf()); + } else if (object instanceof Vector vectorToRotate) { + return vectorToRotate.clone().rotateAroundAxis(axis, jomlAngle); + } + return null; + }) + .filter(Objects::nonNull) + .toArray(); + } + + @Override + public boolean isSingle() { + return toRotate.isSingle(); + } + + @Override + public Class getReturnType() { + return matchedPattern != 0 ? Quaternionf.class : toRotate.getReturnType(); + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + if (matchedPattern < 2) + return toRotate.toString(event, debug) + + " rotated around the " + axis + "-axis " + + " by " + angle.toString(event, debug) + " degrees"; + return toRotate.toString(event, debug) + + " rotated by yaw " + x.toString(event, debug) + ", " + + "pitch " + y.toString(event, debug) + ", " + + "and roll " + z.toString(event, debug); + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java deleted file mode 100644 index 4fafd254672..00000000000 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotateQuaternion.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.skriptlang.skript.bukkit.misc.expressions; - -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.eclipse.jdt.annotation.Nullable; -import org.joml.Quaternionf; -import org.joml.Vector3f; - -import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Examples; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; -import ch.njol.skript.doc.Since; -import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.ExpressionType; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.skript.lang.util.SimpleExpression; -import ch.njol.util.Kleenean; - -@Name("Rotate Quaternion/Vector") -@Description({ - "Rotates a Quaternion around an axis a set amount of degrees or rotated by a vector.", - "When you use a vector, the values will be used to rotate the x, y and z.", - "Vector numbers will get converted from a double down to a float." -}) -@Examples("set {_new} to {_quaternion} rotated by vector(1, 0, 0)") -@RequiredPlugins("Spigot 1.19.4+") -@Since("INSERT VERSION") -public class ExprRotateQuaternion extends SimpleExpression { - - static { - if (Skript.isRunningMinecraft(1, 19, 4)) - Skript.registerExpression(ExprRotateQuaternion.class, Object.class, ExpressionType.SIMPLE, - "%quaternions/vectors% rotated (around|on) [the] (:x|:y|:z)-axis by %number% [degrees|radians]", - "%quaternions% rotated by %vector%"); - } - - private Expression objects; - - @Nullable - private Expression degrees; - - @Nullable - private Expression vector; - - @Nullable - private String axis; - - @Override - @SuppressWarnings("unchecked") - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - objects = exprs[0]; - if (parseResult.tags.size() > 0) { - axis = parseResult.tags.get(0); - degrees = (Expression) exprs[1]; - } else { - vector = (Expression) exprs[1]; - } - return true; - } - - @Override - @Nullable - protected Object[] get(Event event) { - if (vector == null && axis != null) { - float degrees = this.degrees.getOptionalSingle(event).orElse(0).floatValue(); - switch (axis) { - case "x": - return objects.stream(event) - .map(object -> { - if (object instanceof Quaternionf) { - return ((Quaternionf) object).rotateX(degrees); - } else if (object instanceof Vector) { - return ((Vector) object).toVector3f().rotateX(degrees); - } - return null; - }) - .toArray(); - case "y": - return objects.stream(event) - .map(object -> { - if (object instanceof Quaternionf) { - return ((Quaternionf) object).rotateY(degrees); - } else if (object instanceof Vector) { - return ((Vector) object).toVector3f().rotateY(degrees); - } - return null; - }) - .toArray(); - case "z": - return objects.stream(event) - .map(object -> { - if (object instanceof Quaternionf) { - return ((Quaternionf) object).rotateZ(degrees); - } else if (object instanceof Vector) { - return ((Vector) object).toVector3f().rotateZ(degrees); - } - return null; - }) - .toArray(); - } - } - Vector vector = this.vector.getSingle(event); - if (vector == null) - return new Quaternionf[0]; - Vector3f vector3f = new Vector3f((float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); - return objects.stream(event) - .map(Quaternionf.class::cast) - .map(quaternion -> quaternion.rotateZYX(vector3f.x(), vector3f.y(), vector3f.x())) - .toArray(Quaternionf[]::new); - } - - @Override - public boolean isSingle() { - return objects.isSingle(); - } - - @Override - public Class getReturnType() { - return Quaternionf.class; - } - - @Override - public String toString(@Nullable Event event, boolean debug) { - if (vector == null) - return objects.toString(event, debug) + - " rotated around the " + axis + "-axis " + - " by " + degrees.toString(event, debug) + " degrees"; - return objects.toString(event, debug) + - " rotated by " + vector.toString(event, debug); - } - -} From 9d94d43b3de1a256e1ba031b396db77d7113519e Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 23 Jul 2024 00:48:02 -0700 Subject: [PATCH 081/104] Completely rework rotation with new Rotator API. Add support for quaternions + displays in EffRotate --- .../ch/njol/skript/effects/EffRotate.java | 191 +++++++++++++++++ .../effects/EffVectorRotateAroundAnother.java | 77 ------- .../skript/effects/EffVectorRotateXYZ.java | 94 -------- .../bukkit/misc/expressions/ExprRotate.java | 200 ++++++------------ .../bukkit/misc/rotation/DisplayRotator.java | 33 +++ .../NonMutatingQuaternionRotator.java | 49 +++++ .../rotation/NonMutatingVectorRotator.java | 37 ++++ .../misc/rotation/QuaternionRotator.java | 49 +++++ .../skript/bukkit/misc/rotation/Rotator.java | 88 ++++++++ .../bukkit/misc/rotation/VectorRotator.java | 37 ++++ 10 files changed, 546 insertions(+), 309 deletions(-) create mode 100644 src/main/java/ch/njol/skript/effects/EffRotate.java delete mode 100644 src/main/java/ch/njol/skript/effects/EffVectorRotateAroundAnother.java delete mode 100644 src/main/java/ch/njol/skript/effects/EffVectorRotateXYZ.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java diff --git a/src/main/java/ch/njol/skript/effects/EffRotate.java b/src/main/java/ch/njol/skript/effects/EffRotate.java new file mode 100644 index 00000000000..877f7578238 --- /dev/null +++ b/src/main/java/ch/njol/skript/effects/EffRotate.java @@ -0,0 +1,191 @@ +package ch.njol.skript.effects; + +import ch.njol.skript.Skript; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.RequiredPlugins; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Effect; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.bukkit.util.Transformation; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; +import org.joml.Quaternionf; +import org.joml.Vector3f; +import org.skriptlang.skript.bukkit.misc.rotation.DisplayRotator; +import org.skriptlang.skript.bukkit.misc.rotation.QuaternionRotator; +import org.skriptlang.skript.bukkit.misc.rotation.Rotator; +import org.skriptlang.skript.bukkit.misc.rotation.Rotator.Axis; +import org.skriptlang.skript.bukkit.misc.rotation.VectorRotator; + +import java.util.Locale; + +@Name("Rotate") +@Description({ + "Rotates Displays, Quaternions, or Vectors around an axis a set amount of degrees, or around all 3 axes at once.", + "Vectors can only be rotated around the global X/Y/Z axes, or an arbitrary vector axis.", + "Quaternions are more flexible, allowing rotation around the global or local X/Y/Z axes, arbitrary vectors, or all 3 local axis at once.", + "Global axes are the ones in the Minecraft world. Local axes are relative to how the quaternion is already oriented.", + "", + "Rotating a display is a shortcut for rotating its left rotation. If the right rotation needs to be modified, it should be acquired, rotated, and re-set.", + "", + "Note that rotating a quaternion/display around a vector results in a rotation around the local vector, so results may not be what you expect. " + + "For example, rotating quaternions/displays around vector(1, 0, 0) is the same as rotating around the local x axis.", + "In addition, rotating around all three axes of a quaternion/display at once will rotate in ZYX order, meaning the Z rotation will be applied first, and the X rotation last." +}) +@Examples({ + "rotate {_quaternion} around x axis by 10 degrees", + "rotate last spawned block display around y axis by 10 degrees", + "rotate {_vector} around vector(1, 1, 1) by 45", + "rotate {_quaternion} by x 45, y 90, z 135" +}) +@RequiredPlugins("Spigot 1.19.4+") +@Since("INSERT VERSION") +public class EffRotate extends Effect { + + static { + Skript.registerEffect(EffRotate.class, + "rotate %vectors/quaternions/displays% around [the] [global] (:x|:y|:z)(-| )axis by %number% [degrees]", + "rotate %quaternions/displays% around [the|its|their] local (:x|:y|:z)(-| )ax(i|e)s by %number% [degrees]", + "rotate %vectors/quaternions/displays% around [the] %vector% by %number% [degrees]", + "rotate %quaternions/displays% by x %number%, y %number%(, [and]| and) z %number%" + ); + } + + private Expression toRotate; + + private @UnknownNullability Expression angle; + private @UnknownNullability Expression vector; + private @UnknownNullability Axis axis; + + private @UnknownNullability Expression x, y, z; + + private int matchedPattern; + + @Override + @SuppressWarnings("unchecked") + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + toRotate = exprs[0]; + this.matchedPattern = matchedPattern; + switch (matchedPattern) { + case 0, 1 -> { + String axisString = parseResult.tags.get(0).toUpperCase(Locale.ENGLISH); + if (matchedPattern == 1) + axisString = "LOCAL_" + axisString; + angle = (Expression) exprs[1]; + axis = Axis.valueOf(axisString); + } + case 2 -> { + vector = (Expression) exprs[1]; + angle = (Expression) exprs[2]; + axis = Axis.ARBITRARY; + } + case 3 -> { + x = (Expression) exprs[1]; + y = (Expression) exprs[2]; + z = (Expression) exprs[3]; + } + } + return true; + } + + @Override + protected void execute(Event event) { + if (matchedPattern == 3) { + Number x = this.x.getSingle(event); + Number y = this.y.getSingle(event); + Number z = this.z.getSingle(event); + if (x == null || y == null || z == null) + return; + + float radX = (float) (x.floatValue() * Math.PI / 180); + float radY = (float) (y.floatValue() * Math.PI / 180); + float radZ = (float) (z.floatValue() * Math.PI / 180); + + toRotate.stream(event) + .forEach(object -> { + if (object instanceof Quaternionf quaternion) { + quaternion.rotateZYX(radZ, radY, radX); + } else if (object instanceof Display display) { + Transformation transformation = display.getTransformation(); + Quaternionf leftRotation = transformation.getLeftRotation(); + display.setTransformation( + new Transformation( + transformation.getTranslation(), + leftRotation.rotateZYX(radZ, radY, radX), + transformation.getScale(), + transformation.getRightRotation() + ) + ); + } + }); + } + + // rotate around axis + Number angle = this.angle.getSingle(event); + if (angle == null) + return; + double radAngle = (angle.doubleValue() * Math.PI / 180); + if (Double.isInfinite(radAngle) || Double.isNaN(radAngle)) + return; + + Rotator vectorRotator; + Rotator quaternionRotator; + Rotator displayRotator; + + if (axis == Axis.ARBITRARY) { + // rotate around arbitrary axis + Vector axis = vector.getSingle(event); + if (axis == null || axis.isZero()) + return; + axis.normalize(); + Vector3f jomlAxis = axis.toVector3f(); + vectorRotator = new VectorRotator(Axis.ARBITRARY, axis, radAngle); + quaternionRotator = new QuaternionRotator(Axis.LOCAL_ARBITRARY, jomlAxis, (float) radAngle); + displayRotator = new DisplayRotator(Axis.LOCAL_ARBITRARY, jomlAxis, (float) radAngle); + } else { + vectorRotator = new VectorRotator(axis, radAngle); + quaternionRotator = new QuaternionRotator(axis, (float) radAngle); + displayRotator = new DisplayRotator(axis, (float) radAngle); + } + + toRotate.stream(event) + .forEach(object -> { + if (object instanceof Vector vectorToRotate) { + vectorRotator.rotate(vectorToRotate); + } else if (object instanceof Quaternionf quaternion) { + quaternionRotator.rotate(quaternion); + } else if (object instanceof Display display) { + displayRotator.rotate(display); + } + }); + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + switch (matchedPattern) { + case 0, 1: + return "rotate " + toRotate.toString(event, debug) + + " around the " + axis + "-axis " + + "by " + angle.toString(event, debug) + " degrees"; + case 2: + return "rotate " + toRotate.toString(event, debug) + + " around " + vector.toString(event, debug) + "-axis " + + "by " + angle.toString(event, debug) + " degrees"; + case 3: + return "rotate " + toRotate.toString(event, debug) + + " by x " + x.toString(event, debug) + ", " + + "y " + y.toString(event, debug) + ", " + + "and z " + z.toString(event, debug); + } + assert false; + return "invalid"; + } + +} diff --git a/src/main/java/ch/njol/skript/effects/EffVectorRotateAroundAnother.java b/src/main/java/ch/njol/skript/effects/EffVectorRotateAroundAnother.java deleted file mode 100644 index 10b83986f4d..00000000000 --- a/src/main/java/ch/njol/skript/effects/EffVectorRotateAroundAnother.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ -package ch.njol.skript.effects; - -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.eclipse.jdt.annotation.Nullable; - -import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Examples; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.Since; -import ch.njol.skript.lang.Effect; -import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.util.Kleenean; -import ch.njol.util.VectorMath; - -@Name("Vectors - Rotate Around Vector") -@Description("Rotates one or more vectors around another vector") -@Examples("rotate {_v} around vector 1, 0, 0 by 90") -@Since("2.2-dev28") -public class EffVectorRotateAroundAnother extends Effect { - - static { - Skript.registerEffect(EffVectorRotateAroundAnother.class, "rotate %vectors% around %vector% by %number% [degrees]"); - } - - @SuppressWarnings("null") - private Expression vectors, axis; - - @SuppressWarnings("null") - private Expression degree; - - @SuppressWarnings({"unchecked", "null"}) - @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean kleenean, ParseResult parseResult) { - vectors = (Expression) exprs[0]; - axis = (Expression) exprs[1]; - degree = (Expression) exprs[2]; - return true; - } - - @SuppressWarnings("null") - @Override - protected void execute(Event event) { - Vector axis = this.axis.getSingle(event); - Number angle = degree.getSingle(event); - if (axis == null || angle == null) - return; - for (Vector vector : vectors.getArray(event)) - VectorMath.rot(vector, axis, angle.doubleValue()); - } - - @Override - public String toString(@Nullable Event event, boolean debug) { - return "rotate " + vectors.toString(event, debug) + " around " + axis.toString(event, debug) + " by " + degree.toString(event, debug) + "degrees"; - } - -} diff --git a/src/main/java/ch/njol/skript/effects/EffVectorRotateXYZ.java b/src/main/java/ch/njol/skript/effects/EffVectorRotateXYZ.java deleted file mode 100644 index 6e24d2882bb..00000000000 --- a/src/main/java/ch/njol/skript/effects/EffVectorRotateXYZ.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ -package ch.njol.skript.effects; - -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.eclipse.jdt.annotation.Nullable; - -import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Examples; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.Since; -import ch.njol.skript.lang.Effect; -import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.SkriptParser.ParseResult; -import ch.njol.util.Kleenean; -import ch.njol.util.VectorMath; - -@Name("Vectors - Rotate around XYZ") -@Description("Rotates one or more vectors around the x, y, or z axis by some amount of degrees") -@Examples({ - "rotate {_v} around x-axis by 90", - "rotate {_v} around y-axis by 90", - "rotate {_v} around z-axis by 90 degrees" -}) -@Since("2.2-dev28") -public class EffVectorRotateXYZ extends Effect { - - static { - Skript.registerEffect(EffVectorRotateXYZ.class, "rotate %vectors% around (0¦x|1¦y|2¦z)(-| )axis by %number% [degrees]"); - } - - private final static Character[] axes = new Character[] {'x', 'y', 'z'}; - - @SuppressWarnings("null") - private Expression vectors; - - @SuppressWarnings("null") - private Expression degree; - private int axis; - - @Override - @SuppressWarnings({"unchecked", "null"}) - public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - vectors = (Expression) expressions[0]; - degree = (Expression) expressions[1]; - axis = parseResult.mark; - return true; - } - - @Override - @SuppressWarnings("null") - protected void execute(Event event) { - Number angle = degree.getSingle(event); - if (angle == null) - return; - switch (axis) { - case 0: - for (Vector vector : vectors.getArray(event)) - VectorMath.rotX(vector, angle.doubleValue()); - break; - case 1: - for (Vector vector : vectors.getArray(event)) - VectorMath.rotY(vector, angle.doubleValue()); - break; - case 2: - for (Vector vector : vectors.getArray(event)) - VectorMath.rotZ(vector, angle.doubleValue()); - } - } - - @Override - public String toString(@Nullable Event event, boolean debug) { - return "rotate " + vectors.toString(event, debug) + " around " + axes[axis] + "-axis" + " by " + degree.toString(event, debug) + "degrees"; - } - -} diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java index eb1f366f943..f9e3a6d812d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java @@ -13,15 +13,17 @@ import ch.njol.util.Kleenean; import org.bukkit.event.Event; import org.bukkit.util.Vector; -import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.Quaternionf; import org.joml.Vector3f; +import org.skriptlang.skript.bukkit.misc.rotation.NonMutatingQuaternionRotator; +import org.skriptlang.skript.bukkit.misc.rotation.NonMutatingVectorRotator; +import org.skriptlang.skript.bukkit.misc.rotation.Rotator; +import org.skriptlang.skript.bukkit.misc.rotation.Rotator.Axis; import java.util.Locale; import java.util.Objects; -import java.util.function.BiFunction; @Name("Rotate Quaternion/Vector") @Description({ @@ -43,106 +45,12 @@ @Since("INSERT VERSION") public class ExprRotate extends SimpleExpression { - // NOTE: - // The apparent mismatch of X -> rotateLocalX and LOCAL_X -> rotateX is intentional. - // When rotating display entities, rotateLocalX appears as if rotating around the global X, - // and vice versa for rotateX. - public enum Axis { - /** - * The global X axis - */ - X ((object, angle) -> { - if (object instanceof Quaternionf quaternion) { - return quaternion.rotateLocalX(angle.floatValue(), new Quaternionf()); - } else if (object instanceof Vector vector) { - return vector.clone().rotateAroundX(angle); - } - return null; - }), - /** - * The global Y axis - */ - Y ((object, angle) -> { - if (object instanceof Quaternionf quaternion) { - return quaternion.rotateLocalY(angle.floatValue(), new Quaternionf()); - } else if (object instanceof Vector vector) { - return vector.clone().rotateAroundY(angle); - } - return null; - }), - /** - * The global Z axis - */ - Z ((object, angle) -> { - if (object instanceof Quaternionf quaternion) { - return quaternion.rotateLocalZ(angle.floatValue(), new Quaternionf()); - } else if (object instanceof Vector vector) { - return vector.clone().rotateAroundZ(angle); - } - return null; - }), - /** - * The local X axis for the given {@link Quaternionf} - */ - LOCAL_X ((object, angle) -> { - if (object instanceof Quaternionf quaternion) { - return quaternion.rotateX(angle.floatValue(), new Quaternionf()); - } - return null; - }), - /** - * The local Y axis for the given {@link Quaternionf} - */ - LOCAL_Y ((object, angle) -> { - if (object instanceof Quaternionf quaternion) { - return quaternion.rotateY(angle.floatValue(), new Quaternionf()); - } - return null; - }), - /** - * The local Z axis for the given {@link Quaternionf} - */ - LOCAL_Z ((object, angle) -> { - if (object instanceof Quaternionf quaternion) { - return quaternion.rotateZ(angle.floatValue(), new Quaternionf()); - } - return null; - }), - /** - * An unknown, arbitrary axis. {@link #applyRotation(Object, float)} is not supported. - */ - ARBITRARY (null); - - private final BiFunction rotation; - Axis(@UnknownNullability BiFunction rotation) { - this.rotation = rotation; - } - - /** - * Rotates the given {@link Quaternionf} or {@link Vector} around this axis. - * Vectors may not be rotated around local axes and will return null in these cases. - * {@link #ARBITRARY} does not support this method, as the axis in unknown. - * - * @param toRotate the {@link Quaternionf} or {@link Vector} to rotate. - * @param angle the angle in radians to rotate the object by. - * @return a rotated copy of the object. - */ - @Contract(value = "_, _ -> new", pure = true) - public @UnknownNullability Object applyRotation(Object toRotate, double angle) { - return rotation.apply(toRotate, angle); - } - - @Override - public String toString() { - return super.toString().toLowerCase(Locale.ENGLISH).replace("_", " "); - } - } - static { if (Skript.isRunningMinecraft(1, 19, 4)) Skript.registerExpression(ExprRotate.class, Object.class, ExpressionType.SIMPLE, - "%quaternions/vectors% rotated (around|on) [the] ([global] (:x|:y|:z)(-| )axis|arbitrary:%-vector%) by %number% [degrees]", - "%quaternions% rotated (around|on) [the|its|their] local (:x|:y|:z)(-| )ax(i|e)s by %number% [degrees]", + "%quaternions/vectors% rotated around [the] [global] (:x|:y|:z)(-| )axis by %number% [degrees]", + "%quaternions% rotated around [the|its|their] local (:x|:y|:z)(-| )ax(i|e)s by %number% [degrees]", + "%quaternions/vectors% rotated around [the] %vector% by %number% [degrees]", "%quaternions% rotated by x %number%, y %number%(, [and]| and) z %number%"); } @@ -150,7 +58,7 @@ public String toString() { private @UnknownNullability Expression angle; private @UnknownNullability Expression vector; - private Axis axis; + private @UnknownNullability Axis axis; private @UnknownNullability Expression x, y, z; @@ -161,20 +69,24 @@ public String toString() { public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { toRotate = exprs[0]; this.matchedPattern = matchedPattern; - if (matchedPattern < 2) { - String axisString = parseResult.tags.get(0).toUpperCase(Locale.ENGLISH); - if (matchedPattern == 1) { - axisString = "LOCAL_" + axisString; + switch (matchedPattern) { + case 0, 1 -> { + String axisString = parseResult.tags.get(0).toUpperCase(Locale.ENGLISH); + if (matchedPattern == 1) + axisString = "LOCAL_" + axisString; angle = (Expression) exprs[1]; - } else { + axis = Axis.valueOf(axisString); + } + case 2 -> { vector = (Expression) exprs[1]; angle = (Expression) exprs[2]; + axis = Axis.ARBITRARY; + } + case 3 -> { + x = (Expression) exprs[1]; + y = (Expression) exprs[2]; + z = (Expression) exprs[3]; } - axis = Axis.valueOf(axisString); - } else { - x = (Expression) exprs[1]; - y = (Expression) exprs[2]; - z = (Expression) exprs[3]; } return true; } @@ -182,7 +94,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @Nullable protected Object[] get(Event event) { - if (matchedPattern == 2) { + if (matchedPattern == 3) { Number x = this.x.getSingle(event); Number y = this.y.getSingle(event); Number z = this.z.getSingle(event); @@ -203,30 +115,33 @@ protected Object[] get(Event event) { Number angle = this.angle.getSingle(event); if (angle == null) return new Object[0]; - double jomlAngle = (angle.doubleValue() * Math.PI / 180); - if (Double.isInfinite(jomlAngle) || Double.isNaN(jomlAngle)) + double radAngle = (angle.doubleValue() * Math.PI / 180); + if (Double.isInfinite(radAngle) || Double.isNaN(radAngle)) return new Object[0]; - if (axis != Axis.ARBITRARY) { - //noinspection ConstantConditions - return toRotate.stream(event) - .map(object -> axis.applyRotation(object, jomlAngle)) - .filter(Objects::nonNull) - .toArray(); + Rotator vectorRotator; + Rotator quaternionRotator; + + if (axis == Axis.ARBITRARY) { + // rotate around arbitrary axis + Vector axis = vector.getSingle(event); + if (axis == null || axis.isZero()) + return new Object[0]; + axis.normalize(); + Vector3f jomlAxis = axis.toVector3f(); + vectorRotator = new NonMutatingVectorRotator(Axis.ARBITRARY, axis, radAngle); + quaternionRotator = new NonMutatingQuaternionRotator(Axis.LOCAL_ARBITRARY, jomlAxis, (float) radAngle); + } else { + vectorRotator = new NonMutatingVectorRotator(axis, radAngle); + quaternionRotator = new NonMutatingQuaternionRotator(axis, (float) radAngle); } - // rotate around arbitrary axis - Vector axis = vector.getSingle(event); - if (axis == null || axis.isZero()) - return new Object[0]; - Vector3f jomlAxis = axis.toVector3f().normalize(); - return toRotate.stream(event) .map(object -> { - if (object instanceof Quaternionf quaternion) { - return quaternion.rotateAxis((float) jomlAngle, jomlAxis, new Quaternionf()); - } else if (object instanceof Vector vectorToRotate) { - return vectorToRotate.clone().rotateAroundAxis(axis, jomlAngle); + if (object instanceof Vector vectorToRotate) { + return vectorRotator.rotate(vectorToRotate); + } else if (object instanceof Quaternionf quaternion) { + return quaternionRotator.rotate(quaternion); } return null; }) @@ -241,19 +156,28 @@ public boolean isSingle() { @Override public Class getReturnType() { - return matchedPattern != 0 ? Quaternionf.class : toRotate.getReturnType(); + return (matchedPattern == 1 || matchedPattern == 3) ? Quaternionf.class : toRotate.getReturnType(); } @Override public String toString(@Nullable Event event, boolean debug) { - if (matchedPattern < 2) - return toRotate.toString(event, debug) + - " rotated around the " + axis + "-axis " + - " by " + angle.toString(event, debug) + " degrees"; - return toRotate.toString(event, debug) + - " rotated by yaw " + x.toString(event, debug) + ", " + - "pitch " + y.toString(event, debug) + ", " + - "and roll " + z.toString(event, debug); + switch (matchedPattern) { + case 0, 1: + return toRotate.toString(event, debug) + + " rotated around the " + axis + "-axis " + + "by " + angle.toString(event, debug) + " degrees"; + case 2: + return toRotate.toString(event, debug) + + " rotated around " + vector.toString(event, debug) + "-axis " + + "by " + angle.toString(event, debug) + " degrees"; + case 3: + return toRotate.toString(event, debug) + + " rotated by x " + x.toString(event, debug) + ", " + + "y " + y.toString(event, debug) + ", " + + "and z " + z.toString(event, debug); + } + assert false; + return "invalid"; } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java new file mode 100644 index 00000000000..6ae90de34e8 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java @@ -0,0 +1,33 @@ +package org.skriptlang.skript.bukkit.misc.rotation; + +import org.bukkit.entity.Display; +import org.bukkit.util.Transformation; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +public class DisplayRotator implements Rotator { + + private final QuaternionRotator qRotator; + + public DisplayRotator(Axis axis, float angle) { + qRotator = new QuaternionRotator(axis, angle); + } + + public DisplayRotator(Axis axis, Vector3f vector, float angle) { + qRotator = new QuaternionRotator(axis, vector, angle); + } + + public Display rotate(Display input) { + Transformation transformation = input.getTransformation(); + Quaternionf leftRotation = transformation.getLeftRotation(); + input.setTransformation( + new Transformation( + transformation.getTranslation(), + qRotator.rotate(leftRotation), + transformation.getScale(), + transformation.getRightRotation() + ) + ); + return input; + } +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java new file mode 100644 index 00000000000..ff8bb706eff --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java @@ -0,0 +1,49 @@ +package org.skriptlang.skript.bukkit.misc.rotation; + +import org.jetbrains.annotations.Contract; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import java.util.function.Function; + +public class NonMutatingQuaternionRotator implements Rotator { + + private final Function rotator; + + /* + * NOTE: the apparent mismatch between the axis and methods for local/non-local is intentional. + * Rotating quaternions via rotateLocal results in a visual rotation around the global axis. + */ + + public NonMutatingQuaternionRotator(Axis axis, float angle) { + this.rotator = switch (axis) { + case X -> (input) -> input.rotateLocalX(angle, new Quaternionf()); + case Y -> (input) -> input.rotateLocalY(angle, new Quaternionf()); + case Z -> (input) -> input.rotateLocalZ(angle, new Quaternionf()); + case LOCAL_X -> (input) -> input.rotateX(angle, new Quaternionf()); + case LOCAL_Y -> (input) -> input.rotateY(angle, new Quaternionf()); + case LOCAL_Z -> (input) -> input.rotateZ(angle, new Quaternionf()); + case LOCAL_ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); + case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + }; + } + + public NonMutatingQuaternionRotator(Axis axis, Vector3f vector, float angle) { + this.rotator = switch (axis) { + case X -> (input) -> input.rotateLocalX(angle, new Quaternionf()); + case Y -> (input) -> input.rotateLocalY(angle, new Quaternionf()); + case Z -> (input) -> input.rotateLocalZ(angle, new Quaternionf()); + case LOCAL_X -> (input) -> input.rotateX(angle, new Quaternionf()); + case LOCAL_Y -> (input) -> input.rotateY(angle, new Quaternionf()); + case LOCAL_Z -> (input) -> input.rotateZ(angle, new Quaternionf()); + case LOCAL_ARBITRARY -> (input) -> input.rotateAxis(angle, vector, new Quaternionf()); + case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + }; + } + + @Override + @Contract("_ -> new") + public Quaternionf rotate(Quaternionf input) { + return rotator.apply(input); + } +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java new file mode 100644 index 00000000000..2de58447f05 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java @@ -0,0 +1,37 @@ +package org.skriptlang.skript.bukkit.misc.rotation; + +import org.bukkit.util.Vector; +import org.jetbrains.annotations.Contract; + +import java.util.function.Function; + +public class NonMutatingVectorRotator implements Rotator { + + private final Function rotator; + + public NonMutatingVectorRotator(Axis axis, double angle) { + this.rotator = switch (axis) { + case X -> (input) -> input.clone().rotateAroundX(angle); + case Y -> (input) -> input.clone().rotateAroundY(angle); + case Z -> (input) -> input.clone().rotateAroundZ(angle); + case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); + case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + }; + } + + public NonMutatingVectorRotator(Axis axis, Vector vector, double angle) { + this.rotator = switch (axis) { + case X -> (input) -> input.clone().rotateAroundX(angle); + case Y -> (input) -> input.clone().rotateAroundY(angle); + case Z -> (input) -> input.clone().rotateAroundZ(angle); + case ARBITRARY -> (input) -> input.clone().rotateAroundNonUnitAxis(vector, angle); + case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + }; + } + + @Override + @Contract("_ -> new") + public Vector rotate(Vector input) { + return rotator.apply(input); + } +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java new file mode 100644 index 00000000000..7828ca7d234 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java @@ -0,0 +1,49 @@ +package org.skriptlang.skript.bukkit.misc.rotation; + +import org.jetbrains.annotations.Contract; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import java.util.function.Function; + +public class QuaternionRotator implements Rotator { + + private final Function rotator; + + /* + * NOTE: the apparent mismatch between the axis and methods for local/non-local is intentional. + * Rotating quaternions via rotateLocal results in a visual rotation around the global axis. + */ + + public QuaternionRotator(Axis axis, float angle) { + this.rotator = switch (axis) { + case X -> (input) -> input.rotateLocalX(angle); + case Y -> (input) -> input.rotateLocalY(angle); + case Z -> (input) -> input.rotateLocalZ(angle); + case LOCAL_X -> (input) -> input.rotateX(angle); + case LOCAL_Y -> (input) -> input.rotateY(angle); + case LOCAL_Z -> (input) -> input.rotateZ(angle); + case LOCAL_ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); + case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + }; + } + + public QuaternionRotator(Axis axis, Vector3f vector, float angle) { + this.rotator = switch (axis) { + case X -> (input) -> input.rotateLocalX(angle); + case Y -> (input) -> input.rotateLocalY(angle); + case Z -> (input) -> input.rotateLocalZ(angle); + case LOCAL_X -> (input) -> input.rotateX(angle); + case LOCAL_Y -> (input) -> input.rotateY(angle); + case LOCAL_Z -> (input) -> input.rotateZ(angle); + case LOCAL_ARBITRARY -> (input) -> input.rotateAxis(angle, vector); + case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + }; + } + + @Override + @Contract("_ -> param1") + public Quaternionf rotate(Quaternionf input) { + return rotator.apply(input); + } +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java new file mode 100644 index 00000000000..d9daf3fdf41 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java @@ -0,0 +1,88 @@ +package org.skriptlang.skript.bukkit.misc.rotation; + +import org.jetbrains.annotations.Contract; + +import java.util.Locale; + +/** + * A functional interface to support uniform rotation semantics between various types. + * A rotator rotates objects around a specific {@link Axis} by a specific angle in radians. + * + * @param The class on which this rotator acts. + * + * @see Axis + */ +@FunctionalInterface +public interface Rotator { + + /** + * Rotates the input around the rotator's axis by the rotator's angle. + * May modify the input. + */ + T rotate(T input); + + /** + * Represents an axis around which to rotate. + */ + enum Axis { + /** + * The global X axis, relative to the world as a whole. + */ + X, + + /** + * The local X axis, relative to the object being rotated. + */ + LOCAL_X, + + /** + * The global Y axis, relative to the world as a whole. + */ + Y, + + /** + * The local Y axis, relative to the object being rotated. + */ + LOCAL_Y, + + /** + * The global Z axis, relative to the world as a whole. + */ + Z, + + /** + * The local Z axis, relative to the object being rotated. + */ + LOCAL_Z, + + /** + * An arbitrary global axis, relative to the world as a whole. + */ + ARBITRARY, + + /** + * An arbitrary local axis, relative to the object being rotated. + */ + LOCAL_ARBITRARY; + + @Override + public String toString() { + return super.toString().toLowerCase(Locale.ENGLISH).replace("_", " "); + } + + /** + * A helper method for converting from Bukkit {@link org.bukkit.Axis}. + * @param axis the axis to convert from + * @return the converted axis + */ + @Contract(value = "_ -> new", pure = true) + public Axis fromBukkit(org.bukkit.Axis axis) { + return switch (axis) { + case X -> Axis.X; + case Y -> Axis.Y; + case Z -> Axis.Z; + }; + } + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java new file mode 100644 index 00000000000..0f3ec1b8540 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java @@ -0,0 +1,37 @@ +package org.skriptlang.skript.bukkit.misc.rotation; + +import org.bukkit.util.Vector; +import org.jetbrains.annotations.Contract; + +import java.util.function.Function; + +public class VectorRotator implements Rotator { + + private final Function rotator; + + public VectorRotator(Axis axis, double angle) { + this.rotator = switch (axis) { + case X -> (input) -> input.rotateAroundX(angle); + case Y -> (input) -> input.rotateAroundY(angle); + case Z -> (input) -> input.rotateAroundZ(angle); + case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); + case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + }; + } + + public VectorRotator(Axis axis, Vector vector, double angle) { + this.rotator = switch (axis) { + case X -> (input) -> input.rotateAroundX(angle); + case Y -> (input) -> input.rotateAroundY(angle); + case Z -> (input) -> input.rotateAroundZ(angle); + case ARBITRARY -> (input) -> input.rotateAroundNonUnitAxis(vector, angle); + case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + }; + } + + @Override + @Contract("_ -> param1") + public Vector rotate(Vector input) { + return rotator.apply(input); + } +} From 234be4b084dbaea98048da1bb4605184106cfded Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 23 Jul 2024 01:20:51 -0700 Subject: [PATCH 082/104] cleanup rotations - java 17 tests will fail until legacy tests are removed --- src/main/java/ch/njol/skript/effects/EffRotate.java | 4 +--- .../skript/bukkit/misc/expressions/ExprRotate.java | 13 +++++-------- .../skript/bukkit/misc/rotation/DisplayRotator.java | 3 +++ .../skript/bukkit/misc/rotation/Rotator.java | 3 --- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/main/java/ch/njol/skript/effects/EffRotate.java b/src/main/java/ch/njol/skript/effects/EffRotate.java index 877f7578238..f6f0bf76cd8 100644 --- a/src/main/java/ch/njol/skript/effects/EffRotate.java +++ b/src/main/java/ch/njol/skript/effects/EffRotate.java @@ -4,7 +4,6 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Effect; import ch.njol.skript.lang.Expression; @@ -45,8 +44,7 @@ "rotate {_vector} around vector(1, 1, 1) by 45", "rotate {_quaternion} by x 45, y 90, z 135" }) -@RequiredPlugins("Spigot 1.19.4+") -@Since("INSERT VERSION") +@Since("2.2-dev28, INSERT VERSION (quaternions, displays)") public class EffRotate extends Effect { static { diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java index f9e3a6d812d..8c65421664a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java @@ -4,7 +4,6 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; @@ -41,17 +40,15 @@ "set {_new} to {_vector} rotated around vector(1, 1, 1) by 45", "set {_new} to {_quaternion} rotated by x 45, y 90, z 135" }) -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprRotate extends SimpleExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - Skript.registerExpression(ExprRotate.class, Object.class, ExpressionType.SIMPLE, - "%quaternions/vectors% rotated around [the] [global] (:x|:y|:z)(-| )axis by %number% [degrees]", - "%quaternions% rotated around [the|its|their] local (:x|:y|:z)(-| )ax(i|e)s by %number% [degrees]", - "%quaternions/vectors% rotated around [the] %vector% by %number% [degrees]", - "%quaternions% rotated by x %number%, y %number%(, [and]| and) z %number%"); + Skript.registerExpression(ExprRotate.class, Object.class, ExpressionType.SIMPLE, + "%quaternions/vectors% rotated around [the] [global] (:x|:y|:z)(-| )axis by %number% [degrees]", + "%quaternions% rotated around [the|its|their] local (:x|:y|:z)(-| )ax(i|e)s by %number% [degrees]", + "%quaternions/vectors% rotated around [the] %vector% by %number% [degrees]", + "%quaternions% rotated by x %number%, y %number%(, [and]| and) z %number%"); } private Expression toRotate; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java index 6ae90de34e8..80e922a99d9 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java @@ -2,6 +2,7 @@ import org.bukkit.entity.Display; import org.bukkit.util.Transformation; +import org.jetbrains.annotations.Contract; import org.joml.Quaternionf; import org.joml.Vector3f; @@ -17,6 +18,8 @@ public DisplayRotator(Axis axis, Vector3f vector, float angle) { qRotator = new QuaternionRotator(axis, vector, angle); } + @Override + @Contract("_ -> param1") public Display rotate(Display input) { Transformation transformation = input.getTransformation(); Quaternionf leftRotation = transformation.getLeftRotation(); diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java index d9daf3fdf41..c09fce12342 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java @@ -1,7 +1,5 @@ package org.skriptlang.skript.bukkit.misc.rotation; -import org.jetbrains.annotations.Contract; - import java.util.Locale; /** @@ -75,7 +73,6 @@ public String toString() { * @param axis the axis to convert from * @return the converted axis */ - @Contract(value = "_ -> new", pure = true) public Axis fromBukkit(org.bukkit.Axis axis) { return switch (axis) { case X -> Axis.X; From b180eed706749172c2fa63066da356a33b18dbd0 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Wed, 7 Aug 2024 17:05:52 -0700 Subject: [PATCH 083/104] Fix bugs with rotation, adds tests --- .../ch/njol/skript/effects/EffRotate.java | 4 +- .../bukkit/misc/expressions/ExprRotate.java | 3 +- .../NonMutatingQuaternionRotator.java | 4 +- .../rotation/NonMutatingVectorRotator.java | 4 +- .../misc/rotation/QuaternionRotator.java | 4 +- .../bukkit/misc/rotation/VectorRotator.java | 4 +- src/main/resources/config.sk | 2 +- .../tests/syntaxes/effects/EffRotate.sk | 74 +++++++++++++++++++ .../effects/EffVectorRotateAroundAnother.sk | 21 ------ .../syntaxes/effects/EffVectorRotateXYZ.sk | 11 --- .../tests/syntaxes/expressions/ExprRotate.sk | 51 +++++++++++++ 11 files changed, 139 insertions(+), 43 deletions(-) create mode 100644 src/test/skript/tests/syntaxes/effects/EffRotate.sk delete mode 100644 src/test/skript/tests/syntaxes/effects/EffVectorRotateAroundAnother.sk delete mode 100644 src/test/skript/tests/syntaxes/effects/EffVectorRotateXYZ.sk create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprRotate.sk diff --git a/src/main/java/ch/njol/skript/effects/EffRotate.java b/src/main/java/ch/njol/skript/effects/EffRotate.java index f6f0bf76cd8..fd7b02832a2 100644 --- a/src/main/java/ch/njol/skript/effects/EffRotate.java +++ b/src/main/java/ch/njol/skript/effects/EffRotate.java @@ -36,7 +36,8 @@ "", "Note that rotating a quaternion/display around a vector results in a rotation around the local vector, so results may not be what you expect. " + "For example, rotating quaternions/displays around vector(1, 0, 0) is the same as rotating around the local x axis.", - "In addition, rotating around all three axes of a quaternion/display at once will rotate in ZYX order, meaning the Z rotation will be applied first, and the X rotation last." + "The same applies to rotations by all three axes at once. " + + "In addition, rotating around all three axes of a quaternion/display at once will rotate in ZYX order, meaning the Z rotation will be applied first and the X rotation last." }) @Examples({ "rotate {_quaternion} around x axis by 10 degrees", @@ -123,6 +124,7 @@ protected void execute(Event event) { ); } }); + return; } // rotate around axis diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java index 8c65421664a..45c8bf6bfff 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java @@ -33,7 +33,8 @@ "", "Note that rotating a quaternion around a vector results in a rotation around the local vector, so results may not be what you expect. " + "For example, rotating around vector(1, 0, 0) is the same as rotating around the local x axis.", - "In addition, rotating around all three axes at once will rotate in ZYX order, meaning the Z rotation will be applied first, and the X rotation last." + "The same applies to rotations by all three axes at once. " + + "In addition, rotating around all three axes of a quaternion/display at once will rotate in ZYX order, meaning the Z rotation will be applied first and the X rotation last." }) @Examples({ "set {_new} to {_quaternion} rotated around x axis by 10 degrees", diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java index ff8bb706eff..0d74a31ffc3 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java @@ -24,7 +24,7 @@ public NonMutatingQuaternionRotator(Axis axis, float angle) { case LOCAL_Y -> (input) -> input.rotateY(angle, new Quaternionf()); case LOCAL_Z -> (input) -> input.rotateZ(angle, new Quaternionf()); case LOCAL_ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); - case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + case ARBITRARY -> (input) -> input; }; } @@ -37,7 +37,7 @@ public NonMutatingQuaternionRotator(Axis axis, Vector3f vector, float angle) { case LOCAL_Y -> (input) -> input.rotateY(angle, new Quaternionf()); case LOCAL_Z -> (input) -> input.rotateZ(angle, new Quaternionf()); case LOCAL_ARBITRARY -> (input) -> input.rotateAxis(angle, vector, new Quaternionf()); - case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + case ARBITRARY -> (input) -> input; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java index 2de58447f05..3abc3c952d7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java @@ -15,7 +15,7 @@ public NonMutatingVectorRotator(Axis axis, double angle) { case Y -> (input) -> input.clone().rotateAroundY(angle); case Z -> (input) -> input.clone().rotateAroundZ(angle); case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); - case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } @@ -25,7 +25,7 @@ public NonMutatingVectorRotator(Axis axis, Vector vector, double angle) { case Y -> (input) -> input.clone().rotateAroundY(angle); case Z -> (input) -> input.clone().rotateAroundZ(angle); case ARBITRARY -> (input) -> input.clone().rotateAroundNonUnitAxis(vector, angle); - case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java index 7828ca7d234..72fccd1ac7b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java @@ -24,7 +24,7 @@ public QuaternionRotator(Axis axis, float angle) { case LOCAL_Y -> (input) -> input.rotateY(angle); case LOCAL_Z -> (input) -> input.rotateZ(angle); case LOCAL_ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); - case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + case ARBITRARY -> (input) -> input; }; } @@ -37,7 +37,7 @@ public QuaternionRotator(Axis axis, Vector3f vector, float angle) { case LOCAL_Y -> (input) -> input.rotateY(angle); case LOCAL_Z -> (input) -> input.rotateZ(angle); case LOCAL_ARBITRARY -> (input) -> input.rotateAxis(angle, vector); - case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + case ARBITRARY -> (input) -> input; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java index 0f3ec1b8540..7bbf2292d82 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java @@ -15,7 +15,7 @@ public VectorRotator(Axis axis, double angle) { case Y -> (input) -> input.rotateAroundY(angle); case Z -> (input) -> input.rotateAroundZ(angle); case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); - case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } @@ -25,7 +25,7 @@ public VectorRotator(Axis axis, Vector vector, double angle) { case Y -> (input) -> input.rotateAroundY(angle); case Z -> (input) -> input.rotateAroundZ(angle); case ARBITRARY -> (input) -> input.rotateAroundNonUnitAxis(vector, angle); - case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis is not supported."); + case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } diff --git a/src/main/resources/config.sk b/src/main/resources/config.sk index ff5e1e9e40a..8d010645639 100644 --- a/src/main/resources/config.sk +++ b/src/main/resources/config.sk @@ -136,7 +136,7 @@ listen to cancelled events by default: false # Determines whether `on ` will be triggered by all events (true) or only uncancelled events (false). # The default is false, which maintains traditional Skript behavior. -number accuracy: 2 +number accuracy: 20 # How many digits should be displayed after the dot at maximum when displaying numbers. # Zeroes will never be displayed at all, so this setting only applies to numbers that actually have a decimal part with one or more non-zero digits. # Money bypasses this setting and is displayed as configured in your economy plugin if you have one. diff --git a/src/test/skript/tests/syntaxes/effects/EffRotate.sk b/src/test/skript/tests/syntaxes/effects/EffRotate.sk new file mode 100644 index 00000000000..2de71407a8e --- /dev/null +++ b/src/test/skript/tests/syntaxes/effects/EffRotate.sk @@ -0,0 +1,74 @@ +test "rotate around global axis": + set {_v::1} to vector(1, 1, 1) + set {_v::2} to quaternion(1, 0, 0, 0) + + spawn block display at spawn of world "world": + set {_v::3} to entity + + rotate {_v::*} around y axis by 90 degrees + assert {_v::1} is vector(1, 1, -1) with "rotate vector around y axis failed" + assert {_v::2} is quaternion(0.7071067690849304, 0, 0.7071067690849304, 0) with "rotate quaternion around y axis failed" + assert left rotation of {_v::3} is quaternion(0.7071067690849304, 0, 0.7071067690849304, 0) with "rotate display around y axis failed" + + rotate {_v::*} around x axis by -90 degrees + assert {_v::1} is vector(1, -1, -1) with "rotate vector around x axis failed" + assert {_v::2} is quaternion(0.4999999701976776, -0.4999999701976776, 0.4999999701976776, -0.4999999701976776) with "rotate quaternion around x axis failed" + assert left rotation of {_v::3} is quaternion(0.4999999701976776, -0.4999999701976776, 0.4999999701976776, -0.4999999701976776) with "rotate display around x axis failed" + + rotate {_v::*} around z axis by -90 degrees + assert {_v::1} is vector(-1, -1, -1) with "rotate vector around z axis failed" + assert {_v::2} is quaternion(0, 0, 0.7071067094802856, -0.7071067094802856) with "rotate quaternion around z axis failed" + assert left rotation of {_v::3} is quaternion(0, 0, 0.7071067094802856, -0.7071067094802856) with "rotate display around z axis failed" + + delete entity within {_v::3} + +test "rotate around local axis": + set {_v::1} to vector(1, 1, 1) + set {_v::2} to quaternion(1, 0, 0, 0) + spawn block display at spawn of world "world": + set {_v::3} to entity + + rotate {_v::*} around local y axis by 90 degrees + assert {_v::1} is vector(1,1,1) with "rotate vector around local y axis unexpectedly modified vector" + assert {_v::2} is quaternion(0.7071067690849304, 0, 0.7071067690849304, 0) with "rotate quaternion around local y axis failed" + assert left rotation of {_v::3} is quaternion(0.7071067690849304, 0, 0.7071067690849304, 0) with "rotate display around local y axis failed" + + rotate {_v::*} around local x axis by 90 degrees + assert {_v::1} is vector(1,1,1) with "rotate vector around local x axis unexpectedly modified vector" + assert {_v::2} is quaternion(0.4999999701976776, 0.4999999701976776, 0.4999999701976776, -0.4999999701976776) with "rotate quaternion around local x axis failed" + assert left rotation of {_v::3} is quaternion(0.4999999701976776, 0.4999999701976776, 0.4999999701976776, -0.4999999701976776) with "rotate display around local x axis failed" + + rotate {_v::*} around local z axis by 90 degrees + assert {_v::1} is vector(1,1,1) with "rotate vector around local z axis unexpectedly modified vector" + assert {_v::2} is quaternion(0.7071067094802856, 0.7071067094802856, 0, 0) with "rotate quaternion around local z axis failed" + assert left rotation of {_v::3} is quaternion(0.7071067094802856, 0.7071067094802856, 0, 0) with "rotate display around local z axis failed" + + delete entity within {_v::3} + +test "vector rotate around vector": + set {_x} to vector(1, 0, 0) + set {_y} to vector(0, 1, 0) + set {_z} to vector(0, 0, 1) + + set {_v} to {_x} + rotate {_v} around {_y} by -90 degrees + assert {_v} is {_z} with "rotate around y vector failed" + + rotate {_v} around {_x} by -90 degrees + assert {_v} is {_y} with "rotate around x vector failed" + + rotate {_v} around {_z} by -90 degrees + assert {_v} is {_x} with "rotate around z vector failed" + + rotate {_v} around vector(1, 1, 1) by 180 degrees + assert {_v} is vector(-1/3, 2/3, 2/3) with "rotate around non-orthogonal vector failed" + + set {_v} to vector(2, 0, 0) + rotate {_v} around vector(0, 10, 0) by 90 degrees + assert {_v} is vector(0, 0, -2) with "rotate around non-unit vector failed" + + +test "quaternion rotate by ZYX rotation": + set {_q} to quaternion(1,0,0,0) + rotate {_q} by x 90, y 90, z 90 + assert {_q} is quaternion(0.7071067094802856, 0, 0.7071067094802856, 0) with "failed to rotate quaternion by ZYX" diff --git a/src/test/skript/tests/syntaxes/effects/EffVectorRotateAroundAnother.sk b/src/test/skript/tests/syntaxes/effects/EffVectorRotateAroundAnother.sk deleted file mode 100644 index 07d21ec5730..00000000000 --- a/src/test/skript/tests/syntaxes/effects/EffVectorRotateAroundAnother.sk +++ /dev/null @@ -1,21 +0,0 @@ -test "vector rotate around vector": - set {_x} to vector(1, 0, 0) - set {_y} to vector(0, 1, 0) - set {_z} to vector(0, 0, 1) - - set {_v} to {_x} - rotate {_v} around {_y} by -90 degrees - assert {_v} is {_z} with "rotate around y vector failed (expected %{_z}%, got %{_v}%)" - - rotate {_v} around {_x} by -90 degrees - assert {_v} is {_y} with "rotate around x vector failed (expected %{_y}%, got %{_v}%)" - - rotate {_v} around {_z} by -90 degrees - assert {_v} is {_x} with "rotate around z vector failed (expected %{_x}%, got %{_v}%)" - - rotate {_v} around vector(1, 1, 1) by 180 degrees - assert {_v} is vector(-1/3, 2/3, 2/3) with "rotate around non-orthogonal vector failed (expected %vector(-1/3, 2/3, 2/3)%, got %{_v}%)" - - set {_v} to vector(2, 0, 0) - rotate {_v} around vector(0, 10, 0) by 90 degrees - assert {_v} is vector(0, 0, -2) with "rotate around non-unit vector failed (expected %vector(0, 0, -2)%, got %{_v}%)" diff --git a/src/test/skript/tests/syntaxes/effects/EffVectorRotateXYZ.sk b/src/test/skript/tests/syntaxes/effects/EffVectorRotateXYZ.sk deleted file mode 100644 index 72adc840f8f..00000000000 --- a/src/test/skript/tests/syntaxes/effects/EffVectorRotateXYZ.sk +++ /dev/null @@ -1,11 +0,0 @@ -test "vector rotate around axis": - - set {_v} to vector(1, 1, 1) - rotate {_v} around y axis by 90 degrees - assert {_v} is vector(1, 1, -1) with "rotate around y vector failed (expected %vector(1, 1, -1)%, got %{_v}%)" - - rotate {_v} around x axis by -90 degrees - assert {_v} is vector(1, -1, -1) with "rotate around x vector failed (expected %vector(1, -1, -1)%, got %{_v}%)" - - rotate {_v} around z axis by -90 degrees - assert {_v} is vector(-1, -1, -1) with "rotate around z vector failed (expected %vector(-1, -1, -1)%, got %{_v}%)" diff --git a/src/test/skript/tests/syntaxes/expressions/ExprRotate.sk b/src/test/skript/tests/syntaxes/expressions/ExprRotate.sk new file mode 100644 index 00000000000..14271ae9a8c --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprRotate.sk @@ -0,0 +1,51 @@ +test "rotate around global axis": + set {_v::1} to quaternion(1, 0, 0, 0) + + set {_v::*} to {_v::*} rotated around y axis by 90 degrees + assert {_v::1} is quaternion(0.7071067690849304, 0, 0.7071067690849304, 0) with "rotate quaternion around y axis failed" + + set {_v::*} to {_v::*} rotated around x axis by -90 degrees + assert {_v::1} is quaternion(0.4999999701976776, -0.4999999701976776, 0.4999999701976776, -0.4999999701976776) with "rotate quaternion around x axis failed" + + set {_v::*} to {_v::*} rotated around z axis by -90 degrees + assert {_v::1} is quaternion(0, 0, 0.7071067094802856, -0.7071067094802856) with "rotate quaternion around z axis failed" + +test "rotate around local axis": + set {_v::1} to quaternion(1, 0, 0, 0) + + set {_v::*} to {_v::*} rotated around local y axis by 90 degrees + assert {_v::1} is quaternion(0.7071067690849304, 0, 0.7071067690849304, 0) with "rotate quaternion around local y axis failed" + + set {_v::*} to {_v::*} rotated around local x axis by 90 degrees + assert {_v::1} is quaternion(0.4999999701976776, 0.4999999701976776, 0.4999999701976776, -0.4999999701976776) with "rotate quaternion around local x axis failed" + + set {_v::*} to {_v::*} rotated around local z axis by 90 degrees + assert {_v::1} is quaternion(0.7071067094802856, 0.7071067094802856, 0, 0) with "rotate quaternion around local z axis failed" + +test "vector rotate around vector": + set {_x} to vector(1, 0, 0) + set {_y} to vector(0, 1, 0) + set {_z} to vector(0, 0, 1) + + set {_v} to {_x} + set {_v} to {_v} rotated around {_y} by -90 degrees + assert {_v} is {_z} with "rotate around y vector failed" + + set {_v} to {_v} rotated around {_x} by -90 degrees + assert {_v} is {_y} with "rotate around x vector failed" + + set {_v} to {_v} rotated around {_z} by -90 degrees + assert {_v} is {_x} with "rotate around z vector failed" + + set {_v} to {_v} rotated around vector(1, 1, 1) by 180 degrees + assert {_v} is vector(-1/3, 2/3, 2/3) with "rotate around non-orthogonal vector failed" + + set {_v} to vector(2, 0, 0) + set {_v} to {_v} rotated around vector(0, 10, 0) by 90 degrees + assert {_v} is vector(0, 0, -2) with "rotate around non-unit vector failed" + + +test "quaternion rotate by ZYX rotation": + set {_q} to quaternion(1,0,0,0) + set {_q} to {_q} rotated by x 90, y 90, z 90 + assert {_q} is quaternion(0.7071067094802856, 0, 0.7071067094802856, 0) with "failed to rotate quaternion by ZYX" From 49dbe0b6085db511a7bbe0bfefd7f7a9bad2e28a Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 13 Aug 2024 21:20:30 -0700 Subject: [PATCH 084/104] Add drop shadow syntax and small cleanup of ExprTextOf --- .../text/CondTextDisplayHasDropShadow.java | 49 +++++++++++++++ .../text/EffTextDisplayDropShadow.java | 61 +++++++++++++++++++ .../bukkit/misc/expressions/ExprTextOf.java | 18 +++--- .../effects/EffTextDisplayDropShadow.sk | 19 ++++++ .../tests/syntaxes/expressions/ExprTextOf.sk | 25 ++++++++ 5 files changed, 163 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java create mode 100644 src/test/skript/tests/syntaxes/effects/EffTextDisplayDropShadow.sk create mode 100644 src/test/skript/tests/syntaxes/expressions/ExprTextOf.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java new file mode 100644 index 00000000000..f6a01f7ee95 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java @@ -0,0 +1,49 @@ +package org.skriptlang.skript.bukkit.displays.text; + +import ch.njol.skript.Skript; +import ch.njol.skript.conditions.base.PropertyCondition; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.util.Kleenean; +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; + +@Name("Text Display Has Drop Shadow") +@Description("Returns whether the text of a display has drop shadow applied.") +@Examples({ + "if {_display} has drop shadow:", + "\tremove drop shadow from the text of {_display}" +}) +@Since("INSERT VERSION") +public class CondTextDisplayHasDropShadow extends PropertyCondition { + + static { + Skript.registerCondition(CondTextDisplayHasDropShadow.class, + "[[the] text of] %displays% (has|have) (drop|text) shadow", + "%displays%'[s] text (has|have) (drop|text) shadow", + "[[the] text of] %displays% (doesn't|does not|do not|don't) have (drop|text) shadow", + "%displays%'[s] text (doesn't|does not|do not|don't) have (drop|text) shadow" + ); + } + + @Override + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + super.init(expressions, matchedPattern, isDelayed, parseResult); + setNegated(matchedPattern > 1); + return true; + } + + @Override + public boolean check(Display value) { + return value instanceof TextDisplay textDisplay && textDisplay.isShadowed(); + } + + @Override + protected String getPropertyName() { + return "drop shadow"; + } +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java new file mode 100644 index 00000000000..1faebe5e3ab --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java @@ -0,0 +1,61 @@ +package org.skriptlang.skript.bukkit.displays.text; + +import ch.njol.skript.Skript; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Effect; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser; +import ch.njol.util.Kleenean; +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +@Name("Text Display Drop Shadow") +@Description("Applies or removes drop shadow from the displayed text on a text display.") +@Examples({ + "apply drop shadow to last spawned text display", + "if {_display} has drop shadow:", + "\tremove drop shadow from the text of {_display}" +}) +@Since("INSERT VERSION") +public class EffTextDisplayDropShadow extends Effect { + + static { + Skript.registerEffect(EffTextDisplayDropShadow.class, + "(apply|add) (drop|text) shadow to [[the] text of] %displays%", + "(apply|add) (drop|text) shadow to %displays%'[s] text", + "(remove|clear) (drop|text) shadow from [[the] text of] %displays%", + "(remove|clear) (drop|text) shadow from %displays%'[s] text" + ); + } + + Expression displays; + boolean shadowed; + + @Override + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + //noinspection unchecked + displays = (Expression) expressions[0]; + shadowed = matchedPattern <= 1; + return true; + } + + @Override + protected void execute(Event event) { + for (Display display : displays.getArray(event)) { + if (display instanceof TextDisplay textDisplay) + textDisplay.setShadowed(shadowed); + } + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + if (shadowed) + return "add drop shadow to " + displays.toString(event, debug); + return "remove drop shadow from " + displays.toString(event, debug); + } +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java index c2f674dddb7..cabc026965c 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java @@ -21,12 +21,13 @@ @Name("Text Of") @Description({ "Returns or changes the text/string of displays.", - "Note that you can only currently use Skript chat codes when running PaperSpigot 1.19.4+" + "Note that currently you can only use Skript chat codes when running Paper." }) @Examples("set text of the last spawned text display to \"example\"") @Since("INSERT VERSION") public class ExprTextOf extends SimplePropertyExpression { + private static final boolean IS_RUNNING_PAPER = Skript.getServerPlatform() == ServerPlatform.BUKKIT_PAPER; private static BungeeComponentSerializer serializer; static { @@ -36,21 +37,19 @@ public class ExprTextOf extends SimplePropertyExpression { types += "displays"; } // This is because this expression is setup to support future types. - // Remove this if non-verioning. + // Remove this if non-versioning. if (!types.isEmpty()) - register(ExprTextOf.class, String.class, "(string|text)[s]", types); + register(ExprTextOf.class, String.class, "(banana|string|text)[s]", types); } @Override - @Nullable - public String convert(Object object) { + public @Nullable String convert(Object object) { if (object instanceof TextDisplay) return ((TextDisplay) object).getText(); return null; } - @Nullable - public Class[] acceptChange(ChangeMode mode) { + public Class @Nullable [] acceptChange(ChangeMode mode) { switch (mode) { case ADD: case DELETE: @@ -66,12 +65,13 @@ public Class[] acceptChange(ChangeMode mode) { } @Override - public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + //noinspection ConstantConditions String value = mode == ChangeMode.RESET ? null : (String) delta[0]; for (Object object : getExpr().getArray(event)) { if (!(object instanceof TextDisplay)) continue; - if (Skript.getServerPlatform() == ServerPlatform.BUKKIT_PAPER && serializer != null) { + if (IS_RUNNING_PAPER && serializer != null && value != null) { BaseComponent[] components = BungeeConverter.convert(ChatMessages.parseToArray(value)); ((TextDisplay) object).text(serializer.deserialize(components)); } else { diff --git a/src/test/skript/tests/syntaxes/effects/EffTextDisplayDropShadow.sk b/src/test/skript/tests/syntaxes/effects/EffTextDisplayDropShadow.sk new file mode 100644 index 00000000000..9194b930e26 --- /dev/null +++ b/src/test/skript/tests/syntaxes/effects/EffTextDisplayDropShadow.sk @@ -0,0 +1,19 @@ +test "text display drop shadow": + spawn item display at spawn of world "world": + set {_id} to entity + + assert {_id} doesn't have drop shadow with "item display has drop shadow" + add drop shadow to {_id} + assert {_id} doesn't have drop shadow with "item display has drop shadow" + + delete entity within {_id} + spawn text display at spawn of world "world": + set {_td} to entity + + assert {_td} doesn't have drop shadow with "text display has drop shadow by default" + add drop shadow to {_td} + assert {_td}'s text has drop shadow with "failed to set drop shadow" + remove drop shadow from text of {_td} + assert {_td}'s text doesn't have drop shadow with "failed to remove drop shadow" + + delete entity within {_td} diff --git a/src/test/skript/tests/syntaxes/expressions/ExprTextOf.sk b/src/test/skript/tests/syntaxes/expressions/ExprTextOf.sk new file mode 100644 index 00000000000..706df1fa73f --- /dev/null +++ b/src/test/skript/tests/syntaxes/expressions/ExprTextOf.sk @@ -0,0 +1,25 @@ +test "text of text displays": + spawn item display at spawn of world "world": + set {_id} to entity + + assert text of {_id} is not set with "item display has text" + set text of {_id} to "55" + assert text of {_id} is not set with "item display has text" + reset text of {_id} + assert text of {_id} is not set with "item display has text" + + delete entity within {_id} + spawn text display at spawn of world "world": + set {_td} to entity + + assert text of {_td} is "" with "failed default text" + set text of {_td} to "hello!" + assert text of {_td} is "hello!" with "failed to set text" + set text of {_td} to "" + assert text of {_td} is "" with "failed to set text" + set text of {_td} to "èa_.21&*5ö!" + assert text of {_td} is "èa_.21&*5ö!" with "failed to set text" + reset text of {_td} + assert text of {_td} is "" with "failed to reset text" + + delete entity within {_td} From a54958ab6af9c30c839cf192e6aa4851c447de76 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 13 Aug 2024 21:46:50 -0700 Subject: [PATCH 085/104] See through blocks syntax --- .../text/CondTextDisplayHasDropShadow.java | 5 +- .../text/CondTextDisplaySeeThroughBlocks.java | 33 ++++++++++ .../text/EffTextDisplayDropShadow.java | 5 +- .../text/EffTextDisplaySeeThroughBlocks.java | 60 +++++++++++++++++++ .../EffTextDisplayCanSeeThtroughBlocks.sk | 19 ++++++ 5 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplaySeeThroughBlocks.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplaySeeThroughBlocks.java create mode 100644 src/test/skript/tests/syntaxes/effects/EffTextDisplayCanSeeThtroughBlocks.sk diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java index f6a01f7ee95..b7d0563a586 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java @@ -7,7 +7,7 @@ import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import org.bukkit.entity.Display; import org.bukkit.entity.TextDisplay; @@ -31,7 +31,7 @@ public class CondTextDisplayHasDropShadow extends PropertyCondition { } @Override - public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { super.init(expressions, matchedPattern, isDelayed, parseResult); setNegated(matchedPattern > 1); return true; @@ -46,4 +46,5 @@ public boolean check(Display value) { protected String getPropertyName() { return "drop shadow"; } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplaySeeThroughBlocks.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplaySeeThroughBlocks.java new file mode 100644 index 00000000000..2339223f9c2 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplaySeeThroughBlocks.java @@ -0,0 +1,33 @@ +package org.skriptlang.skript.bukkit.displays.text; + +import ch.njol.skript.conditions.base.PropertyCondition; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; + +@Name("Text Display Visible Through Blocks") +@Description("Returns whether text displays can be seen through blocks or not.") +@Examples({ + "if last spawned text display is visible through walls:", + "\tprevent last spawned text display from being visible through walls" +}) +@Since("INSERT VERSION") +public class CondTextDisplaySeeThroughBlocks extends PropertyCondition { + + static { + register(CondTextDisplaySeeThroughBlocks.class, "visible through (blocks|walls)", "displays"); + } + + @Override + public boolean check(Display value) { + return value instanceof TextDisplay textDisplay && textDisplay.isSeeThrough(); + } + + @Override + protected String getPropertyName() { + return "visible through blocks"; + } +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java index 1faebe5e3ab..9b9a3ec71b7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java @@ -7,7 +7,7 @@ import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Effect; import ch.njol.skript.lang.Expression; -import ch.njol.skript.lang.SkriptParser; +import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import org.bukkit.entity.Display; import org.bukkit.entity.TextDisplay; @@ -37,7 +37,7 @@ public class EffTextDisplayDropShadow extends Effect { boolean shadowed; @Override - public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { //noinspection unchecked displays = (Expression) expressions[0]; shadowed = matchedPattern <= 1; @@ -58,4 +58,5 @@ public String toString(@Nullable Event event, boolean debug) { return "add drop shadow to " + displays.toString(event, debug); return "remove drop shadow from " + displays.toString(event, debug); } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplaySeeThroughBlocks.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplaySeeThroughBlocks.java new file mode 100644 index 00000000000..1ef4dc35ad1 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplaySeeThroughBlocks.java @@ -0,0 +1,60 @@ +package org.skriptlang.skript.bukkit.displays.text; + +import ch.njol.skript.Skript; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Examples; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.lang.Effect; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; +import ch.njol.util.Kleenean; +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; + +@Name("Text Display See Through Blocks") +@Description("Forces a text display to either be or not be visible through blocks.") +@Examples({ + "force last spawned text display to be visible through walls", + "prevent all text displays from being visible through walls" +}) +@Since("INSERT VERSION") +public class EffTextDisplaySeeThroughBlocks extends Effect { + + static { + Skript.registerEffect(EffTextDisplaySeeThroughBlocks.class, + "make %displays% visible through (blocks|walls)", + "force %displays% to be visible through (blocks|walls)", + "prevent %displays% from being (visible|seen) through (blocks|walls)" + ); + } + + Expression displays; + boolean canSee; + + @Override + public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + //noinspection unchecked + displays = (Expression) expressions[0]; + canSee = matchedPattern != 2; + return true; + } + + @Override + protected void execute(Event event) { + for (Display display : displays.getArray(event)) { + if (display instanceof TextDisplay textDisplay) + textDisplay.setSeeThrough(canSee); + } + } + + @Override + public String toString(@Nullable Event event, boolean debug) { + if (canSee) + return "force " + displays.toString(event, debug) + " to be visible through blocks"; + return "prevent " + displays.toString(event, debug) + " from being visible through blocks"; + } + +} diff --git a/src/test/skript/tests/syntaxes/effects/EffTextDisplayCanSeeThtroughBlocks.sk b/src/test/skript/tests/syntaxes/effects/EffTextDisplayCanSeeThtroughBlocks.sk new file mode 100644 index 00000000000..ffcb160f5ad --- /dev/null +++ b/src/test/skript/tests/syntaxes/effects/EffTextDisplayCanSeeThtroughBlocks.sk @@ -0,0 +1,19 @@ +test "text display see through blocks": + spawn item display at spawn of world "world": + set {_id} to entity + + assert {_id} isn't visible through walls with "item display can be seen through walls" + force {_id} to be visible through walls + assert {_id} isn't visible through walls with "item display can be seen through walls" + + delete entity within {_id} + spawn text display at spawn of world "world": + set {_td} to entity + + assert {_td} isn't visible through walls with "text display can be seen through walls by default" + force {_td} to be visible through walls + assert {_td} is visible through walls with "failed to make see through" + prevent {_td} from being visible through walls + assert {_td} isn't visible through walls with "failed to prevent see through" + + delete entity within {_td} From 568dde59c6ebbf6622b98ecb7d6958e67bee4505 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 13 Aug 2024 21:52:07 -0700 Subject: [PATCH 086/104] Update ExprRotate.java --- .../skriptlang/skript/bukkit/misc/expressions/ExprRotate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java index 45c8bf6bfff..23a3b395dea 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java @@ -24,7 +24,7 @@ import java.util.Locale; import java.util.Objects; -@Name("Rotate Quaternion/Vector") +@Name("Rotated Quaternion/Vector") @Description({ "Rotates a Quaternion or Vector around an axis a set amount of degrees, or around all 3 axes at once.", "Vectors can only be rotated around the global X/Y/Z axes, or an arbitrary vector axis.", From d7c09af7be2af698165858b8af31ba92988e9a4d Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 13 Aug 2024 22:09:05 -0700 Subject: [PATCH 087/104] remove extra [a]'s --- src/main/resources/lang/default.lang | 6 +++--- .../tests/syntaxes/effects/EffTextDisplayDropShadow.sk | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index ac7a83987d9..3962b458269 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1243,16 +1243,16 @@ entities: pattern: interaction(|1¦s) display: name: display¦s - pattern: [a] display(|1¦s) [entity] + pattern: display(|1¦s) [entity] block display: name: block display¦s - pattern: [a] block display(|1¦s) [entity] [of %-blockdata/itemtype%] + pattern: block display(|1¦s) [entity] [of %-blockdata/itemtype%] item display: name: item display¦s pattern: item display(|1¦s) [entity] [of %-itemtype%] text display: name: text display¦s - pattern: [a] text display(|1¦s) [entity] + pattern: text display(|1¦s) [entity] # 1.20.3 Entities breeze: name: breeze¦s diff --git a/src/test/skript/tests/syntaxes/effects/EffTextDisplayDropShadow.sk b/src/test/skript/tests/syntaxes/effects/EffTextDisplayDropShadow.sk index 9194b930e26..9516a0a7106 100644 --- a/src/test/skript/tests/syntaxes/effects/EffTextDisplayDropShadow.sk +++ b/src/test/skript/tests/syntaxes/effects/EffTextDisplayDropShadow.sk @@ -1,5 +1,5 @@ test "text display drop shadow": - spawn item display at spawn of world "world": + spawn an item display at spawn of world "world": set {_id} to entity assert {_id} doesn't have drop shadow with "item display has drop shadow" @@ -7,7 +7,7 @@ test "text display drop shadow": assert {_id} doesn't have drop shadow with "item display has drop shadow" delete entity within {_id} - spawn text display at spawn of world "world": + spawn a text display at spawn of world "world": set {_td} to entity assert {_td} doesn't have drop shadow with "text display has drop shadow by default" From 0e105cfd347c20022d5260a3f76b33a41ddc1e95 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 13 Aug 2024 22:10:42 -0700 Subject: [PATCH 088/104] whoops! reverts a change to number accuracy config done for testing --- src/main/resources/config.sk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/config.sk b/src/main/resources/config.sk index 8d010645639..ff5e1e9e40a 100644 --- a/src/main/resources/config.sk +++ b/src/main/resources/config.sk @@ -136,7 +136,7 @@ listen to cancelled events by default: false # Determines whether `on ` will be triggered by all events (true) or only uncancelled events (false). # The default is false, which maintains traditional Skript behavior. -number accuracy: 20 +number accuracy: 2 # How many digits should be displayed after the dot at maximum when displaying numbers. # Zeroes will never be displayed at all, so this setting only applies to numbers that actually have a decimal part with one or more non-zero digits. # Money bypasses this setting and is displayed as configured in your economy plugin if you have one. From a0117a9d8966e80f08c337ade68c189fb1b084a2 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:36:11 -0700 Subject: [PATCH 089/104] Module-ize, package infos, remove mc version checks --- build.gradle | 2 +- src/main/java/ch/njol/skript/Skript.java | 5 +- .../skript/classes/data/BukkitClasses.java | 105 ++++++------------ .../skript/classes/data/DefaultFunctions.java | 4 +- .../njol/skript/classes/data/JavaClasses.java | 3 +- .../skript/bukkit/displays/DisplayModule.java | 54 +++++++++ .../expressions/ExprDisplayBillboard.java | 15 +-- .../expressions/ExprDisplayBrightness.java | 9 +- .../expressions/ExprDisplayGlowOverride.java | 13 +-- .../expressions/ExprDisplayHeightWidth.java | 11 +- .../expressions/ExprDisplayInterpolation.java | 6 +- .../expressions/ExprDisplayShadow.java | 13 +-- .../ExprDisplayTransformationRotation.java | 6 +- ...DisplayTransformationScaleTranslation.java | 6 +- .../expressions/ExprDisplayViewRange.java | 13 +-- .../displays/expressions/package-info.java | 2 +- .../item/ExprItemDisplayTransform.java | 17 +-- .../text/ExprTextDisplayAlignment.java | 17 +-- .../text/ExprTextDisplayLineWidth.java | 15 +-- .../displays/text/ExprTextDisplayOpacity.java | 6 +- .../bukkit/misc}/effects/EffRotate.java | 18 ++- .../bukkit/misc/effects/package-info.java | 5 + .../misc/expressions/ExprItemOfEntity.java | 9 +- .../expressions/ExprQuaternionAxisAngle.java | 2 +- .../bukkit/misc/expressions/ExprTextOf.java | 2 +- .../bukkit/misc/expressions/package-info.java | 5 + .../bukkit/misc/rotation/package-info.java | 5 + 27 files changed, 171 insertions(+), 197 deletions(-) create mode 100644 src/main/java/org/skriptlang/skript/bukkit/displays/DisplayModule.java rename src/main/java/{ch/njol/skript => org/skriptlang/skript/bukkit/misc}/effects/EffRotate.java (95%) create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/effects/package-info.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/expressions/package-info.java create mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/rotation/package-info.java diff --git a/build.gradle b/build.gradle index 08f70d6cadf..a01120a07b3 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ dependencies { // Comes from Minecraft including Guava or Gson implementation group: 'com.google.code.findbugs', name: 'findbugs', version: '3.0.1' - // bundled with Minecraft 1.19.4+ + // bundled with Minecraft 1.19.4+ for display entity transforms implementation group: 'org.joml', name: 'joml', version: '1.10.5' // Plugin hook libraries diff --git a/src/main/java/ch/njol/skript/Skript.java b/src/main/java/ch/njol/skript/Skript.java index b98afe1b526..9e836c0ad47 100644 --- a/src/main/java/ch/njol/skript/Skript.java +++ b/src/main/java/ch/njol/skript/Skript.java @@ -111,6 +111,7 @@ import org.junit.After; import org.junit.runner.JUnitCore; import org.junit.runner.Result; +import org.skriptlang.skript.bukkit.displays.DisplayModule; import org.skriptlang.skript.lang.comparator.Comparator; import org.skriptlang.skript.lang.comparator.Comparators; import org.skriptlang.skript.lang.converter.Converter; @@ -556,7 +557,9 @@ public void onEnable() { try { getAddonInstance().loadClasses("ch.njol.skript", "conditions", "effects", "events", "expressions", "entity", "sections", "structures"); - getAddonInstance().loadClasses("org.skriptlang.skript.bukkit", "displays", "misc"); + getAddonInstance().loadClasses("org.skriptlang.skript.bukkit", "misc"); + // todo: become proper module once registry api is merged + DisplayModule.load(); } catch (final Exception e) { exception(e, "Could not load required .class files: " + e.getLocalizedMessage()); setEnabled(false); diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 6f8a2124bcc..9ad42420c93 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -18,18 +18,32 @@ */ package ch.njol.skript.classes.data; -import java.io.StreamCorruptedException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; -import java.util.Map.Entry; -import java.util.UUID; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - +import ch.njol.skript.Skript; +import ch.njol.skript.SkriptConfig; +import ch.njol.skript.aliases.Aliases; +import ch.njol.skript.aliases.ItemType; import ch.njol.skript.bukkitutil.BukkitUtils; +import ch.njol.skript.bukkitutil.EnchantmentUtils; +import ch.njol.skript.bukkitutil.ItemUtils; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.ConfigurationSerializer; +import ch.njol.skript.classes.EnumClassInfo; +import ch.njol.skript.classes.Parser; +import ch.njol.skript.classes.Serializer; +import ch.njol.skript.classes.registry.RegistryClassInfo; +import ch.njol.skript.entity.EntityData; +import ch.njol.skript.expressions.ExprDamageCause; +import ch.njol.skript.expressions.base.EventValueExpression; +import ch.njol.skript.lang.ParseContext; +import ch.njol.skript.lang.util.SimpleLiteral; +import ch.njol.skript.localization.Language; +import ch.njol.skript.registrations.Classes; +import ch.njol.skript.util.BlockUtils; +import ch.njol.skript.util.PotionEffectUtils; +import ch.njol.skript.util.StringMode; +import ch.njol.util.StringUtils; +import ch.njol.yggdrasil.Fields; +import io.papermc.paper.world.MoonPhase; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Difficulty; @@ -53,16 +67,12 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.EnchantmentOffer; import org.bukkit.entity.Cat; -import org.bukkit.entity.Display; -import org.bukkit.entity.Display.Billboard; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; -import org.bukkit.entity.ItemDisplay.ItemDisplayTransform; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Panda.Gene; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; -import org.bukkit.entity.TextDisplay.TextAlignment; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; @@ -83,34 +93,19 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.util.CachedServerIcon; import org.bukkit.util.Vector; - -import ch.njol.skript.Skript; -import ch.njol.skript.SkriptConfig; -import ch.njol.skript.aliases.Aliases; -import ch.njol.skript.aliases.ItemType; -import ch.njol.skript.bukkitutil.EnchantmentUtils; -import ch.njol.skript.bukkitutil.ItemUtils; -import ch.njol.skript.classes.ClassInfo; -import ch.njol.skript.classes.ConfigurationSerializer; -import ch.njol.skript.classes.EnumClassInfo; -import ch.njol.skript.classes.Parser; -import ch.njol.skript.classes.Serializer; -import ch.njol.skript.classes.registry.RegistryClassInfo; -import ch.njol.skript.entity.EntityData; -import ch.njol.skript.expressions.ExprDamageCause; -import ch.njol.skript.expressions.base.EventValueExpression; -import ch.njol.skript.lang.ParseContext; -import ch.njol.skript.lang.util.SimpleLiteral; -import ch.njol.skript.localization.Language; -import ch.njol.skript.registrations.Classes; -import ch.njol.skript.util.BlockUtils; -import ch.njol.skript.util.PotionEffectUtils; -import ch.njol.skript.util.StringMode; -import ch.njol.util.StringUtils; -import ch.njol.yggdrasil.Fields; -import io.papermc.paper.world.MoonPhase; import org.jetbrains.annotations.Nullable; +import java.io.StreamCorruptedException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Map.Entry; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + public class BukkitClasses { public BukkitClasses() {} @@ -1528,34 +1523,6 @@ public String toVariableNameString(EnchantmentOffer eo) { .description("Represents a transform reason of an entity transform event.") .since("2.8.0")); - if (Skript.classExists("org.bukkit.entity.Display")) { - Classes.registerClass(new ClassInfo<>(Display.class, "display") - .user("displays?") - .name("Display Entity") - .description("A text, block or item display entity.") - .since("INSERT VERSION") - .defaultExpression(new EventValueExpression<>(Display.class)) - .changer(DefaultChangers.nonLivingEntityChanger)); - - Classes.registerClass(new EnumClassInfo<>(Billboard.class, "billboard", "billboards") - .user("billboards?") - .name("Display Billboard") - .description("Represents the billboard setting of a display.") - .since("INSERT VERSION")); - - Classes.registerClass(new EnumClassInfo<>(TextAlignment.class, "textalignment", "text alignments") - .user("text ?alignments?") - .name("Display Text Alignment") - .description("Represents the text alignment setting of a text display.") - .since("INSERT VERSION")); - - Classes.registerClass(new EnumClassInfo<>(ItemDisplayTransform.class, "itemdisplaytransform", "item display transforms") - .user("item ?display ?transforms?") - .name("Item Display Transforms") - .description("Represents the transform setting of an item display.") - .since("INSERT VERSION")); - } // end displays - } } diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index 5e1abad1778..2e750c228de 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -643,7 +643,7 @@ public String[] executeSimple(Object[][] params) { "concat(\"foo \", 100, \" bar\") # foo 100 bar" ).since("2.9.0"); - // display entities + // joml functions - for display entities { if (Skript.classExists("org.joml.Quaternionf")) { Functions.registerFunction(new SimpleJavaFunction<>("quaternion", new Parameter[]{ @@ -685,7 +685,7 @@ public Quaternionf[] executeSimple(Object[][] params) { .examples("axisangle(90, (vector from player's facing))") .since("INSERT VERSION"); } - }// end display entities + } // end joml functions } diff --git a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java index d852968c6e2..5485a852386 100644 --- a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java @@ -631,11 +631,12 @@ public boolean mustSyncDeserialization() { } })); + // joml type - for display entities if (Skript.classExists("org.joml.Quaternionf")) Classes.registerClass(new ClassInfo<>(Quaternionf.class, "quaternion") .user("quaternionf?s?") .name("Quaternion") - .description("Quaternions are used for representing x y z while having w representing the scale. All four numbers are real.") + .description("Quaternions are four dimensional vectors, often used for representing rotations.") .since("INSERT VERSION") .parser(new Parser<>() { public boolean canParse(ParseContext context) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayModule.java b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayModule.java new file mode 100644 index 00000000000..024552f3219 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayModule.java @@ -0,0 +1,54 @@ +package org.skriptlang.skript.bukkit.displays; + +import ch.njol.skript.Skript; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.classes.EnumClassInfo; +import ch.njol.skript.classes.data.DefaultChangers; +import ch.njol.skript.expressions.base.EventValueExpression; +import ch.njol.skript.registrations.Classes; +import org.bukkit.entity.Display; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.TextDisplay; + +import java.io.IOException; + +public class DisplayModule { + + public static void load() throws IOException { + // abort if no class exists + if (!Skript.classExists("org.bukkit.entity.Display")) + return; + + // load classes (todo: replace with registering methods after regitration api + Skript.getAddonInstance().loadClasses("org.skriptlang.skript.bukkit", "displays"); + + // Classes + + Classes.registerClass(new ClassInfo<>(Display.class, "display") + .user("displays?") + .name("Display Entity") + .description("A text, block or item display entity.") + .since("INSERT VERSION") + .defaultExpression(new EventValueExpression<>(Display.class)) + .changer(DefaultChangers.nonLivingEntityChanger)); + + Classes.registerClass(new EnumClassInfo<>(Display.Billboard.class, "billboard", "billboards") + .user("billboards?") + .name("Display Billboard") + .description("Represents the billboard setting of a display.") + .since("INSERT VERSION")); + + Classes.registerClass(new EnumClassInfo<>(TextDisplay.TextAlignment.class, "textalignment", "text alignments") + .user("text ?alignments?") + .name("Display Text Alignment") + .description("Represents the text alignment setting of a text display.") + .since("INSERT VERSION")); + + Classes.registerClass(new EnumClassInfo<>(ItemDisplay.ItemDisplayTransform.class, "itemdisplaytransform", "item display transforms") + .user("item ?display ?transforms?") + .name("Item Display Transforms") + .description("Represents the transform setting of an item display.") + .since("INSERT VERSION")); + } + +} diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java index de789e68339..ea35f311b9f 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java @@ -1,19 +1,16 @@ package org.skriptlang.skript.bukkit.displays.expressions; -import org.bukkit.entity.Display; -import org.bukkit.entity.Display.Billboard; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.entity.Display.Billboard; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Display Billboard") @Description({ @@ -22,13 +19,11 @@ "Displays spawn with the default setting as 'fixed'. Resetting this expression will also set it to 'fixed'." }) @Examples("set billboard of the last spawned text display to center") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayBillboard extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprDisplayBillboard.class, Billboard.class, "bill[ |-]board[ing] [setting]", "displays"); + registerDefault(ExprDisplayBillboard.class, Billboard.class, "bill[ |-]board[ing] [setting]", "displays"); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java index 8563a4d2932..a99dd053364 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java @@ -5,7 +5,6 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; @@ -39,15 +38,13 @@ "if sky light level override of {_display} is 5:", "\tclear brightness override of {_display}" }) -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayBrightness extends SimpleExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - Skript.registerExpression(ExprDisplayBrightness.class, Integer.class, ExpressionType.PROPERTY, - "[the] [:block|:sky] (light [level]|brightness) override[s] of %displays%", - "%displays%'[s] [:block|:sky] (light [level]|brightness) override[s]"); + Skript.registerExpression(ExprDisplayBrightness.class, Integer.class, ExpressionType.PROPERTY, + "[the] [:block|:sky] (light [level]|brightness) override[s] of %displays%", + "%displays%'[s] [:block|:sky] (light [level]|brightness) override[s]"); } private @UnknownNullability Expression displays; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java index c163b6f2381..eaf009e507b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java @@ -1,20 +1,17 @@ package org.skriptlang.skript.bukkit.displays.expressions; -import org.bukkit.entity.Display; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.util.Color; import ch.njol.skript.util.ColorRGB; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Display Glow Color Override") @Description({ @@ -22,13 +19,11 @@ "This overrides whatever color is already set for the scoreboard team of the displays." }) @Examples("set glow color override of the last spawned text display to blue") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayGlowOverride extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprDisplayGlowOverride.class, Color.class, "glow[ing] colo[u]r[s] override[s]", "displays"); + registerDefault(ExprDisplayGlowOverride.class, Color.class, "glow[ing] colo[u]r[s] override[s]", "displays"); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java index 4cf64a35232..1f6b5218006 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java @@ -1,10 +1,5 @@ package org.skriptlang.skript.bukkit.displays.expressions; -import org.bukkit.entity.Display; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -16,6 +11,9 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Display Height/Width") @Description({ @@ -31,8 +29,7 @@ public class ExprDisplayHeightWidth extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprDisplayHeightWidth.class, Float.class, "display (:height|width)", "displays"); + registerDefault(ExprDisplayHeightWidth.class, Float.class, "display (:height|width)", "displays"); } private boolean height; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java index ec2440a2d06..5e5f33a43a9 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java @@ -1,11 +1,9 @@ package org.skriptlang.skript.bukkit.displays.expressions; -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -27,13 +25,11 @@ "Resetting either value will return that value to 0." }) @Examples("set interpolation delay of the last spawned text display to 2 ticks") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayInterpolation extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprDisplayInterpolation.class, Timespan.class, "interpolation (:delay|duration)[s]", "displays"); + registerDefault(ExprDisplayInterpolation.class, Timespan.class, "interpolation (:delay|duration)[s]", "displays"); } private boolean delay; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java index 3709cfc76b2..91fdd38eaa9 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java @@ -1,32 +1,27 @@ package org.skriptlang.skript.bukkit.displays.expressions; -import org.bukkit.entity.Display; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Display Shadow Radius/Strength") @Description("Returns or changes the shadow radius/strength of displays.") @Examples("set shadow radius of the last spawned text display to 1.75") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayShadow extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprDisplayShadow.class, Float.class, "shadow (:radius|strength)", "displays"); + registerDefault(ExprDisplayShadow.class, Float.class, "shadow (:radius|strength)", "displays"); } private boolean radius; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java index 369be5b8012..cf0a9ad3e5f 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java @@ -1,11 +1,9 @@ package org.skriptlang.skript.bukkit.displays.expressions; -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -24,13 +22,11 @@ "The left rotation is applied first, with the right rotation then being applied based on the rotated axis." }) @Examples("set left transformation rotation of last spawned block display to quaternion(1, 0, 0, 0) # reset block display") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayTransformationRotation extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprDisplayTransformationRotation.class, Quaternionf.class, "(:left|right) [transformation] rotation", "displays"); + registerDefault(ExprDisplayTransformationRotation.class, Quaternionf.class, "(:left|right) [transformation] rotation", "displays"); } private boolean left; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java index c3e5a0485b0..297bf7fedbb 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java @@ -1,11 +1,9 @@ package org.skriptlang.skript.bukkit.displays.expressions; -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -22,13 +20,11 @@ @Name("Display Transformation Scale/Translation") @Description("Returns or changes the transformation scale or translation of displays.") @Examples("set transformation translation of display to vector from -0.5, -0.5, -0.5 # Center the display in the same position as a block") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayTransformationScaleTranslation extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - register(ExprDisplayTransformationScaleTranslation.class, Vector.class, "(display|[display] transformation) (:scale|translation)", "displays"); + register(ExprDisplayTransformationScaleTranslation.class, Vector.class, "(display|[display] transformation) (:scale|translation)", "displays"); } private boolean scale; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java index 953ac72e697..d410c4845a0 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java @@ -1,18 +1,15 @@ package org.skriptlang.skript.bukkit.displays.expressions; -import org.bukkit.entity.Display; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Display View Range") @Description({ @@ -21,13 +18,11 @@ "For example, a player with 150% entity view distance will see a block display with a view range of 1.2 at 1.2 * 64 * 150% = 115.2 blocks away." }) @Examples("set view range of the last spawned text display to 2.9") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayViewRange extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprDisplayViewRange.class, Float.class, "[display] view (range|radius)", "displays"); + registerDefault(ExprDisplayViewRange.class, Float.class, "[display] view (range|radius)", "displays"); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java index 6c8b5e1eeaa..498436ee4bd 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java @@ -1,4 +1,4 @@ -@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) +@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE}) package org.skriptlang.skript.bukkit.displays.expressions; import org.eclipse.jdt.annotation.DefaultLocation; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java index e7dc9399cd1..8260bfcf486 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java @@ -1,31 +1,26 @@ package org.skriptlang.skript.bukkit.displays.item; -import org.bukkit.entity.Display; -import org.bukkit.entity.ItemDisplay; -import org.bukkit.entity.ItemDisplay.ItemDisplayTransform; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.entity.ItemDisplay.ItemDisplayTransform; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Item Display Transform") @Description("Returns or changes the item display transform of item displays.") @Examples("set the item transform of the last spawned item display to no transform # Reset to default") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprItemDisplayTransform extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprItemDisplayTransform.class, ItemDisplayTransform.class, "item [display] transform", "displays"); + registerDefault(ExprItemDisplayTransform.class, ItemDisplayTransform.class, "item [display] transform", "displays"); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java index c414f04e56e..f123d3aa3c1 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayAlignment.java @@ -1,31 +1,26 @@ package org.skriptlang.skript.bukkit.displays.text; -import org.bukkit.entity.Display; -import org.bukkit.entity.TextDisplay; -import org.bukkit.entity.TextDisplay.TextAlignment; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; +import org.bukkit.entity.TextDisplay.TextAlignment; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Text Display Alignment") @Description("Returns or changes the alignment setting of text displays.") @Examples("set text alignment of the last spawned text display to left") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprTextDisplayAlignment extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprTextDisplayAlignment.class, TextAlignment.class, "text alignment[s]", "displays"); + registerDefault(ExprTextDisplayAlignment.class, TextAlignment.class, "text alignment[s]", "displays"); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java index 3196de1ecb6..0c6fb3f45d8 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java @@ -1,30 +1,25 @@ package org.skriptlang.skript.bukkit.displays.text; -import org.bukkit.entity.Display; -import org.bukkit.entity.TextDisplay; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; @Name("Text Display Line Width") @Description("Returns or changes the line width of text displays. Default is 200.") @Examples("set the line width of the last spawned text display to 300") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprTextDisplayLineWidth extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprTextDisplayLineWidth.class, Integer.class, "line width", "displays"); + registerDefault(ExprTextDisplayLineWidth.class, Integer.class, "line width", "displays"); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java index 71e01a54c0a..18318fce16d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java @@ -1,11 +1,9 @@ package org.skriptlang.skript.bukkit.displays.text; -import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.util.Math2; @@ -21,13 +19,11 @@ "Values are between -127 and 127. The value of 127 represents it being completely opaque." }) @Examples("set the opacity of the last spawned text display to -1 # Reset") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprTextDisplayOpacity extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) - registerDefault(ExprTextDisplayOpacity.class, Byte.class, "[display] opacity", "displays"); + registerDefault(ExprTextDisplayOpacity.class, Byte.class, "[display] opacity", "displays"); } @Override diff --git a/src/main/java/ch/njol/skript/effects/EffRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java similarity index 95% rename from src/main/java/ch/njol/skript/effects/EffRotate.java rename to src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java index fd7b02832a2..6ec74543231 100644 --- a/src/main/java/ch/njol/skript/effects/EffRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java @@ -1,4 +1,4 @@ -package ch.njol.skript.effects; +package org.skriptlang.skript.bukkit.misc.effects; import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; @@ -169,23 +169,19 @@ protected void execute(Event event) { @Override public String toString(@Nullable Event event, boolean debug) { - switch (matchedPattern) { - case 0, 1: - return "rotate " + toRotate.toString(event, debug) + + return switch (matchedPattern) { + case 0, 1 -> "rotate " + toRotate.toString(event, debug) + " around the " + axis + "-axis " + "by " + angle.toString(event, debug) + " degrees"; - case 2: - return "rotate " + toRotate.toString(event, debug) + + case 2 -> "rotate " + toRotate.toString(event, debug) + " around " + vector.toString(event, debug) + "-axis " + "by " + angle.toString(event, debug) + " degrees"; - case 3: - return "rotate " + toRotate.toString(event, debug) + + case 3 -> "rotate " + toRotate.toString(event, debug) + " by x " + x.toString(event, debug) + ", " + "y " + y.toString(event, debug) + ", " + "and z " + z.toString(event, debug); - } - assert false; - return "invalid"; + default -> "invalid"; + }; } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/package-info.java new file mode 100644 index 00000000000..5b2ab2f87f2 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/package-info.java @@ -0,0 +1,5 @@ +@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE}) +package org.skriptlang.skript.bukkit.misc.effects; + +import org.eclipse.jdt.annotation.DefaultLocation; +import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java index 0261946c99f..9dd5b7d8549 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java @@ -1,10 +1,8 @@ package org.skriptlang.skript.bukkit.misc.expressions; -import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.util.slot.DisplayEntitySlot; @@ -33,11 +31,8 @@ "set the item inside of event-entity to a diamond sword named \"Example\"" }) @Since("2.2-dev35, 2.2-dev36 (improved), 2.5.2 (throwable projectiles)") -@RequiredPlugins("Minecraft 1.15.2+ (throwable projectiles), 1.19.4+ (displays)") public class ExprItemOfEntity extends SimplePropertyExpression { - private static final boolean PROJECTILE_SUPPORT = Skript.classExists("org.bukkit.entity.ThrowableProjectile"); - private static final boolean DISPLAYS_SUPPORT = Skript.classExists("org.bukkit.entity.ItemDisplay"); static { register(ExprItemOfEntity.class, Slot.class, "[the] item [inside]", "entities"); @@ -49,9 +44,9 @@ public class ExprItemOfEntity extends SimplePropertyExpression { return new ItemFrameSlot((ItemFrame) entity); } else if (entity instanceof Item) { return new DroppedItemSlot((Item) entity); - } else if (PROJECTILE_SUPPORT && entity instanceof ThrowableProjectile) { + } else if (entity instanceof ThrowableProjectile) { return new ThrowableProjectileSlot((ThrowableProjectile) entity); - } else if (DISPLAYS_SUPPORT && entity instanceof ItemDisplay) { + } else if (entity instanceof ItemDisplay) { return new DisplayEntitySlot((ItemDisplay) entity); } return null; // Other entities don't have associated items diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java index 6f72007880a..c8d7d6a4db7 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java @@ -36,7 +36,7 @@ public class ExprQuaternionAxisAngle extends SimplePropertyExpression { static { - if (Skript.isRunningMinecraft(1, 19, 4)) + if (Skript.classExists("org.joml.Quaternionf")) register(ExprQuaternionAxisAngle.class, Object.class, "rotation (angle|:axis)", "quaternions"); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java index cabc026965c..48475fbc71e 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java @@ -32,7 +32,7 @@ public class ExprTextOf extends SimplePropertyExpression { static { String types = ""; - if (Skript.isRunningMinecraft(1, 19, 4)) { + if (Skript.classExists("org.bukkit.entity.Display")) { serializer = BungeeComponentSerializer.get(); types += "displays"; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/package-info.java new file mode 100644 index 00000000000..3c08c41d4f8 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/package-info.java @@ -0,0 +1,5 @@ +@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE}) +package org.skriptlang.skript.bukkit.misc.expressions; + +import org.eclipse.jdt.annotation.DefaultLocation; +import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/package-info.java new file mode 100644 index 00000000000..55e4805502c --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/package-info.java @@ -0,0 +1,5 @@ +@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE}) +package org.skriptlang.skript.bukkit.misc.rotation; + +import org.eclipse.jdt.annotation.DefaultLocation; +import org.eclipse.jdt.annotation.NonNullByDefault; From a7b31ce0530e673bdaf612b9befbf3686080ecc6 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 16 Aug 2024 15:48:56 -0700 Subject: [PATCH 090/104] rename display.expressions package, use for loops, move displaydata --- .../njol/skript/expressions/ExprColorOf.java | 2 +- .../skript/bukkit/displays}/DisplayData.java | 27 ++-------- .../ExprDisplayBillboard.java | 2 +- .../ExprDisplayBrightness.java | 2 +- .../ExprDisplayGlowOverride.java | 2 +- .../ExprDisplayHeightWidth.java | 2 +- .../ExprDisplayInterpolation.java | 2 +- .../ExprDisplayShadow.java | 2 +- .../ExprDisplayTeleportDuration.java | 2 +- .../ExprDisplayTransformationRotation.java | 2 +- ...DisplayTransformationScaleTranslation.java | 2 +- .../ExprDisplayViewRange.java | 2 +- .../package-info.java | 2 +- .../skript/bukkit/misc/effects/EffRotate.java | 52 +++++++++---------- 14 files changed, 41 insertions(+), 62 deletions(-) rename src/main/java/{ch/njol/skript/entity => org/skriptlang/skript/bukkit/displays}/DisplayData.java (85%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayBillboard.java (97%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayBrightness.java (99%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayGlowOverride.java (97%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayHeightWidth.java (98%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayInterpolation.java (98%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayShadow.java (97%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayTeleportDuration.java (97%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayTransformationRotation.java (98%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayTransformationScaleTranslation.java (98%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/ExprDisplayViewRange.java (97%) rename src/main/java/org/skriptlang/skript/bukkit/displays/{expressions => generic}/package-info.java (75%) diff --git a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java index 18dd5004a2c..e46cfa1fc33 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprColorOf.java +++ b/src/main/java/ch/njol/skript/expressions/ExprColorOf.java @@ -25,7 +25,7 @@ import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; -import ch.njol.skript.entity.DisplayData; +import org.skriptlang.skript.bukkit.displays.DisplayData; import ch.njol.skript.expressions.base.PropertyExpression; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; diff --git a/src/main/java/ch/njol/skript/entity/DisplayData.java b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java similarity index 85% rename from src/main/java/ch/njol/skript/entity/DisplayData.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java index b9411daeb30..f60f7883da3 100644 --- a/src/main/java/ch/njol/skript/entity/DisplayData.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java @@ -1,25 +1,8 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ -package ch.njol.skript.entity; +package org.skriptlang.skript.bukkit.displays; import ch.njol.skript.Skript; import ch.njol.skript.aliases.ItemType; +import ch.njol.skript.entity.EntityData; import ch.njol.skript.lang.Literal; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.registrations.Classes; @@ -44,10 +27,8 @@ public class DisplayData extends EntityData { public static final Color DEFAULT_BACKGROUND_COLOR = ColorRGB.fromRGBA(0, 0, 0, 64).asBukkitColor(); static { - if (Skript.isRunningMinecraft(1, 19, 4)) { - EntityData.register(DisplayData.class, "display", Display.class, 0, DisplayType.codeNames); - Variables.yggdrasil.registerSingleClass(DisplayType.class, "DisplayType"); - } + EntityData.register(DisplayData.class, "display", Display.class, 0, DisplayType.codeNames); + Variables.yggdrasil.registerSingleClass(DisplayType.class, "DisplayType"); } private enum DisplayType { diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java similarity index 97% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java index ea35f311b9f..097a1727486 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java similarity index 99% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java index a99dd053364..0e398e6a101 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java similarity index 97% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java index eaf009e507b..d0361885214 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java similarity index 98% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java index 1f6b5218006..3c72c74b5f4 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java similarity index 98% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java index 5e5f33a43a9..c9a792eea80 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java similarity index 97% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java index 91fdd38eaa9..19a6a3ff4ec 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java similarity index 97% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java index f28ffd932e5..b19dd99b83d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTeleportDuration.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.Skript; import ch.njol.skript.classes.Changer.ChangeMode; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationRotation.java similarity index 98% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationRotation.java index cf0a9ad3e5f..77cc5e6eecc 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationRotation.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java similarity index 98% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java index 297bf7fedbb..00026ac7189 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java similarity index 97% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java index d410c4845a0..4233608090c 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java @@ -1,4 +1,4 @@ -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/package-info.java similarity index 75% rename from src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java rename to src/main/java/org/skriptlang/skript/bukkit/displays/generic/package-info.java index 498436ee4bd..7e779a4ae8f 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/expressions/package-info.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/package-info.java @@ -1,5 +1,5 @@ @NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE}) -package org.skriptlang.skript.bukkit.displays.expressions; +package org.skriptlang.skript.bukkit.displays.generic; import org.eclipse.jdt.annotation.DefaultLocation; import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java index 6ec74543231..5c1ca3aa516 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java @@ -107,23 +107,22 @@ protected void execute(Event event) { float radY = (float) (y.floatValue() * Math.PI / 180); float radZ = (float) (z.floatValue() * Math.PI / 180); - toRotate.stream(event) - .forEach(object -> { - if (object instanceof Quaternionf quaternion) { - quaternion.rotateZYX(radZ, radY, radX); - } else if (object instanceof Display display) { - Transformation transformation = display.getTransformation(); - Quaternionf leftRotation = transformation.getLeftRotation(); - display.setTransformation( - new Transformation( - transformation.getTranslation(), - leftRotation.rotateZYX(radZ, radY, radX), - transformation.getScale(), - transformation.getRightRotation() - ) - ); - } - }); + for (Object object : toRotate.getArray(event)) { + if (object instanceof Quaternionf quaternion) { + quaternion.rotateZYX(radZ, radY, radX); + } else if (object instanceof Display display) { + Transformation transformation = display.getTransformation(); + Quaternionf leftRotation = transformation.getLeftRotation(); + display.setTransformation( + new Transformation( + transformation.getTranslation(), + leftRotation.rotateZYX(radZ, radY, radX), + transformation.getScale(), + transformation.getRightRotation() + ) + ); + } + } return; } @@ -155,16 +154,15 @@ protected void execute(Event event) { displayRotator = new DisplayRotator(axis, (float) radAngle); } - toRotate.stream(event) - .forEach(object -> { - if (object instanceof Vector vectorToRotate) { - vectorRotator.rotate(vectorToRotate); - } else if (object instanceof Quaternionf quaternion) { - quaternionRotator.rotate(quaternion); - } else if (object instanceof Display display) { - displayRotator.rotate(display); - } - }); + for (Object object : toRotate.getArray(event)) { + if (object instanceof Vector vectorToRotate) { + vectorRotator.rotate(vectorToRotate); + } else if (object instanceof Quaternionf quaternion) { + quaternionRotator.rotate(quaternion); + } else if (object instanceof Display display) { + displayRotator.rotate(display); + } + } } @Override From d54d3503a43b6d33281e406d20dfa93e10b3ee57 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:28:02 -0700 Subject: [PATCH 091/104] display data improvements --- .../java/ch/njol/skript/aliases/ItemType.java | 16 +++++++++++++ .../skript/bukkit/displays/DisplayData.java | 24 ++++++++++++------- src/main/resources/lang/default.lang | 8 +++---- src/test/skript/tests/misc/displaydata.sk | 8 +++---- 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/main/java/ch/njol/skript/aliases/ItemType.java b/src/main/java/ch/njol/skript/aliases/ItemType.java index d2a6fc85421..01dd6aa461d 100644 --- a/src/main/java/ch/njol/skript/aliases/ItemType.java +++ b/src/main/java/ch/njol/skript/aliases/ItemType.java @@ -1418,6 +1418,21 @@ public Material getMaterial() { return data.getType(); } + /** + * @return A random block material this ItemType represents. + */ + public Material getBlockMaterial() { + List blockItemDatas = new ArrayList<>(); + for (ItemData d : types) { + if (d.type.isBlock()) + blockItemDatas.add(d); + } + ItemData data = blockItemDatas.get(random.nextInt(blockItemDatas.size())); + if (data == null) + throw new IllegalStateException("material not found"); + return data.getType(); + } + /** * Returns a base item type of this. Essentially, this calls * {@link ItemData#aliasCopy()} on all datas and creates a new type @@ -1431,4 +1446,5 @@ public ItemType getBaseType() { } return copy; } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java index f60f7883da3..a59f0a25e23 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java @@ -10,7 +10,6 @@ import ch.njol.skript.variables.Variables; import org.bukkit.Bukkit; import org.bukkit.Color; -import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.entity.BlockDisplay; import org.bukkit.entity.Display; @@ -88,22 +87,29 @@ public DisplayData(DisplayType type) { @SuppressWarnings("unchecked") protected boolean init(Literal[] exprs, int matchedPattern, ParseResult parseResult) { type = DisplayType.values()[matchedPattern]; - if (exprs.length == 0 || exprs[0] == null) + // default to 0, use 1 for alternate pattern: %x% display instead of display of %x% + int exprIndex = parseResult.hasTag("alt") ? 1 : 0; + if (exprs.length == 0 || exprs[exprIndex] == null) return true; + if (type == DisplayType.BLOCK) { - Object object = ((Literal) exprs[0]).getSingle(); - if (object instanceof ItemType) { - Material material = ((ItemType) object).getMaterial(); - if (!material.isBlock()) { - Skript.error("A block display must be a block item. " + Classes.toString(material) + " is not a block. If you want to spawn an item, use an 'item display'"); + Object object = ((Literal) exprs[exprIndex]).getSingle(); + if (object instanceof ItemType itemType) { + if (!itemType.hasBlock()) { + Skript.error("A block display must be of a block item. " + Classes.toString(itemType.getMaterial()) + " is not a block. If you want to display an item, use an 'item display'."); return false; } - blockData = Bukkit.createBlockData(material); + blockData = Bukkit.createBlockData(itemType.getBlockMaterial()); } else { blockData = (BlockData) object; } } else if (type == DisplayType.ITEM) { - item = ((Literal) exprs[0]).getSingle().getRandom(); + ItemType itemType = ((Literal) exprs[exprIndex]).getSingle(); + if (!itemType.hasItem()) { + Skript.error("An item display must be of a valid item. " + Classes.toString(itemType.getMaterial()) + " is not a valid item. If you want to display a block, use a 'block display'."); + return false; + } + item = itemType.getRandom(); } return true; } diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index 3962b458269..a1f63aaac12 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -1243,16 +1243,16 @@ entities: pattern: interaction(|1¦s) display: name: display¦s - pattern: display(|1¦s) [entity] + pattern: display(1:s| [entit(y|1:ies)]) block display: name: block display¦s - pattern: block display(|1¦s) [entity] [of %-blockdata/itemtype%] + pattern: (block display(1:s| [entit(y|1:ies)]) [of %-blockdata/itemtype%]|alt:%-blockdata/itemtype% block display(1:s| [entit(y|1:ies)])) item display: name: item display¦s - pattern: item display(|1¦s) [entity] [of %-itemtype%] + pattern: (item display(1:s| [entit(y|1:ies)]) [of %-itemtype%]|alt:%-itemtype% item display(1:s| [entit(y|1:ies)])) text display: name: text display¦s - pattern: text display(|1¦s) [entity] + pattern: text display(1:s| [entit(y|1:ies)]) # 1.20.3 Entities breeze: name: breeze¦s diff --git a/src/test/skript/tests/misc/displaydata.sk b/src/test/skript/tests/misc/displaydata.sk index e76990c99cf..fccb62de0ab 100644 --- a/src/test/skript/tests/misc/displaydata.sk +++ b/src/test/skript/tests/misc/displaydata.sk @@ -28,12 +28,12 @@ test "display entity data" when running minecraft "1.19": assert size of block displays is 2 with "did not find all block displays" - spawn a block display of a red bed at spawn of world "world": + spawn a red bed block display at spawn of world "world": set {_block2} to entity assert size of block displays is 3 with "did not find all block displays" assert size of block displays of a spruce log is 1 with "did not find correct amount of spruce block displays" - assert size of block displays of a red bed is 1 with "did not find correct amount of block display of a red beds" + assert size of red bed block displays is 1 with "did not find correct amount of block display of a red beds" assert {_block2} is a display with "block display was not a display" assert {_block2} is a block display with "block display was not a block display" @@ -53,9 +53,9 @@ test "display entity data" when running minecraft "1.19": assert size of item displays of diamond is 1 with "did not find correct amount of item displays of diamonds" assert {_item2} is a display with "item display was not a display" - assert {_item2} is a item display with "item display was not a block display" + assert {_item2} is a item display with "item display was not a item display" assert {_item2} is not an item display of an oak log with "item display of a diamond was an oak log block display" - assert {_item2} is a item display of a diamond with "item display of a diamond was not a diamond block display" + assert {_item2} is a diamond item display with "item display of a diamond was not a diamond block display" assert {_item2} is not a block display with "item display was a block display" assert {_item2} is not a text display with "item display was a text display" From 33db584aa8ae2bca31570d42bca97ee788f62a65 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:40:43 -0700 Subject: [PATCH 092/104] requested changes 1 --- .../skript/expressions/ExprXYZComponent.java | 52 +++++++------------ .../java/ch/njol/skript/util/ColorRGB.java | 24 ++------- .../skript/util/slot/DisplayEntitySlot.java | 23 +------- 3 files changed, 25 insertions(+), 74 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index f105b3692ec..bfca86f8329 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package ch.njol.skript.expressions; import ch.njol.skript.Skript; @@ -67,18 +49,18 @@ public class ExprXYZComponent extends SimplePropertyExpression { register(ExprXYZComponent.class, Number.class, "[vector|quaternion] (:w|:x|:y|:z) [component[s]]", types); } - private enum AXIS { + private enum Axis { W, X, Y, Z; } - private @UnknownNullability AXIS axis; + private ExprXYZComponent.@UnknownNullability Axis axis; @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - axis = AXIS.valueOf(parseResult.tags.get(0).toUpperCase(Locale.ENGLISH)); + axis = Axis.valueOf(parseResult.tags.get(0).toUpperCase(Locale.ENGLISH)); return super.init(exprs, matchedPattern, isDelayed, parseResult); } @@ -106,10 +88,11 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye public Class @Nullable [] acceptChange(ChangeMode mode) { if ((mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET)) { boolean acceptsChange; - if (IS_RUNNING_1194) + if (IS_RUNNING_1194) { acceptsChange = Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class, Quaternionf.class); - else + } else { acceptsChange = Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class); + } if (acceptsChange) return CollectionUtils.array(Number.class); } @@ -158,7 +141,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { * @param mode the change mode to determine the modification type */ private void changeVector(Vector vector, double value, ChangeMode mode) { - if (axis == AXIS.W) + if (axis == Axis.W) return; switch (mode) { case REMOVE: @@ -191,27 +174,32 @@ private void changeVector(Vector vector, double value, ChangeMode mode) { * @param mode the change mode to determine the modification type */ private void changeQuaternion(Quaternionf quaternion, float value, ChangeMode mode) { + float x = quaternion.x(); + float y = quaternion.y(); + float z = quaternion.z(); + float w = quaternion.w(); switch (mode) { case REMOVE: value = -value; //$FALL-THROUGH$ case ADD: switch (axis) { - case W -> quaternion.set(quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w() + value); - case X -> quaternion.set(quaternion.x() + value, quaternion.y(), quaternion.z(), quaternion.w()); - case Y -> quaternion.set(quaternion.x(), quaternion.y() + value, quaternion.z(), quaternion.w()); - case Z -> quaternion.set(quaternion.x(), quaternion.y(), quaternion.z() + value, quaternion.w()); + case W -> w += value; + case X -> x += value; + case Y -> y += value; + case Z -> z += value; } break; case SET: switch (axis) { - case W -> quaternion.set(quaternion.x(), quaternion.y(), quaternion.z(), value); - case X -> quaternion.set(value, quaternion.y(), quaternion.z(), quaternion.w()); - case Y -> quaternion.set(quaternion.x(), value, quaternion.z(), quaternion.w()); - case Z -> quaternion.set(quaternion.x(), quaternion.y(), value, quaternion.w()); + case W -> w = value; + case X -> x = value; + case Y -> y = value; + case Z -> z = value; } break; } + quaternion.set(x, y, z, w); } @Override diff --git a/src/main/java/ch/njol/skript/util/ColorRGB.java b/src/main/java/ch/njol/skript/util/ColorRGB.java index 9ffbdc3ddc6..236c825b922 100644 --- a/src/main/java/ch/njol/skript/util/ColorRGB.java +++ b/src/main/java/ch/njol/skript/util/ColorRGB.java @@ -1,21 +1,3 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package ch.njol.skript.util; import ch.njol.skript.Skript; @@ -76,11 +58,11 @@ public ColorRGB(org.bukkit.Color bukkit) { @Contract("_,_,_,_ -> new") public static ColorRGB fromRGBA(int red, int green, int blue, int alpha) { org.bukkit.Color bukkit; - if (HAS_ARGB) + if (HAS_ARGB) { bukkit = org.bukkit.Color.fromARGB(alpha, red, green, blue); - else + } else { bukkit = org.bukkit.Color.fromRGB(red, green, blue); - + } return new ColorRGB(bukkit); } diff --git a/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java b/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java index 35feb81380b..c40a3275404 100644 --- a/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java +++ b/src/main/java/ch/njol/skript/util/slot/DisplayEntitySlot.java @@ -1,29 +1,10 @@ -/** - * This file is part of Skript. - * - * Skript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Skript is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Skript. If not, see . - * - * Copyright Peter Güttinger, SkriptLang team and contributors - */ package ch.njol.skript.util.slot; +import ch.njol.skript.registrations.Classes; import org.bukkit.entity.ItemDisplay; import org.bukkit.event.Event; import org.bukkit.inventory.ItemStack; -import org.eclipse.jdt.annotation.Nullable; - -import ch.njol.skript.registrations.Classes; +import org.jetbrains.annotations.Nullable; public class DisplayEntitySlot extends Slot { From 1931b629393bba7b9963802fc46bbb19c8372ff5 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:47:24 -0700 Subject: [PATCH 093/104] update switches and remove banana --- .../generic/ExprDisplayBillboard.java | 17 +++++------------ .../generic/ExprDisplayBrightness.java | 4 ++-- .../generic/ExprDisplayGlowOverride.java | 7 ++++--- .../generic/ExprDisplayHeightWidth.java | 2 +- .../generic/ExprDisplayInterpolation.java | 2 +- .../displays/generic/ExprDisplayShadow.java | 2 +- .../generic/ExprDisplayTeleportDuration.java | 2 +- .../ExprDisplayTransformationRotation.java | 9 ++++----- ...DisplayTransformationScaleTranslation.java | 9 ++++----- .../generic/ExprDisplayViewRange.java | 2 +- .../displays/text/ExprTextDisplayOpacity.java | 2 +- .../expressions/ExprQuaternionAxisAngle.java | 4 +++- .../bukkit/misc/expressions/ExprTextOf.java | 19 ++++++------------- 13 files changed, 34 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java index 097a1727486..16175fb31b1 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java @@ -33,18 +33,11 @@ public Billboard convert(Display display) { } public Class @Nullable [] acceptChange(ChangeMode mode) { - switch (mode) { - case ADD: - case DELETE: - case REMOVE: - case REMOVE_ALL: - break; - case RESET: - return CollectionUtils.array(); - case SET: - return CollectionUtils.array(Billboard.class); - } - return null; + return switch (mode) { + case RESET -> CollectionUtils.array(); + case SET -> CollectionUtils.array(Billboard.class); + default -> null; + }; } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java index 0e398e6a101..56db2b20ead 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java @@ -92,13 +92,13 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is public Class @Nullable [] acceptChange(ChangeMode mode) { if (skyLight || blockLight) { return switch (mode) { - case REMOVE_ALL, RESET, DELETE -> null; case ADD, REMOVE, SET -> CollectionUtils.array(Number.class); + default -> null; }; } else { return switch (mode) { - case ADD, REMOVE, REMOVE_ALL -> null; case SET, RESET, DELETE -> CollectionUtils.array(Number.class); + default -> null; }; } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java index d0361885214..33b58fd6061 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java @@ -35,9 +35,10 @@ public Color convert(Display display) { } public Class @Nullable [] acceptChange(ChangeMode mode) { - if (mode == ChangeMode.SET || mode == ChangeMode.RESET || mode == ChangeMode.DELETE) - return CollectionUtils.array(Color.class); - return null; + return switch (mode) { + case SET, RESET, DELETE -> CollectionUtils.array(Color.class); + default -> null; + }; } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java index 3c72c74b5f4..4f078bb7a50 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java @@ -49,7 +49,7 @@ public Float convert(Display display) { public Class @Nullable [] acceptChange(ChangeMode mode) { return switch (mode) { case ADD, REMOVE, RESET, SET -> CollectionUtils.array(Number.class); - case DELETE, REMOVE_ALL -> null; + default -> null; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java index c9a792eea80..abf14f147c2 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java @@ -50,7 +50,7 @@ public Timespan convert(Display display) { return switch (mode) { case ADD, REMOVE, SET -> CollectionUtils.array(Timespan.class); case RESET -> CollectionUtils.array(); - case DELETE, REMOVE_ALL -> null; + default -> null; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java index 19a6a3ff4ec..645020da318 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java @@ -42,7 +42,7 @@ public Float convert(Display display) { return switch (mode) { case ADD, SET, REMOVE -> CollectionUtils.array(Number.class); case RESET -> CollectionUtils.array(); - case DELETE, REMOVE_ALL -> null; + default -> null; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java index b19dd99b83d..95d6dc71b94 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java @@ -48,7 +48,7 @@ public Timespan convert(Display display) { return switch (mode) { case ADD, REMOVE, SET -> CollectionUtils.array(Timespan.class); case RESET -> CollectionUtils.array(); - case DELETE, REMOVE_ALL -> null; + default -> null; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationRotation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationRotation.java index 77cc5e6eecc..cb7a78c7e0b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationRotation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationRotation.java @@ -44,11 +44,10 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } public Class @Nullable [] acceptChange(ChangeMode mode) { - if (mode == ChangeMode.SET) - return CollectionUtils.array(Quaternionf.class); - if (mode == ChangeMode.RESET) - return CollectionUtils.array(); - return null; + return switch (mode) { + case SET, RESET -> CollectionUtils.array(Quaternionf.class); + default -> null; + }; } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java index 00026ac7189..8e1d3ebcd50 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java @@ -42,11 +42,10 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } public Class @Nullable [] acceptChange(ChangeMode mode) { - if (mode == ChangeMode.SET) - return CollectionUtils.array(Vector.class); - if (mode == ChangeMode.RESET) - return CollectionUtils.array(); - return null; + return switch (mode) { + case SET, RESET -> CollectionUtils.array(Vector.class); + default -> null; + }; } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java index 4233608090c..ce4f228566d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java @@ -34,7 +34,7 @@ public class ExprDisplayViewRange extends SimplePropertyExpression CollectionUtils.array(Number.class); case RESET -> CollectionUtils.array(); - case DELETE, REMOVE_ALL -> null; + default -> null; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java index 18318fce16d..9c4b1003d66 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java @@ -36,7 +36,7 @@ public class ExprTextDisplayOpacity extends SimplePropertyExpression @Nullable [] acceptChange(ChangeMode mode) { return switch (mode) { case ADD, REMOVE, RESET, SET -> CollectionUtils.array(Number.class); - case REMOVE_ALL, DELETE -> null; + default -> null; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java index c8d7d6a4db7..0ec6c4f6043 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java @@ -65,8 +65,10 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is return CollectionUtils.array(isAxis ? Vector.class : Number.class); return null; } + default -> { + return null; + } } - return null; } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java index 48475fbc71e..f19a78aaa8b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java @@ -39,7 +39,7 @@ public class ExprTextOf extends SimplePropertyExpression { // This is because this expression is setup to support future types. // Remove this if non-versioning. if (!types.isEmpty()) - register(ExprTextOf.class, String.class, "(banana|string|text)[s]", types); + register(ExprTextOf.class, String.class, "(string|text)[s]", types); } @Override @@ -50,18 +50,11 @@ public class ExprTextOf extends SimplePropertyExpression { } public Class @Nullable [] acceptChange(ChangeMode mode) { - switch (mode) { - case ADD: - case DELETE: - case REMOVE: - case REMOVE_ALL: - break; - case RESET: - return CollectionUtils.array(); - case SET: - return CollectionUtils.array(String.class); - } - return null; + return switch (mode) { + case RESET -> CollectionUtils.array(); + case SET -> CollectionUtils.array(String.class); + default -> null; + }; } @Override From dea83209208d48d891c703ec68c9cd7855dfefbe Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:12:30 -0700 Subject: [PATCH 094/104] requested changes 2 --- .../generic/ExprDisplayBillboard.java | 8 +---- .../generic/ExprDisplayBrightness.java | 1 - .../generic/ExprDisplayGlowOverride.java | 19 +++-------- .../generic/ExprDisplayHeightWidth.java | 4 +++ .../generic/ExprDisplayInterpolation.java | 15 ++++---- .../generic/ExprDisplayTeleportDuration.java | 6 ++-- .../generic/ExprDisplayViewRange.java | 2 +- .../item/ExprItemDisplayTransform.java | 5 ++- .../text/CondTextDisplayHasDropShadow.java | 16 ++++++--- .../text/CondTextDisplaySeeThroughBlocks.java | 1 + .../text/EffTextDisplayDropShadow.java | 10 +++--- .../text/EffTextDisplaySeeThroughBlocks.java | 2 +- .../misc/expressions/ExprItemOfEntity.java | 8 ++--- .../expressions/ExprQuaternionAxisAngle.java | 30 ++++------------ .../bukkit/misc/expressions/ExprRotate.java | 34 ++++++++----------- .../bukkit/misc/expressions/ExprTextOf.java | 3 +- .../bukkit/misc/rotation/DisplayRotator.java | 1 + .../NonMutatingQuaternionRotator.java | 2 +- .../rotation/NonMutatingVectorRotator.java | 2 +- .../misc/rotation/QuaternionRotator.java | 2 +- .../skript/bukkit/misc/rotation/Rotator.java | 2 +- .../bukkit/misc/rotation/VectorRotator.java | 2 +- 22 files changed, 77 insertions(+), 98 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java index 16175fb31b1..fc3cf897a55 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java @@ -42,13 +42,7 @@ public Billboard convert(Display display) { @Override public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { - if (mode == ChangeMode.RESET) { - for (Display display : getExpr().getArray(event)) - display.setBillboard(Billboard.FIXED); - return; - } - assert delta != null; - Billboard billboard = (Billboard) delta[0]; + Billboard billboard = delta != null ? (Billboard) delta[0] : Billboard.FIXED; for (Display display : getExpr().getArray(event)) display.setBillboard(billboard); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java index 56db2b20ead..e9392040f51 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBrightness.java @@ -32,7 +32,6 @@ "Likewise, you can only clear the brightness override, you cannot clear/reset the sky/block values individually." }) @Examples({ - "set brightness override of the last spawned text display to brightness(5, 7)", "set sky light override of the last spawned text display to 7", "subtract 3 from the block light level override of the last spawned text display", "if sky light level override of {_display} is 5:", diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java index 33b58fd6061..84c6bd63723 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayGlowOverride.java @@ -29,9 +29,8 @@ public class ExprDisplayGlowOverride extends SimplePropertyExpression @Nullable [] acceptChange(ChangeMode mode) { @@ -43,17 +42,9 @@ public Color convert(Display display) { @Override public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { - Display[] displays = getExpr().getArray(event); - if (mode != ChangeMode.SET) { - for (Display display : displays) - display.setGlowColorOverride(null); - return; - } - if (delta == null) - return; - Color color = (Color) delta[0]; - for (Display display : displays) - display.setGlowColorOverride(color.asBukkitColor()); + org.bukkit.Color color = delta != null ? ((Color) delta[0]).asBukkitColor() : null; + for (Display display : getExpr().getArray(event)) + display.setGlowColorOverride(color); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java index 4f078bb7a50..d21ab06465b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java @@ -68,9 +68,13 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { for (Display display : displays) { if (height) { float value = Math.max(0F, display.getDisplayHeight() + change); + if (Float.isInfinite(value)) + continue; display.setDisplayHeight(value); } else { float value = Math.max(0F, display.getDisplayWidth() + change); + if (Float.isInfinite(value)) + continue; display.setDisplayWidth(value); } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java index abf14f147c2..c58c8f6280b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java @@ -11,6 +11,7 @@ import ch.njol.skript.util.Timespan; import ch.njol.skript.util.Timespan.TimePeriod; import ch.njol.util.Kleenean; +import ch.njol.util.Math2; import ch.njol.util.coll.CollectionUtils; import org.bukkit.entity.Display; import org.bukkit.event.Event; @@ -57,9 +58,9 @@ public Timespan convert(Display display) { @Override public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - int ticks = 0; + long ticks = 0; if (delta != null) - ticks = (int) ((Timespan) delta[0]).getAs(TimePeriod.TICK); + ticks = Math2.fit(Integer.MIN_VALUE, ((Timespan) delta[0]).getAs(TimePeriod.TICK), Integer.MAX_VALUE); switch (mode) { case REMOVE: @@ -67,22 +68,22 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { case ADD: for (Display display : displays) { if (delay) { - int value = Math.max(0, display.getInterpolationDelay() + ticks); + int value = (int) Math2.fit(0, display.getInterpolationDelay() + ticks, Integer.MAX_VALUE); display.setInterpolationDelay(value); } else { - int value = Math.max(0, display.getInterpolationDuration() + ticks); + int value = (int) Math2.fit(0, display.getInterpolationDuration() + ticks, Integer.MAX_VALUE); display.setInterpolationDuration(value); } } break; case RESET: case SET: - ticks = Math.max(0, ticks); + ticks = Math2.fit(0, ticks, Integer.MAX_VALUE); for (Display display : displays) { if (delay) { - display.setInterpolationDelay(ticks); + display.setInterpolationDelay((int) ticks); } else { - display.setInterpolationDuration(ticks); + display.setInterpolationDuration((int) ticks); } } break; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java index 95d6dc71b94..da2130b9160 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java @@ -55,13 +55,13 @@ public Timespan convert(Display display) { @Override public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { Display[] displays = getExpr().getArray(event); - int ticks = (int) (delta == null ? 0 : ((Timespan) delta[0]).getAs(TimePeriod.TICK)); + long ticks = (delta == null ? 0 : ((Timespan) delta[0]).getAs(TimePeriod.TICK)); switch (mode) { case REMOVE: ticks = -ticks; case ADD: for (Display display : displays) { - int value = Math2.fit(0, display.getTeleportDuration() + ticks, 59); + int value = (int) Math2.fit(0, display.getTeleportDuration() + ticks, 59); display.setTeleportDuration(value); } break; @@ -69,7 +69,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { case SET: ticks = Math2.fit(0, ticks, 59); for (Display display : displays) - display.setTeleportDuration(ticks); + display.setTeleportDuration((int) ticks); break; } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java index ce4f228566d..0f11f49a525 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java @@ -69,7 +69,7 @@ public Class getReturnType() { @Override protected String getPropertyName() { - return "view range"; + return "view range"; } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java index 8260bfcf486..ea742c826d8 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/item/ExprItemDisplayTransform.java @@ -15,7 +15,10 @@ @Name("Item Display Transform") @Description("Returns or changes the item display transform of item displays.") -@Examples("set the item transform of the last spawned item display to no transform # Reset to default") +@Examples({ + "set the item transform of the last spawned item display to first person left handed", + "set the item transform of the last spawned item display to no transform # Reset to default" +}) @Since("INSERT VERSION") public class ExprItemDisplayTransform extends SimplePropertyExpression { diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java index b7d0563a586..d091f30a056 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java @@ -23,16 +23,17 @@ public class CondTextDisplayHasDropShadow extends PropertyCondition { static { Skript.registerCondition(CondTextDisplayHasDropShadow.class, - "[[the] text of] %displays% (has|have) (drop|text) shadow", - "%displays%'[s] text (has|have) (drop|text) shadow", - "[[the] text of] %displays% (doesn't|does not|do not|don't) have (drop|text) shadow", - "%displays%'[s] text (doesn't|does not|do not|don't) have (drop|text) shadow" + "[[the] text of] %displays% (has|have) [a] (drop|text) shadow", + "%displays%'[s] text (has|have) [a] (drop|text) shadow", + "[[the] text of] %displays% (doesn't|does not|do not|don't) have [a] (drop|text) shadow", + "%displays%'[s] text (doesn't|does not|do not|don't) have [a] (drop|text) shadow" ); } @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - super.init(expressions, matchedPattern, isDelayed, parseResult); + if (!super.init(expressions, matchedPattern, isDelayed, parseResult)) + return false; setNegated(matchedPattern > 1); return true; } @@ -42,6 +43,11 @@ public boolean check(Display value) { return value instanceof TextDisplay textDisplay && textDisplay.isShadowed(); } + @Override + protected PropertyType getPropertyType() { + return PropertyType.HAVE; + } + @Override protected String getPropertyName() { return "drop shadow"; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplaySeeThroughBlocks.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplaySeeThroughBlocks.java index 2339223f9c2..6e6cee28d1b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplaySeeThroughBlocks.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplaySeeThroughBlocks.java @@ -30,4 +30,5 @@ public boolean check(Display value) { protected String getPropertyName() { return "visible through blocks"; } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java index 9b9a3ec71b7..3545faf4e11 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplayDropShadow.java @@ -33,14 +33,14 @@ public class EffTextDisplayDropShadow extends Effect { ); } - Expression displays; - boolean shadowed; + private Expression displays; + private boolean addShadow; @Override public boolean init(Expression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { //noinspection unchecked displays = (Expression) expressions[0]; - shadowed = matchedPattern <= 1; + addShadow = matchedPattern <= 1; return true; } @@ -48,13 +48,13 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is protected void execute(Event event) { for (Display display : displays.getArray(event)) { if (display instanceof TextDisplay textDisplay) - textDisplay.setShadowed(shadowed); + textDisplay.setShadowed(addShadow); } } @Override public String toString(@Nullable Event event, boolean debug) { - if (shadowed) + if (addShadow) return "add drop shadow to " + displays.toString(event, debug); return "remove drop shadow from " + displays.toString(event, debug); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplaySeeThroughBlocks.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplaySeeThroughBlocks.java index 1ef4dc35ad1..9ed947ed746 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplaySeeThroughBlocks.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/EffTextDisplaySeeThroughBlocks.java @@ -27,7 +27,7 @@ public class EffTextDisplaySeeThroughBlocks extends Effect { Skript.registerEffect(EffTextDisplaySeeThroughBlocks.class, "make %displays% visible through (blocks|walls)", "force %displays% to be visible through (blocks|walls)", - "prevent %displays% from being (visible|seen) through (blocks|walls)" + "(prevent|block) %displays% from being (visible|seen) through (blocks|walls)" ); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java index 9dd5b7d8549..7c4532be611 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java @@ -53,13 +53,13 @@ public class ExprItemOfEntity extends SimplePropertyExpression { } @Override - protected String getPropertyName() { - return "item of entity"; + public Class getReturnType() { + return Slot.class; } @Override - public Class getReturnType() { - return Slot.class; + protected String getPropertyName() { + return "item of entity"; } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java index 0ec6c4f6043..9a4700f9627 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java @@ -51,7 +51,7 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override public @Nullable Object convert(Quaternionf from) { AxisAngle4f axisAngle = new AxisAngle4f(); - setFromQuaternion(axisAngle, from); + axisAngle.set(from); if (isAxis) return new Vector(axisAngle.x, axisAngle.y, axisAngle.z); return (float) (axisAngle.angle * 180 / Math.PI); @@ -78,14 +78,14 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { AxisAngle4f axisAngle = new AxisAngle4f(); if (isAxis && delta[0] instanceof Vector vector) { for (Quaternionf quaternion : quaternions) { - setFromQuaternion(axisAngle, quaternion); + axisAngle.set(quaternion); axisAngle.set(axisAngle.angle, (float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); quaternion.set(axisAngle); } } else if (delta[0] instanceof Number number) { float angle = (float) (number.floatValue() / 180 * Math.PI); for (Quaternionf quaternion : quaternions) { - setFromQuaternion(axisAngle, quaternion); + axisAngle.set(quaternion); axisAngle.set(angle, axisAngle.x, axisAngle.y, axisAngle.z); quaternion.set(axisAngle); } @@ -93,31 +93,15 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { getExpr().change(event, quaternions, ChangeMode.SET); } - @Override - protected String getPropertyName() { - return isAxis ? "axis" : "angle"; - } - @Override public Class getReturnType() { return isAxis ? Vector.class : Float.class; } - // avoid ClassNotFound exception on <1.19 - // TODO: remove after legacy tests removed - private static void setFromQuaternion(AxisAngle4f axisAngle4f, Quaternionf quaternionf) { - float acos = Math.safeAcos(quaternionf.w()); - float invSqrt = Math.invsqrt(1.0f - quaternionf.w() * quaternionf.w()); - if (Float.isInfinite(invSqrt)) { - axisAngle4f.x = 0.0f; - axisAngle4f.y = 0.0f; - axisAngle4f.z = 1.0f; - } else { - axisAngle4f.x = quaternionf.x() * invSqrt; - axisAngle4f.y = quaternionf.y() * invSqrt; - axisAngle4f.z = quaternionf.z() * invSqrt; - } - axisAngle4f.angle = acos + acos; + @Override + protected String getPropertyName() { + return isAxis ? "axis" : "angle"; } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java index 23a3b395dea..2956b075e86 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java @@ -103,8 +103,8 @@ protected Object[] get(Event event) { float radY = (float) (y.floatValue() * Math.PI / 180); float radZ = (float) (z.floatValue() * Math.PI / 180); - return toRotate.stream(event) - .map(Quaternionf.class::cast) + //noinspection unchecked + return ((Expression) toRotate).stream(event) .map(quaternion -> quaternion.rotateZYX(radZ, radY, radX)) .toArray(Quaternionf[]::new); } @@ -159,23 +159,19 @@ public Class getReturnType() { @Override public String toString(@Nullable Event event, boolean debug) { - switch (matchedPattern) { - case 0, 1: - return toRotate.toString(event, debug) + - " rotated around the " + axis + "-axis " + - "by " + angle.toString(event, debug) + " degrees"; - case 2: - return toRotate.toString(event, debug) + - " rotated around " + vector.toString(event, debug) + "-axis " + - "by " + angle.toString(event, debug) + " degrees"; - case 3: - return toRotate.toString(event, debug) + - " rotated by x " + x.toString(event, debug) + ", " + - "y " + y.toString(event, debug) + ", " + - "and z " + z.toString(event, debug); - } - assert false; - return "invalid"; + return switch (matchedPattern) { + case 0, 1 -> toRotate.toString(event, debug) + + " rotated around the " + axis + "-axis " + + "by " + angle.toString(event, debug) + " degrees"; + case 2 -> toRotate.toString(event, debug) + + " rotated around " + vector.toString(event, debug) + "-axis " + + "by " + angle.toString(event, debug) + " degrees"; + case 3 -> toRotate.toString(event, debug) + + " rotated by x " + x.toString(event, debug) + ", " + + "y " + y.toString(event, debug) + ", " + + "and z " + z.toString(event, debug); + default -> "invalid"; + }; } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java index f19a78aaa8b..e4048f9ff63 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java @@ -59,8 +59,7 @@ public class ExprTextOf extends SimplePropertyExpression { @Override public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { - //noinspection ConstantConditions - String value = mode == ChangeMode.RESET ? null : (String) delta[0]; + String value = delta == null ? null : (String) delta[0]; for (Object object : getExpr().getArray(event)) { if (!(object instanceof TextDisplay)) continue; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java index 80e922a99d9..6142e6a3e84 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java @@ -33,4 +33,5 @@ public Display rotate(Display input) { ); return input; } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java index 0d74a31ffc3..93140b62746 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java @@ -23,7 +23,7 @@ public NonMutatingQuaternionRotator(Axis axis, float angle) { case LOCAL_X -> (input) -> input.rotateX(angle, new Quaternionf()); case LOCAL_Y -> (input) -> input.rotateY(angle, new Quaternionf()); case LOCAL_Z -> (input) -> input.rotateZ(angle, new Quaternionf()); - case LOCAL_ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); + case LOCAL_ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires additional data. Use a different constructor."); case ARBITRARY -> (input) -> input; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java index 3abc3c952d7..25274ca3a3e 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java @@ -14,7 +14,7 @@ public NonMutatingVectorRotator(Axis axis, double angle) { case X -> (input) -> input.clone().rotateAroundX(angle); case Y -> (input) -> input.clone().rotateAroundY(angle); case Z -> (input) -> input.clone().rotateAroundZ(angle); - case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); + case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires additional data. Use a different constructor."); case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java index 72fccd1ac7b..4826f2b63fd 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java @@ -23,7 +23,7 @@ public QuaternionRotator(Axis axis, float angle) { case LOCAL_X -> (input) -> input.rotateX(angle); case LOCAL_Y -> (input) -> input.rotateY(angle); case LOCAL_Z -> (input) -> input.rotateZ(angle); - case LOCAL_ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); + case LOCAL_ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires additional data. Use a different constructor."); case ARBITRARY -> (input) -> input; }; } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java index c09fce12342..01b64105227 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/Rotator.java @@ -73,7 +73,7 @@ public String toString() { * @param axis the axis to convert from * @return the converted axis */ - public Axis fromBukkit(org.bukkit.Axis axis) { + public static Axis fromBukkit(org.bukkit.Axis axis) { return switch (axis) { case X -> Axis.X; case Y -> Axis.Y; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java index 7bbf2292d82..c49cfc5b0c3 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java @@ -14,7 +14,7 @@ public VectorRotator(Axis axis, double angle) { case X -> (input) -> input.rotateAroundX(angle); case Y -> (input) -> input.rotateAroundY(angle); case Z -> (input) -> input.rotateAroundZ(angle); - case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires addition data. Use a different constructor."); + case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires additional data. Use a different constructor."); case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } From e43eb3da51a87cea59c0087c915646b386d60b5f Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 30 Aug 2024 01:26:27 -0400 Subject: [PATCH 095/104] Apply suggestions from code review Co-authored-by: cheeezburga <47320303+cheeezburga@users.noreply.github.com> --- src/main/java/ch/njol/skript/sections/EffSecSpawn.java | 2 +- .../skript/bukkit/misc/expressions/ExprItemOfEntity.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java index 10b94ecb07f..7f627f0f750 100644 --- a/src/main/java/ch/njol/skript/sections/EffSecSpawn.java +++ b/src/main/java/ch/njol/skript/sections/EffSecSpawn.java @@ -54,7 +54,7 @@ "You can modify the entity in this section, using for example 'event-entity' or 'cow'. ", "Do note that other event values, such as 'player', won't work in this section.", "", - "If you're spawning a display and want it to be empty on initialization, like not having a block display be stone; " + + "If you're spawning a display and want it to be empty on initialization, like not having a block display be stone, " + "set hidden config node 'spawn empty displays' to true." }) @Examples({ diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java index 7c4532be611..ab0ab9afe2d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java @@ -19,7 +19,7 @@ @Name("Item of an Entity") @Description({ - "An item associated with an entity. For dropped item entities, it gets the item that was dropped. ", + "An item associated with an entity. For dropped item entities, it gets the item that was dropped.", "For item frames, the item inside the frame is returned.", "For throwable projectiles (snowballs, enderpearls etc.) it gets the displayed item.", "For display entities (snowballs, enderpearls etc.) it gets the displayed item.", @@ -30,7 +30,7 @@ "", "set the item inside of event-entity to a diamond sword named \"Example\"" }) -@Since("2.2-dev35, 2.2-dev36 (improved), 2.5.2 (throwable projectiles)") +@Since("2.2-dev35, 2.2-dev36 (improved), 2.5.2 (throwable projectiles), INSERT VERSION (item displays)") public class ExprItemOfEntity extends SimplePropertyExpression { From 5b763cc8ef922c5515c7137d1125ec5039a4e028 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 30 Aug 2024 01:28:19 -0400 Subject: [PATCH 096/104] Apply suggestions from code review Co-authored-by: cheeezburga <47320303+cheeezburga@users.noreply.github.com> --- .../java/ch/njol/skript/expressions/ExprXYZComponent.java | 4 ++-- .../bukkit/displays/generic/ExprDisplayBillboard.java | 2 +- .../skript/bukkit/misc/expressions/ExprRotate.java | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index bfca86f8329..d95140b1241 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -22,8 +22,8 @@ @Name("Vector/Quaternion - XYZ Component") @Description({ - "Gets or changes the x, y or z component of vectors/quaternions.", - "You cannot use w of vector. W is for quaternions only." + "Gets or changes the X, Y or Z component of vectors/quaternions.", + "You cannot use the W component with vectors; it is for quaternions only." }) @Examples({ "set {_v} to vector 1, 2, 3", diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java index fc3cf897a55..8072df69c4e 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayBillboard.java @@ -16,7 +16,7 @@ @Description({ "Returns or changes the billboard setting of displays.", "This describes the axes/points around which the display can pivot.", - "Displays spawn with the default setting as 'fixed'. Resetting this expression will also set it to 'fixed'." + "Displays spawn with the 'fixed' billboard by default. Resetting this expression will also set it to 'fixed'." }) @Examples("set billboard of the last spawned text display to center") @Since("INSERT VERSION") diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java index 2956b075e86..ee60bf91907 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java @@ -26,13 +26,13 @@ @Name("Rotated Quaternion/Vector") @Description({ - "Rotates a Quaternion or Vector around an axis a set amount of degrees, or around all 3 axes at once.", + "Rotates a quaternion or vector around an axis a set amount of degrees, or around all 3 axes at once.", "Vectors can only be rotated around the global X/Y/Z axes, or an arbitrary vector axis.", - "Quaternions are more flexible, allowing rotation around the global or local X/Y/Z axes, arbitrary vectors, or all 3 local axis at once.", + "Quaternions are more flexible, allowing rotation around the global or local X/Y/Z axes, arbitrary vectors, or all 3 local axes at once.", "Global axes are the ones in the Minecraft world. Local axes are relative to how the quaternion is already oriented.", "", "Note that rotating a quaternion around a vector results in a rotation around the local vector, so results may not be what you expect. " + - "For example, rotating around vector(1, 0, 0) is the same as rotating around the local x axis.", + "For example, rotating around vector(1, 0, 0) is the same as rotating around the local X axis.", "The same applies to rotations by all three axes at once. " + "In addition, rotating around all three axes of a quaternion/display at once will rotate in ZYX order, meaning the Z rotation will be applied first and the X rotation last." }) From 926ef64f8c7164a0e145cfb6b713d1e905042ac2 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Fri, 30 Aug 2024 01:30:09 -0400 Subject: [PATCH 097/104] fix expritemofentity description --- .../skript/bukkit/misc/expressions/ExprItemOfEntity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java index ab0ab9afe2d..6671243eb59 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java @@ -21,8 +21,7 @@ @Description({ "An item associated with an entity. For dropped item entities, it gets the item that was dropped.", "For item frames, the item inside the frame is returned.", - "For throwable projectiles (snowballs, enderpearls etc.) it gets the displayed item.", - "For display entities (snowballs, enderpearls etc.) it gets the displayed item.", + "For throwable projectiles (snowballs, enderpearls etc.) or item displays, it gets the displayed item.", "Other entities do not have items associated with them." }) @Examples({ From a244db1021b2538675ee40765661fb7e8b1d45f1 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 31 Aug 2024 11:26:19 -0400 Subject: [PATCH 098/104] Apply suggestions from code review Co-authored-by: cheeezburga <47320303+cheeezburga@users.noreply.github.com> --- .../java/ch/njol/skript/classes/data/DefaultFunctions.java | 2 +- .../java/ch/njol/skript/expressions/ExprXYZComponent.java | 4 ++-- .../skriptlang/skript/bukkit/misc/effects/EffRotate.java | 6 +++--- .../skript/tests/syntaxes/expressions/ExprXYZComponent.sk | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index 2e750c228de..62997b3a76b 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -661,7 +661,7 @@ public Quaternionf[] executeSimple(Object[][] params) { return CollectionUtils.array(new Quaternionf(x, y, z, w)); } }) - .description("Returns a quaternion from the given w, x, y and z parameters. ") + .description("Returns a quaternion from the given W, X, Y and Z parameters. ") .examples("quaternion(1, 5.6, 45.21, 10)") .since("INSERT VERSION"); } diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index d95140b1241..f66bb348827 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -20,9 +20,9 @@ import java.util.Locale; -@Name("Vector/Quaternion - XYZ Component") +@Name("Vector/Quaternion - WXYZ Component") @Description({ - "Gets or changes the X, Y or Z component of vectors/quaternions.", + "Gets or changes the W, X, Y or Z component of vectors/quaternions.", "You cannot use the W component with vectors; it is for quaternions only." }) @Examples({ diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java index 5c1ca3aa516..14ed2fc1737 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java @@ -27,15 +27,15 @@ @Name("Rotate") @Description({ - "Rotates Displays, Quaternions, or Vectors around an axis a set amount of degrees, or around all 3 axes at once.", + "Rotates displays, quaternions, or vectors around an axis a set amount of degrees, or around all 3 axes at once.", "Vectors can only be rotated around the global X/Y/Z axes, or an arbitrary vector axis.", - "Quaternions are more flexible, allowing rotation around the global or local X/Y/Z axes, arbitrary vectors, or all 3 local axis at once.", + "Quaternions are more flexible, allowing rotation around the global or local X/Y/Z axes, arbitrary vectors, or all 3 local axes at once.", "Global axes are the ones in the Minecraft world. Local axes are relative to how the quaternion is already oriented.", "", "Rotating a display is a shortcut for rotating its left rotation. If the right rotation needs to be modified, it should be acquired, rotated, and re-set.", "", "Note that rotating a quaternion/display around a vector results in a rotation around the local vector, so results may not be what you expect. " + - "For example, rotating quaternions/displays around vector(1, 0, 0) is the same as rotating around the local x axis.", + "For example, rotating quaternions/displays around vector(1, 0, 0) is the same as rotating around the local X axis.", "The same applies to rotations by all three axes at once. " + "In addition, rotating around all three axes of a quaternion/display at once will rotate in ZYX order, meaning the Z rotation will be applied first and the X rotation last." }) diff --git a/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk b/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk index eb8b03c4c4e..bb0666c322d 100644 --- a/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk +++ b/src/test/skript/tests/syntaxes/expressions/ExprXYZComponent.sk @@ -30,7 +30,7 @@ test "vector xyz": assert the x component of {_v::*} is (-1.5, -1.5, and -1.5) with "x component of multiple vectors failed" assert the y component of {_v::*} is (2, 3, and 4) with "changing x component of multiple vectors changed y components too" -test "quaternion xyz" when running minecraft "1.19.4": +test "quaternion wxyz" when running minecraft "1.19.4": assert the w component of quaternion(1, 0, 0, 0) is 1 with "w vector component failed" assert the x component of quaternion(1, 0, 0, 0) is 0 with "x vector component failed" assert the y component of quaternion(1, 0, 0, 0) is 0 with "y vector component failed" From 84f5b6e2a12eaaa92dc30829922f75dbce4307bd Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 31 Aug 2024 11:27:29 -0400 Subject: [PATCH 099/104] Update ExprDisplayHeightWidth.java --- .../skript/bukkit/displays/generic/ExprDisplayHeightWidth.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java index d21ab06465b..86c12cae74c 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java @@ -4,7 +4,6 @@ import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; @@ -24,7 +23,6 @@ "If set to 0, no culling will occur on both the vertical and horizontal directions. Default is 0.0." }) @Examples("set display height of the last spawned text display to 2.5") -@RequiredPlugins("Spigot 1.19.4+") @Since("INSERT VERSION") public class ExprDisplayHeightWidth extends SimplePropertyExpression { From 9aa428966aee7de18a4d9ca3cce80d4b9dd7f41c Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 21 Sep 2024 19:55:33 -0400 Subject: [PATCH 100/104] Apply suggestions from code review Co-authored-by: Patrick Miller --- .../java/ch/njol/skript/util/ColorRGB.java | 1 + .../generic/ExprDisplayHeightWidth.java | 1 + .../generic/ExprDisplayInterpolation.java | 1 + .../displays/generic/ExprDisplayShadow.java | 1 + .../generic/ExprDisplayTeleportDuration.java | 1 + .../generic/ExprDisplayViewRange.java | 1 + .../text/CondTextDisplayHasDropShadow.java | 2 +- .../text/ExprTextDisplayLineWidth.java | 2 ++ .../displays/text/ExprTextDisplayOpacity.java | 1 + .../misc/expressions/ExprItemOfEntity.java | 20 +++++++++---------- .../expressions/ExprQuaternionAxisAngle.java | 13 +++++------- .../bukkit/misc/expressions/ExprTextOf.java | 10 +++++----- .../NonMutatingQuaternionRotator.java | 1 + .../rotation/NonMutatingVectorRotator.java | 1 + .../misc/rotation/QuaternionRotator.java | 1 + .../bukkit/misc/rotation/VectorRotator.java | 1 + src/test/skript/tests/misc/displays.sk | 1 - 17 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/main/java/ch/njol/skript/util/ColorRGB.java b/src/main/java/ch/njol/skript/util/ColorRGB.java index 236c825b922..dde0055a77c 100644 --- a/src/main/java/ch/njol/skript/util/ColorRGB.java +++ b/src/main/java/ch/njol/skript/util/ColorRGB.java @@ -85,6 +85,7 @@ public static ColorRGB fromRGB(int red, int green, int blue) { * @param bukkit the bukkit color to replicate * @return ColorRGB */ + @Contract("_ -> new") public static ColorRGB fromBukkitColor(org.bukkit.Color bukkit) { return new ColorRGB(bukkit); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java index 86c12cae74c..b6f4c0ec75a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayHeightWidth.java @@ -62,6 +62,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { switch (mode) { case REMOVE: change = -change; + //$FALL-THROUGH$ case ADD: for (Display display : displays) { if (height) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java index c58c8f6280b..5f1b45f2b13 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayInterpolation.java @@ -65,6 +65,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { switch (mode) { case REMOVE: ticks = -ticks; + //$FALL-THROUGH$ case ADD: for (Display display : displays) { if (delay) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java index 645020da318..eb9c68cf1fb 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java @@ -55,6 +55,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { switch (mode) { case REMOVE: change = -change; + //$FALL-THROUGH$ case ADD: for (Display display : displays) { if (radius) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java index da2130b9160..951bf727d88 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTeleportDuration.java @@ -59,6 +59,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { switch (mode) { case REMOVE: ticks = -ticks; + //$FALL-THROUGH$ case ADD: for (Display display : displays) { int value = (int) Math2.fit(0, display.getTeleportDuration() + ticks, 59); diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java index 0f11f49a525..f6216ff9283 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java @@ -47,6 +47,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { switch (mode) { case REMOVE: change = -change; + //$FALL-THROUGH$ case ADD: for (Display display : displays) { float value = Math.max(0F, display.getViewRange() + change); diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java index d091f30a056..919fe9e3c09 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/CondTextDisplayHasDropShadow.java @@ -23,7 +23,7 @@ public class CondTextDisplayHasDropShadow extends PropertyCondition { static { Skript.registerCondition(CondTextDisplayHasDropShadow.class, - "[[the] text of] %displays% (has|have) [a] (drop|text) shadow", + "[[the] text of] %displays% (has|have) [a] (drop|text) shadow", "%displays%'[s] text (has|have) [a] (drop|text) shadow", "[[the] text of] %displays% (doesn't|does not|do not|don't) have [a] (drop|text) shadow", "%displays%'[s] text (doesn't|does not|do not|don't) have [a] (drop|text) shadow" diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java index 0c6fb3f45d8..8b5294413ea 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java @@ -44,6 +44,8 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { switch (mode) { case REMOVE: change = -change; + //$FALL-THROUGH$ + case ADD: for (Display display : displays) { if (display instanceof TextDisplay textDisplay) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java index 9c4b1003d66..6cbb541de08 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayOpacity.java @@ -48,6 +48,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { case REMOVE_ALL: case REMOVE: change = -change; + //$FALL-THROUGH$ case ADD: for (Display display : displays) { if (display instanceof TextDisplay textDisplay) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java index 6671243eb59..5ec794ad778 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprItemOfEntity.java @@ -34,19 +34,19 @@ public class ExprItemOfEntity extends SimplePropertyExpression { static { - register(ExprItemOfEntity.class, Slot.class, "[the] item [inside]", "entities"); + register(ExprItemOfEntity.class, Slot.class, "item [inside]", "entities"); } @Override public @Nullable Slot convert(Entity entity) { - if (entity instanceof ItemFrame) { - return new ItemFrameSlot((ItemFrame) entity); - } else if (entity instanceof Item) { - return new DroppedItemSlot((Item) entity); - } else if (entity instanceof ThrowableProjectile) { - return new ThrowableProjectileSlot((ThrowableProjectile) entity); - } else if (entity instanceof ItemDisplay) { - return new DisplayEntitySlot((ItemDisplay) entity); + if (entity instanceof ItemFrame itemFrame) { + return new ItemFrameSlot(itemFrame); + } else if (entity instanceof Item item) { + return new DroppedItemSlot(item); + } else if (entity instanceof ThrowableProjectile throwableProjectile) { + return new ThrowableProjectileSlot(throwableProjectile); + } else if (entity instanceof ItemDisplay itemDisplay) { + return new DisplayEntitySlot(itemDisplay); } return null; // Other entities don't have associated items } @@ -58,7 +58,7 @@ public Class getReturnType() { @Override protected String getPropertyName() { - return "item of entity"; + return "item inside"; } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java index 9a4700f9627..9348492f5d4 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java @@ -40,7 +40,7 @@ public class ExprQuaternionAxisAngle extends SimplePropertyExpression[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { @@ -59,15 +59,13 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is @Override public Class @Nullable [] acceptChange(ChangeMode mode) { - switch (mode) { + return switch (mode) { case ADD, SET, REMOVE -> { if (Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) - return CollectionUtils.array(isAxis ? Vector.class : Number.class); - return null; - } - default -> { - return null; + yield CollectionUtils.array(isAxis ? Vector.class : Number.class); + yield null; } + default -> null; } } @@ -103,5 +101,4 @@ protected String getPropertyName() { return isAxis ? "axis" : "angle"; } - } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java index e4048f9ff63..163d8c5f137 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java @@ -44,8 +44,8 @@ public class ExprTextOf extends SimplePropertyExpression { @Override public @Nullable String convert(Object object) { - if (object instanceof TextDisplay) - return ((TextDisplay) object).getText(); + if (object instanceof TextDisplay textDisplay) + return textDisplay.getText(); return null; } @@ -61,13 +61,13 @@ public class ExprTextOf extends SimplePropertyExpression { public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { String value = delta == null ? null : (String) delta[0]; for (Object object : getExpr().getArray(event)) { - if (!(object instanceof TextDisplay)) + if (!(object instanceof TextDisplay textDisplay)) continue; if (IS_RUNNING_PAPER && serializer != null && value != null) { BaseComponent[] components = BungeeConverter.convert(ChatMessages.parseToArray(value)); - ((TextDisplay) object).text(serializer.deserialize(components)); + textDisplay.text(serializer.deserialize(components)); } else { - ((TextDisplay) object).setText(value); + textDisplay.setText(value); } } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java index 93140b62746..a177d25958e 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java @@ -46,4 +46,5 @@ public NonMutatingQuaternionRotator(Axis axis, Vector3f vector, float angle) { public Quaternionf rotate(Quaternionf input) { return rotator.apply(input); } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java index 25274ca3a3e..346be3d1b42 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java @@ -34,4 +34,5 @@ public NonMutatingVectorRotator(Axis axis, Vector vector, double angle) { public Vector rotate(Vector input) { return rotator.apply(input); } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java index 4826f2b63fd..5f41e75e26c 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java @@ -46,4 +46,5 @@ public QuaternionRotator(Axis axis, Vector3f vector, float angle) { public Quaternionf rotate(Quaternionf input) { return rotator.apply(input); } + } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java index c49cfc5b0c3..315024ee1e2 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java @@ -34,4 +34,5 @@ public VectorRotator(Axis axis, Vector vector, double angle) { public Vector rotate(Vector input) { return rotator.apply(input); } + } diff --git a/src/test/skript/tests/misc/displays.sk b/src/test/skript/tests/misc/displays.sk index 6c0c345daa7..e3d7df93a9e 100644 --- a/src/test/skript/tests/misc/displays.sk +++ b/src/test/skript/tests/misc/displays.sk @@ -1,4 +1,3 @@ - test "spawn displays" when running minecraft "1.19.4": spawn a text display at spawn of world "world": set {_display} to event-display From f7a7bb606c3e7d0fdd3f89fc88dcf36c6f7c0e2a Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Sat, 21 Sep 2024 20:02:17 -0400 Subject: [PATCH 101/104] requested changes 2 + rotator docs --- .../java/ch/njol/skript/aliases/ItemType.java | 11 +++++----- .../skript/expressions/ExprBlockData.java | 20 +++++++++---------- .../skript/expressions/ExprXYZComponent.java | 8 ++++---- .../java/ch/njol/skript/util/ColorRGB.java | 8 ++++++-- .../skript/bukkit/displays/DisplayData.java | 14 ++++++------- .../displays/generic/ExprDisplayShadow.java | 4 ++++ .../bukkit/displays/generic/package-info.java | 5 ----- .../bukkit/displays/item/package-info.java | 5 ----- .../bukkit/displays/text/package-info.java | 5 ----- .../bukkit/misc/effects/package-info.java | 5 ----- .../expressions/ExprQuaternionAxisAngle.java | 2 +- .../bukkit/misc/expressions/ExprTextOf.java | 2 +- .../bukkit/misc/expressions/package-info.java | 5 ----- .../bukkit/misc/rotation/DisplayRotator.java | 5 +++++ .../NonMutatingQuaternionRotator.java | 6 +++++- .../rotation/NonMutatingVectorRotator.java | 6 +++++- .../misc/rotation/QuaternionRotator.java | 4 ++++ .../bukkit/misc/rotation/VectorRotator.java | 4 ++++ 18 files changed, 62 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/org/skriptlang/skript/bukkit/displays/generic/package-info.java delete mode 100644 src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java delete mode 100644 src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java delete mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/effects/package-info.java delete mode 100644 src/main/java/org/skriptlang/skript/bukkit/misc/expressions/package-info.java diff --git a/src/main/java/ch/njol/skript/aliases/ItemType.java b/src/main/java/ch/njol/skript/aliases/ItemType.java index 266d84c5cde..cab9aede67e 100644 --- a/src/main/java/ch/njol/skript/aliases/ItemType.java +++ b/src/main/java/ch/njol/skript/aliases/ItemType.java @@ -1419,7 +1419,8 @@ public Material getMaterial() { } /** - * @return A random block material this ItemType represents. + * @return A random block material this ItemType represents. {@link Material#AIR} will be returned if no block + * material exists. */ public Material getBlockMaterial() { List blockItemDatas = new ArrayList<>(); @@ -1427,10 +1428,10 @@ public Material getBlockMaterial() { if (d.type.isBlock()) blockItemDatas.add(d); } - ItemData data = blockItemDatas.get(random.nextInt(blockItemDatas.size())); - if (data == null) - throw new IllegalStateException("material not found"); - return data.getType(); + if (blockItemDatas.isEmpty()) + throw new IllegalStateException("This ItemType does not represent a material. " + + "ItemData#hasBlock() should return true before invoking this method."); + return blockItemDatas.get(random.nextInt(blockItemDatas.size())).getType(); } /** diff --git a/src/main/java/ch/njol/skript/expressions/ExprBlockData.java b/src/main/java/ch/njol/skript/expressions/ExprBlockData.java index 2703511c626..210d653842e 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprBlockData.java +++ b/src/main/java/ch/njol/skript/expressions/ExprBlockData.java @@ -29,16 +29,16 @@ public class ExprBlockData extends SimplePropertyExpression { static { - if (Skript.classExists("org.bukkit.block.data.BlockData")) - register(ExprBlockData.class, BlockData.class, "block[ ]data", Skript.isRunningMinecraft(1, 19, 4) ? "blocks/displays" : "blocks"); + String types = Skript.isRunningMinecraft(1, 19, 4) ? "blocks/displays" : "blocks"; + register(ExprBlockData.class, BlockData.class, "block[ ]data", types); } @Override public @Nullable BlockData convert(Object object) { - if (object instanceof Block) - return ((Block) object).getBlockData(); - if (object instanceof BlockDisplay) - return ((BlockDisplay) object).getBlock(); + if (object instanceof Block block) + return block.getBlockData(); + if (object instanceof BlockDisplay blockDisplay) + return blockDisplay.getBlock(); return null; } @@ -55,10 +55,10 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { assert delta != null; // reset/delete not supported BlockData blockData = ((BlockData) delta[0]); for (Object object : getExpr().getArray(event)) { - if (object instanceof Block) { - ((Block) object).setBlockData(blockData); - } else if (object instanceof BlockDisplay) { - ((BlockDisplay) object).setBlock(blockData); + if (object instanceof Block block) { + block.setBlockData(blockData); + } else if (object instanceof BlockDisplay blockDisplay) { + blockDisplay.setBlock(blockData); } } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index f66bb348827..a6db3c7e92e 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -111,10 +111,10 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { for (Object object : objects) { if (object instanceof Vector vector) { - changeVector(vector, value, mode); + changeVector(vector, axis, value, mode); hasVectors = true; } else if (object instanceof Quaternionf quaternion) { - changeQuaternion(quaternion, (float) value, mode); + changeQuaternion(quaternion, axis, (float) value, mode); hasQuaternions = true; } else { hasInvalidInput = true; @@ -140,7 +140,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { * @param value the value to modify by * @param mode the change mode to determine the modification type */ - private void changeVector(Vector vector, double value, ChangeMode mode) { + private static void changeVector(Vector vector, Axis axis, double value, ChangeMode mode) { if (axis == Axis.W) return; switch (mode) { @@ -173,7 +173,7 @@ private void changeVector(Vector vector, double value, ChangeMode mode) { * @param value the value to modify by * @param mode the change mode to determine the modification type */ - private void changeQuaternion(Quaternionf quaternion, float value, ChangeMode mode) { + private static void changeQuaternion(Quaternionf quaternion, Axis axis, float value, ChangeMode mode) { float x = quaternion.x(); float y = quaternion.y(); float z = quaternion.z(); diff --git a/src/main/java/ch/njol/skript/util/ColorRGB.java b/src/main/java/ch/njol/skript/util/ColorRGB.java index dde0055a77c..7b3c99f328c 100644 --- a/src/main/java/ch/njol/skript/util/ColorRGB.java +++ b/src/main/java/ch/njol/skript/util/ColorRGB.java @@ -6,6 +6,7 @@ import ch.njol.yggdrasil.Fields; import org.apache.commons.lang.math.NumberUtils; import org.bukkit.DyeColor; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; @@ -28,6 +29,7 @@ public class ColorRGB implements Color { * This is to keep inline with other color classes. */ @Deprecated + @ApiStatus.Internal public ColorRGB(int red, int green, int blue) { this(org.bukkit.Color.fromRGB( Math2.fit(0, red, 255), @@ -40,6 +42,7 @@ public ColorRGB(int red, int green, int blue) { * This is to keep inline with other color classes. */ @Deprecated + @ApiStatus.Internal public ColorRGB(org.bukkit.Color bukkit) { this.dye = DyeColor.getByColor(bukkit); this.bukkit = bukkit; @@ -103,9 +106,10 @@ public DyeColor asDyeColor() { @Override public String getName() { + String rgb = bukkit.getRed() + ", " + bukkit.getGreen() + ", " + bukkit.getBlue(); if (HAS_ARGB && bukkit.getAlpha() != 255) - return "argb " + bukkit.getAlpha() + ", " + bukkit.getRed() + ", " + bukkit.getGreen() + ", " + bukkit.getBlue(); - return "rgb " + bukkit.getRed() + ", " + bukkit.getGreen() + ", " + bukkit.getBlue(); + return "argb " + bukkit.getAlpha() + ", " + rgb; + return "rgb " + rgb; } @Nullable diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java index a59f0a25e23..f991a94c1b2 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java @@ -54,7 +54,7 @@ public String toString() { return codeName; } - public static final String[] codeNames; + private static final String[] codeNames; static { List codeNamesList = new ArrayList<>(); for (DisplayType type : values()) { @@ -166,23 +166,23 @@ public void set(Display entity) { public boolean match(Display entity) { switch (type) { case BLOCK -> { - if (!(entity instanceof BlockDisplay)) + if (!(entity instanceof BlockDisplay blockDisplay)) return false; - if (blockData != null && !((BlockDisplay) entity).getBlock().equals(blockData)) + if (blockData != null && !blockDisplay.getBlock().equals(blockData)) return false; } case ITEM -> { - if (!(entity instanceof ItemDisplay)) + if (!(entity instanceof ItemDisplay itemDisplay)) return false; - if (item != null && !((ItemDisplay) entity).getItemStack().isSimilar(item)) + if (item != null && !itemDisplay.getItemStack().isSimilar(item)) return false; } case TEXT -> { - if (!(entity instanceof TextDisplay)) + if (!(entity instanceof TextDisplay textDisplay)) return false; if (text == null) // all text displays should match a blank one. return true; - String displayText = ((TextDisplay) entity).getText(); + String displayText = textDisplay.getText(); if (displayText == null) return false; return displayText.equals(text); diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java index eb9c68cf1fb..21b09cad242 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayShadow.java @@ -60,9 +60,13 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { for (Display display : displays) { if (radius) { float value = Math.max(0F, display.getShadowRadius() + change); + if (Float.isInfinite(value)) + continue; display.setShadowRadius(value); } else { float value = Math.max(0F, display.getShadowStrength() + change); + if (Float.isInfinite(value)) + continue; display.setShadowStrength(value); } } diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/package-info.java deleted file mode 100644 index 7e779a4ae8f..00000000000 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE}) -package org.skriptlang.skript.bukkit.displays.generic; - -import org.eclipse.jdt.annotation.DefaultLocation; -import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java deleted file mode 100644 index 86afaa43700..00000000000 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/item/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package org.skriptlang.skript.bukkit.displays.item; - -import org.eclipse.jdt.annotation.DefaultLocation; -import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java deleted file mode 100644 index f6430661eed..00000000000 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE, DefaultLocation.FIELD}) -package org.skriptlang.skript.bukkit.displays.text; - -import org.eclipse.jdt.annotation.DefaultLocation; -import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/package-info.java deleted file mode 100644 index 5b2ab2f87f2..00000000000 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE}) -package org.skriptlang.skript.bukkit.misc.effects; - -import org.eclipse.jdt.annotation.DefaultLocation; -import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java index 9348492f5d4..d74cfabf897 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java @@ -66,7 +66,7 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is yield null; } default -> null; - } + }; } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java index 163d8c5f137..1a502d098d5 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprTextOf.java @@ -39,7 +39,7 @@ public class ExprTextOf extends SimplePropertyExpression { // This is because this expression is setup to support future types. // Remove this if non-versioning. if (!types.isEmpty()) - register(ExprTextOf.class, String.class, "(string|text)[s]", types); + register(ExprTextOf.class, String.class, "text[s]", types); } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/package-info.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/package-info.java deleted file mode 100644 index 3c08c41d4f8..00000000000 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/package-info.java +++ /dev/null @@ -1,5 +0,0 @@ -@NonNullByDefault({DefaultLocation.PARAMETER, DefaultLocation.RETURN_TYPE}) -package org.skriptlang.skript.bukkit.misc.expressions; - -import org.eclipse.jdt.annotation.DefaultLocation; -import org.eclipse.jdt.annotation.NonNullByDefault; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java index 6142e6a3e84..423fff82510 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/DisplayRotator.java @@ -6,6 +6,11 @@ import org.joml.Quaternionf; import org.joml.Vector3f; +/** + * Rotates {@link Display}s around the X, Y, and Z axes, as well as any arbitrary axis. + * Supports all local axes. + * Modifies the left rotation of the display. + */ public class DisplayRotator implements Rotator { private final QuaternionRotator qRotator; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java index a177d25958e..5080e60151a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java @@ -5,7 +5,11 @@ import org.joml.Vector3f; import java.util.function.Function; - +/** + * Rotates {@link Quaternionf}s around the X, Y, and Z axes, as well as any arbitrary axis. + * Supports all local axes. + * Returns new quaternion objects rather than mutating the input quaternion. + */ public class NonMutatingQuaternionRotator implements Rotator { private final Function rotator; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java index 346be3d1b42..536b5329c96 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java @@ -4,7 +4,11 @@ import org.jetbrains.annotations.Contract; import java.util.function.Function; - +/** + * Rotates {@link Vector}s around the X, Y, and Z axes, as well as any arbitrary axis. + * Does not support local axes. + * Returns new vector objects rather than mutating the input vector. + */ public class NonMutatingVectorRotator implements Rotator { private final Function rotator; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java index 5f41e75e26c..694510d6739 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/QuaternionRotator.java @@ -6,6 +6,10 @@ import java.util.function.Function; +/** + * Rotates {@link Quaternionf}s around the X, Y, and Z axes, as well as any arbitrary axis. + * Supports all local axes. + */ public class QuaternionRotator implements Rotator { private final Function rotator; diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java index 315024ee1e2..82760fe0fe2 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java @@ -5,6 +5,10 @@ import java.util.function.Function; +/** + * Rotates {@link Vector}s around the X, Y, and Z axes, as well as any arbitrary axis. + * Does not support local axes. + */ public class VectorRotator implements Rotator { private final Function rotator; From ca655f4de6881378aea60bed21ccc0974bc6d392 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Wed, 2 Oct 2024 10:33:02 -0400 Subject: [PATCH 102/104] requested changes --- .../skript/bukkit/displays/DisplayData.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java index f991a94c1b2..dda662cf256 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/DisplayData.java @@ -142,22 +142,16 @@ protected boolean init(@Nullable Class displayClass, @Nullabl public void set(Display entity) { switch (type) { case BLOCK -> { - if (!(entity instanceof BlockDisplay)) - return; - if (blockData != null) - ((BlockDisplay) entity).setBlock(blockData); + if (blockData != null && entity instanceof BlockDisplay blockDisplay) + blockDisplay.setBlock(blockData); } case ITEM -> { - if (!(entity instanceof ItemDisplay)) - return; - if (item != null) - ((ItemDisplay) entity).setItemStack(item); + if (item != null && entity instanceof ItemDisplay itemDisplay) + itemDisplay.setItemStack(item); } case TEXT -> { - if (!(entity instanceof TextDisplay)) - return; - if (text != null) - ((TextDisplay) entity).setText(text); + if (text != null && entity instanceof TextDisplay textDisplay) + textDisplay.setText(text); } } } From 64656bf4fcbe2c68f161b2a6d43d17a9c4e569f0 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Wed, 2 Oct 2024 10:47:33 -0400 Subject: [PATCH 103/104] Apply suggestions from code review Co-authored-by: Patrick Miller --- .../skript/bukkit/displays/text/ExprTextDisplayLineWidth.java | 1 - .../bukkit/misc/rotation/NonMutatingQuaternionRotator.java | 1 + .../skript/bukkit/misc/rotation/NonMutatingVectorRotator.java | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java index 8b5294413ea..3ac44924046 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/text/ExprTextDisplayLineWidth.java @@ -45,7 +45,6 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { case REMOVE: change = -change; //$FALL-THROUGH$ - case ADD: for (Display display : displays) { if (display instanceof TextDisplay textDisplay) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java index 5080e60151a..2d99ea9375f 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingQuaternionRotator.java @@ -5,6 +5,7 @@ import org.joml.Vector3f; import java.util.function.Function; + /** * Rotates {@link Quaternionf}s around the X, Y, and Z axes, as well as any arbitrary axis. * Supports all local axes. diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java index 536b5329c96..e39c5d179e4 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.Contract; import java.util.function.Function; + /** * Rotates {@link Vector}s around the X, Y, and Z axes, as well as any arbitrary axis. * Does not support local axes. From 17664a912afd53ecff21a50d7f1ed28540134f46 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Wed, 2 Oct 2024 10:55:02 -0400 Subject: [PATCH 104/104] requested changes! --- .../java/ch/njol/skript/aliases/ItemType.java | 6 +++--- .../java/ch/njol/skript/util/ColorRGB.java | 18 ++++++++---------- .../displays/generic/ExprDisplayViewRange.java | 2 ++ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/ch/njol/skript/aliases/ItemType.java b/src/main/java/ch/njol/skript/aliases/ItemType.java index c7c18fb42ff..39ce6d21962 100644 --- a/src/main/java/ch/njol/skript/aliases/ItemType.java +++ b/src/main/java/ch/njol/skript/aliases/ItemType.java @@ -1415,8 +1415,8 @@ public Material getMaterial() { } /** - * @return A random block material this ItemType represents. {@link Material#AIR} will be returned if no block - * material exists. + * @return A random block material this ItemType represents. + * @throws IllegalStateException If {@link #hasBlock()} is false. */ public Material getBlockMaterial() { List blockItemDatas = new ArrayList<>(); @@ -1426,7 +1426,7 @@ public Material getBlockMaterial() { } if (blockItemDatas.isEmpty()) throw new IllegalStateException("This ItemType does not represent a material. " + - "ItemData#hasBlock() should return true before invoking this method."); + "ItemType#hasBlock() should return true before invoking this method."); return blockItemDatas.get(random.nextInt(blockItemDatas.size())).getType(); } diff --git a/src/main/java/ch/njol/skript/util/ColorRGB.java b/src/main/java/ch/njol/skript/util/ColorRGB.java index 7b3c99f328c..141f753f701 100644 --- a/src/main/java/ch/njol/skript/util/ColorRGB.java +++ b/src/main/java/ch/njol/skript/util/ColorRGB.java @@ -8,6 +8,7 @@ import org.bukkit.DyeColor; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.NotSerializableException; @@ -17,12 +18,12 @@ public class ColorRGB implements Color { + private static final boolean HAS_ARGB = Skript.methodExists(org.bukkit.Color.class, "getAlpha"); private static final Pattern RGB_PATTERN = Pattern.compile("(?>rgb|RGB) (\\d+), (\\d+), (\\d+)"); private org.bukkit.Color bukkit; - @Nullable - private DyeColor dye; + private @Nullable DyeColor dye; /** * Subject to being private in the future. Use {@link #fromRGB(int, int, int)} @@ -48,7 +49,6 @@ public ColorRGB(org.bukkit.Color bukkit) { this.bukkit = bukkit; } - private static final boolean HAS_ARGB = Skript.methodExists(org.bukkit.Color.class, "getAlpha"); /** * Returns a ColorRGB object from the provided arguments. Versions lower than 1.19 will not support alpha values. * @@ -59,7 +59,7 @@ public ColorRGB(org.bukkit.Color bukkit) { * @return ColorRGB */ @Contract("_,_,_,_ -> new") - public static ColorRGB fromRGBA(int red, int green, int blue, int alpha) { + public static @NotNull ColorRGB fromRGBA(int red, int green, int blue, int alpha) { org.bukkit.Color bukkit; if (HAS_ARGB) { bukkit = org.bukkit.Color.fromARGB(alpha, red, green, blue); @@ -78,7 +78,7 @@ public static ColorRGB fromRGBA(int red, int green, int blue, int alpha) { * @return ColorRGB */ @Contract("_,_,_ -> new") - public static ColorRGB fromRGB(int red, int green, int blue) { + public static @NotNull ColorRGB fromRGB(int red, int green, int blue) { return new ColorRGB(red, green, blue); } @@ -89,7 +89,7 @@ public static ColorRGB fromRGB(int red, int green, int blue) { * @return ColorRGB */ @Contract("_ -> new") - public static ColorRGB fromBukkitColor(org.bukkit.Color bukkit) { + public static @NotNull ColorRGB fromBukkitColor(org.bukkit.Color bukkit) { return new ColorRGB(bukkit); } @@ -99,8 +99,7 @@ public org.bukkit.Color asBukkitColor() { } @Override - @Nullable - public DyeColor asDyeColor() { + public @Nullable DyeColor asDyeColor() { return dye; } @@ -112,8 +111,7 @@ public String getName() { return "rgb " + rgb; } - @Nullable - public static ColorRGB fromString(String string) { + public static @Nullable ColorRGB fromString(String string) { Matcher matcher = RGB_PATTERN.matcher(string); if (!matcher.matches()) return null; diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java index f6216ff9283..0775fb4f1fd 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayViewRange.java @@ -51,6 +51,8 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { case ADD: for (Display display : displays) { float value = Math.max(0F, display.getViewRange() + change); + if (Float.isInfinite(value)) + continue; display.setViewRange(value); } break;