From 99235a7a47fd0cbc64bc1264946cd2c30146a9b6 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Wed, 4 Mar 2026 09:23:25 -0800 Subject: [PATCH 1/9] Doc Updates - wiki links and asset store wiki usage --- .../skript/api/skript/docs/JsonDocPrinter.java | 8 ++++++++ .../api/skript/docs/MarkdownDocPrinter.java | 15 ++++++++++++++- .../skript/registration/SkriptRegistration.java | 11 +++++++++-- .../skript/api/skript/testing/TestRunner.java | 7 +++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/docs/JsonDocPrinter.java b/src/main/java/com/github/skriptdev/skript/api/skript/docs/JsonDocPrinter.java index d98a1ec0..c6a88b1a 100644 --- a/src/main/java/com/github/skriptdev/skript/api/skript/docs/JsonDocPrinter.java +++ b/src/main/java/com/github/skriptdev/skript/api/skript/docs/JsonDocPrinter.java @@ -2,6 +2,7 @@ import com.github.skriptdev.skript.api.skript.addon.HySkriptAddon; import com.github.skriptdev.skript.api.skript.event.CancellableContext; +import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration.AssetStoreType; import com.github.skriptdev.skript.api.utils.Utils; import com.github.skriptdev.skript.plugin.HySk; import com.github.skriptdev.skript.plugin.Skript; @@ -417,6 +418,13 @@ private void printTypes(BsonDocument mainDocs, SkriptRegistration registration) for (String s : documentation.getDescription()) { descriptionArray.add(new BsonString(s)); } + if (registration instanceof com.github.skriptdev.skript.api.skript.registration.SkriptRegistration) { + if (type instanceof AssetStoreType) { + String link = "[Click Here](https://github.com/SkriptDev/HySkript/wiki/_usage-" + + documentation.getName().replace(" ", "-") + ")"; + descriptionArray.add(new BsonString("For all values: " + link)); + } + } syntaxDoc.put("description", descriptionArray); // USAGE diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/docs/MarkdownDocPrinter.java b/src/main/java/com/github/skriptdev/skript/api/skript/docs/MarkdownDocPrinter.java index b350506a..35790dcf 100644 --- a/src/main/java/com/github/skriptdev/skript/api/skript/docs/MarkdownDocPrinter.java +++ b/src/main/java/com/github/skriptdev/skript/api/skript/docs/MarkdownDocPrinter.java @@ -1,9 +1,11 @@ package com.github.skriptdev.skript.api.skript.docs; import com.github.skriptdev.skript.api.skript.event.CancellableContext; +import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration.AssetStoreType; import com.github.skriptdev.skript.api.utils.Utils; import com.github.skriptdev.skript.plugin.HySk; import com.github.skriptdev.skript.plugin.Skript; +import com.hypixel.hytale.assetstore.map.DefaultAssetMap; import io.github.syst3ms.skriptparser.Parser; import io.github.syst3ms.skriptparser.docs.Documentation; import io.github.syst3ms.skriptparser.lang.CodeSection; @@ -222,7 +224,7 @@ private static void printFunctions(PrintWriter writer, SkriptRegistration reg) { } } Documentation documentation = jf.getDocumentation(); - if (documentation.isNoDoc()) return; + if (documentation == null || documentation.isNoDoc()) return; // Create a pattern for a function String pattern = String.format("%s(%s)", jf.getName(), String.join(", ", parameterNames)); @@ -258,6 +260,17 @@ private static void printTypes(PrintWriter writer, SkriptRegistration registrati Documentation documentation = type.getDocumentation(); if (documentation.isNoDoc()) return; + if (type instanceof AssetStoreType assetStoreType) { + List keys = new ArrayList<>(); + DefaultAssetMap assetMap = assetStoreType.getAssetMap(); + assetMap.getAssetMap().keySet().forEach(key -> { + if (key instanceof String s) { + keys.add(s); + } + }); + documentation.setUsage(String.join(", ", keys)); + + } printDocumentation("Type", writer, documentation, List.of()); writer.println("- **Can Be Serialized**: " + type.getSerializer().isPresent()); }); diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/registration/SkriptRegistration.java b/src/main/java/com/github/skriptdev/skript/api/skript/registration/SkriptRegistration.java index ffc1741c..d2fc2df5 100644 --- a/src/main/java/com/github/skriptdev/skript/api/skript/registration/SkriptRegistration.java +++ b/src/main/java/com/github/skriptdev/skript/api/skript/registration/SkriptRegistration.java @@ -181,7 +181,7 @@ public AssetStoreRegistrar since(String since) { public void register() { AssetStoreType assetStoreType = new AssetStoreType<>(assetClass, baseName, pattern, literalParser, toStringFunction, toVariableNameFunction, - defaultChanger, arithmetic, documentation, serializer, this.supplier); + defaultChanger, arithmetic, documentation, serializer, this.supplier, this.assetMap); newTypes = true; types.add(assetStoreType); } @@ -189,13 +189,20 @@ public void register() { public static class AssetStoreType, K extends String> extends Type { + private final DefaultAssetMap assetMap; + public AssetStoreType(Class c, String baseName, String pattern, Function literalParser, Function toStringFunction, Function toVariableNameFunction, Changer defaultChanger, Arithmetic arithmetic, Documentation documentation, TypeSerializer serializer, - Supplier> supplier) { + Supplier> supplier, DefaultAssetMap assetMap) { super(c, baseName, pattern, literalParser, toStringFunction, toVariableNameFunction, defaultChanger, arithmetic, documentation, serializer, supplier); + this.assetMap = assetMap; + } + + public DefaultAssetMap getAssetMap() { + return this.assetMap; } } diff --git a/src/main/java/com/github/skriptdev/skript/api/skript/testing/TestRunner.java b/src/main/java/com/github/skriptdev/skript/api/skript/testing/TestRunner.java index 7f61e754..27287b28 100644 --- a/src/main/java/com/github/skriptdev/skript/api/skript/testing/TestRunner.java +++ b/src/main/java/com/github/skriptdev/skript/api/skript/testing/TestRunner.java @@ -7,6 +7,8 @@ import com.hypixel.hytale.math.vector.Vector3i; import com.hypixel.hytale.server.core.HytaleServer; import com.hypixel.hytale.server.core.Message; +import com.hypixel.hytale.server.core.command.system.CommandManager; +import com.hypixel.hytale.server.core.console.ConsoleSender; import com.hypixel.hytale.server.core.universe.Universe; import com.hypixel.hytale.server.core.universe.world.World; import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk; @@ -49,6 +51,11 @@ public void start() { loadTests(); Utils.log("Finished loading test scripts!"); + // Print docs + CommandManager commandManager = CommandManager.get(); + commandManager.handleCommand(ConsoleSender.INSTANCE, "sk docs json"); + commandManager.handleCommand(ConsoleSender.INSTANCE, "sk docs md"); + // Make sure the world isn't paused if (this.world.isPaused()) this.world.setPaused(false); From 04656c92ddfa06af81f24c39913970ae3e27e415 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Wed, 4 Mar 2026 09:25:40 -0800 Subject: [PATCH 2/9] EffAttackOverrides - fix missing since --- .../plugin/elements/effects/entity/EffAttackOverrides.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/entity/EffAttackOverrides.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/entity/EffAttackOverrides.java index 39419f79..949da895 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/entity/EffAttackOverrides.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/entity/EffAttackOverrides.java @@ -21,6 +21,7 @@ public static void register(SkriptRegistration reg) { .description("Applies an attack override to NPCs or clears their attack overrides.") .examples("apply attack override Gun_Shoot to {_e}", "clear attack overrides of {_e}") + .since("1.3.0") .register(); } From 8cd4587b2623adf9828aae973f9d29c8218a0967 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Wed, 4 Mar 2026 14:29:20 -0800 Subject: [PATCH 3/9] EffCameraEffect - new --- .../elements/effects/EffectHandler.java | 2 + .../effects/player/EffCameraEffect.java | 89 +++++++++++++++++++ .../elements/types/TypesAssetStore.java | 8 ++ 3 files changed, 99 insertions(+) create mode 100644 src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffCameraEffect.java diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/EffectHandler.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/EffectHandler.java index 9de4faad..ab5928c0 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/EffectHandler.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/EffectHandler.java @@ -25,6 +25,7 @@ import com.github.skriptdev.skript.plugin.elements.effects.other.EffSendMessage; import com.github.skriptdev.skript.plugin.elements.effects.other.EffSendTitle; import com.github.skriptdev.skript.plugin.elements.effects.player.EffBan; +import com.github.skriptdev.skript.plugin.elements.effects.player.EffCameraEffect; import com.github.skriptdev.skript.plugin.elements.effects.player.EffCloseWindows; import com.github.skriptdev.skript.plugin.elements.effects.player.EffConnect; import com.github.skriptdev.skript.plugin.elements.effects.player.EffKick; @@ -72,6 +73,7 @@ public static void register(SkriptRegistration registration) { // PLAYER EffBan.register(registration); + EffCameraEffect.register(registration); EffCloseWindows.register(registration); EffConnect.register(registration); EffKick.register(registration); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffCameraEffect.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffCameraEffect.java new file mode 100644 index 00000000..068425bd --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/effects/player/EffCameraEffect.java @@ -0,0 +1,89 @@ +package com.github.skriptdev.skript.plugin.elements.effects.player; + +import com.github.skriptdev.skript.api.hytale.utils.PlayerUtils; +import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration; +import com.hypixel.hytale.protocol.packets.camera.CameraShakeEffect; +import com.hypixel.hytale.server.core.asset.type.camera.CameraEffect; +import com.hypixel.hytale.server.core.entity.entities.Player; +import com.hypixel.hytale.server.core.io.PacketHandler; +import com.hypixel.hytale.server.core.universe.PlayerRef; +import io.github.syst3ms.skriptparser.lang.Effect; +import io.github.syst3ms.skriptparser.lang.Expression; +import io.github.syst3ms.skriptparser.lang.TriggerContext; +import io.github.syst3ms.skriptparser.parsing.ParseContext; +import org.jetbrains.annotations.NotNull; + +public class EffCameraEffect extends Effect { + + public static void register(SkriptRegistration reg) { + reg.newEffect(EffCameraEffect.class, + "apply camera effect %cameraeffect% to %players/playerrefs%", + "apply camera effect %cameraeffect% with intensity %number% to %players/playerrefs%") + .name("Apply Camera Effect") + .description("Applies a camera effect to the specified players with an optional intensity.") + .examples("apply camera effect Impact_Strong to player", + "apply camera effect Mace_Explode with intensity 2 to player") + .since("INSERT VERSION") + .register(); + } + + private Expression cameraEffect; + private Expression intensity; + private Expression players; + + + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression @NotNull [] expressions, int matchedPattern, @NotNull ParseContext parseContext) { + if (matchedPattern == 0) { + this.cameraEffect = (Expression) expressions[0]; + this.players = expressions[1]; + } else { + this.cameraEffect = (Expression) expressions[0]; + this.intensity = (Expression) expressions[1]; + this.players = expressions[2]; + } + return true; + } + + @Override + protected void execute(@NotNull TriggerContext ctx) { + CameraEffect effect = this.cameraEffect.getSingle(ctx).orElse(null); + if (effect == null) return; + + CameraShakeEffect cameraShakePacket = null; + if (this.intensity != null) { + Number number = this.intensity.getSingle(ctx).orElse(null); + if (number != null) { + float v = number.floatValue(); + cameraShakePacket = effect.createCameraShakePacket(v); + } + } + if (cameraShakePacket == null) { + cameraShakePacket = effect.createCameraShakePacket(); + } + + for (Object object : this.players.getArray(ctx)) { + PacketHandler packetHandler; + if (object instanceof Player player) { + PlayerRef playerRef = PlayerUtils.getPlayerRef(player); + if (playerRef == null) continue; + packetHandler = playerRef.getPacketHandler(); + } else if (object instanceof PlayerRef playerRef) { + packetHandler = playerRef.getPacketHandler(); + } else { + continue; + } + + packetHandler.writeNoCache(cameraShakePacket); + } + } + + @Override + public String toString(@NotNull TriggerContext ctx, boolean debug) { + String intensity = this.intensity != null ? " with intensity " + this.intensity.toString(ctx, debug) : ""; + return "apply camera effect " + this.cameraEffect.toString(ctx, debug) + intensity + + " to " + this.players.toString(ctx, debug); + } + +} diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesAssetStore.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesAssetStore.java index 469520ff..13be63dc 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesAssetStore.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesAssetStore.java @@ -8,6 +8,7 @@ import com.hypixel.hytale.codec.ExtraInfo; import com.hypixel.hytale.common.util.java.ManifestUtil; import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType; +import com.hypixel.hytale.server.core.asset.type.camera.CameraEffect; import com.hypixel.hytale.server.core.asset.type.entityeffect.config.EntityEffect; import com.hypixel.hytale.server.core.asset.type.environment.config.Environment; import com.hypixel.hytale.server.core.asset.type.fluid.Fluid; @@ -56,6 +57,13 @@ static void register(SkriptRegistration reg) { .since("1.0.0") .toStringFunction(BlockType::getId) .register(); + reg.newAssetStoreType(CameraEffect.class, CameraEffect.getAssetMap(), + "cameraeffect", "cameraEffect@s") + .name("Camera Effect") + .description("Represents the types of camera effects in the game.") + .since("INSERT VERSION") + .toStringFunction(CameraEffect::getId) + .register(); reg.newAssetStoreType(CraftingRecipe.class, CraftingRecipe.getAssetMap(), "craftingrecipe", "craftingrecipe@s") .name("Crafting Recipe") .description("Represents the crafting recipes in the game.") From 7befb806932f79e42731c77a7bb7529c69906468 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Wed, 4 Mar 2026 18:38:05 -0800 Subject: [PATCH 4/9] EvtTeleport - add teleport event --- .../plugin/elements/events/EventHandler.java | 2 + .../elements/events/entity/EvtTeleport.java | 207 ++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 src/main/java/com/github/skriptdev/skript/plugin/elements/events/entity/EvtTeleport.java diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/EventHandler.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/EventHandler.java index 65720a61..b1d98c82 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/EventHandler.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/EventHandler.java @@ -15,6 +15,7 @@ import com.github.skriptdev.skript.plugin.elements.events.entity.EvtEntityPickupItem; import com.github.skriptdev.skript.plugin.elements.events.entity.EvtEntityRemove; import com.github.skriptdev.skript.plugin.elements.events.entity.EvtLivingEntityInvChange; +import com.github.skriptdev.skript.plugin.elements.events.entity.EvtTeleport; import com.github.skriptdev.skript.plugin.elements.events.inventory.EvtInventoryMove; import com.github.skriptdev.skript.plugin.elements.events.inventory.EvtItemStackSlotTransaction; import com.github.skriptdev.skript.plugin.elements.events.inventory.EvtSlotTransaction; @@ -63,6 +64,7 @@ public static void register(SkriptRegistration registration) { EvtEntityPickupItem.register(registration); EvtEntityRemove.register(registration); EvtLivingEntityInvChange.register(registration); + EvtTeleport.register(registration); // INVENTORY InventoryListener.registerListener(registration); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/entity/EvtTeleport.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/entity/EvtTeleport.java new file mode 100644 index 00000000..f4f8cdad --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/entity/EvtTeleport.java @@ -0,0 +1,207 @@ +package com.github.skriptdev.skript.plugin.elements.events.entity; + +import com.github.skriptdev.skript.api.hytale.utils.EntityUtils; +import com.github.skriptdev.skript.api.skript.event.PlayerContext; +import com.github.skriptdev.skript.api.skript.event.SystemEvent; +import com.github.skriptdev.skript.api.skript.event.WorldContext; +import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration; +import com.hypixel.hytale.component.CommandBuffer; +import com.hypixel.hytale.component.ComponentType; +import com.hypixel.hytale.component.Ref; +import com.hypixel.hytale.component.Store; +import com.hypixel.hytale.component.dependency.Dependency; +import com.hypixel.hytale.component.dependency.RootDependency; +import com.hypixel.hytale.component.query.Query; +import com.hypixel.hytale.component.system.RefChangeSystem; +import com.hypixel.hytale.math.vector.Location; +import com.hypixel.hytale.math.vector.Vector3d; +import com.hypixel.hytale.math.vector.Vector3f; +import com.hypixel.hytale.server.core.entity.Entity; +import com.hypixel.hytale.server.core.entity.entities.Player; +import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent; +import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport; +import com.hypixel.hytale.server.core.universe.world.World; +import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; +import com.hypixel.hytale.server.npc.entities.NPCEntity; +import io.github.syst3ms.skriptparser.lang.Expression; +import io.github.syst3ms.skriptparser.lang.TriggerContext; +import io.github.syst3ms.skriptparser.lang.TriggerMap; +import io.github.syst3ms.skriptparser.parsing.ParseContext; +import io.github.syst3ms.skriptparser.registration.context.ContextValue; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.Set; + +public class EvtTeleport extends SystemEvent { + + public static void register(SkriptRegistration reg) { + reg.newEvent(EvtTeleport.class, + "teleport", "npc teleport", "player teleport") + .name("Teleport") + .description("Called when an entity/player teleports.") + .examples("on player teleport:", + "\tsend \"Ok byeeee....\" to player") + .since("INSERT VERSION") + .setHandledContexts(TeleportContext.class) + .register(); + + reg.newSingleContextValue(TeleportContext.class, Location.class, + "location", TeleportContext::getLocation) + .description("The location of the entity after the teleport.") + .register(); + reg.newSingleContextValue(TeleportContext.class, Location.class, + "location", TeleportContext::getPastLocation) + .setState(ContextValue.State.PAST) + .description("The location of the entity before the teleport.") + .register(); + reg.newSingleContextValue(TeleportContext.class, World.class, + "world", TeleportContext::getPastWorld) + .setState(ContextValue.State.PAST) + .description("The world of the entity before the teleport.") + .register(); + reg.newSingleContextValue(TeleportContext.class, Entity.class, + "entity", TeleportContext::getEntity) + .description("The entity that was teleported.") + .register(); + } + + private static TeleportSystem SYSTEM; + private int pattern; + + @Override + public boolean init(Expression[] expressions, int matchedPattern, ParseContext parseContext) { + this.pattern = matchedPattern; + if (SYSTEM == null) { + SYSTEM = new TeleportSystem(); + applySystem(SYSTEM); + } + return true; + } + + @Override + public boolean check(TriggerContext ctx) { + if (!(ctx instanceof TeleportContext teleportContext)) return false; + if (this.pattern == 0) return true; + else return this.pattern == teleportContext.getPattern(); + } + + @Override + public String toString(@NotNull TriggerContext ctx, boolean debug) { + return "teleport"; + } + + public static class TeleportContext implements PlayerContext, WorldContext { + + private final int pattern; + private final Teleport teleport; + private final Entity entity; + + public TeleportContext(int pattern, Teleport teleport, Entity entity) { + this.pattern = pattern; + this.teleport = teleport; + this.entity = entity; + } + + public int getPattern() { + return this.pattern; + } + + public Entity getEntity() { + return this.entity; + } + + @Override + public Player getPlayer() { + if (this.entity instanceof Player player) { + return player; + } + return null; + } + + @Override + public World getWorld() { + return this.teleport.getWorld(); + } + + public World getPastWorld() { + return this.entity.getWorld(); + } + + public Location getLocation() { + return new Location(getWorld().getName(), this.teleport.getPosition(), this.teleport.getRotation()); + } + + public Location getPastLocation() { + World world = this.entity.getWorld(); + assert world != null; + TransformComponent component = EntityUtils.getComponent(this.entity, TransformComponent.getComponentType()); + assert component != null; + Vector3d position = component.getPosition(); + Vector3f rotation = component.getRotation(); + return new Location(world.getName(), position, rotation); + } + + @Override + public String getName() { + return "teleport-context"; + } + } + + public static class TeleportSystem extends RefChangeSystem { + + @Override + public @NotNull ComponentType componentType() { + return Teleport.getComponentType(); + } + + @Override + public @NotNull Set> getDependencies() { + return Collections.singleton(RootDependency.first()); + } + + @SuppressWarnings("DataFlowIssue") + @Override + public void onComponentAdded(@NotNull Ref ref, @NotNull Teleport teleport, + @NotNull Store store, @NotNull CommandBuffer buffer) { + + NPCEntity npc = buffer.getComponent(ref, NPCEntity.getComponentType()); + Player player = buffer.getComponent(ref, Player.getComponentType()); + + Entity entity; + int pattern; + if (player != null) { + pattern = 2; + entity = player; + } else if (npc != null) { + pattern = 1; + entity = npc; + } else { + return; + } + + TeleportContext teleportContext = new TeleportContext(pattern, teleport, entity); + TriggerMap.callTriggersByContext(teleportContext); + } + + @Override + public void onComponentSet(@NotNull Ref ref, @Nullable Teleport teleport, + @NotNull Teleport t1, @NotNull Store store, + @NotNull CommandBuffer commandBuffer) { + + } + + @Override + public void onComponentRemoved(@NotNull Ref ref, @NotNull Teleport teleport, + @NotNull Store store, @NotNull CommandBuffer commandBuffer) { + + } + + @Override + public @Nullable Query getQuery() { + return Query.or(NPCEntity.getComponentType(), Player.getComponentType()); + } + } + +} From d0cc0b57abfa270bdd1c83cad659987e9230372c Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Thu, 5 Mar 2026 19:30:34 -0800 Subject: [PATCH 5/9] variables.sk - add variable test --- src/test/skript/tests/variables.sk | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/test/skript/tests/variables.sk diff --git a/src/test/skript/tests/variables.sk b/src/test/skript/tests/variables.sk new file mode 100644 index 00000000..5eb89512 --- /dev/null +++ b/src/test/skript/tests/variables.sk @@ -0,0 +1,9 @@ +test "Variables": + set {_var::*} to "one", "two" and "three" + assert size of {_var::*} is 3 with "Should be 3 elements" + + assert {_var::1} is "one" with "Should be 'one'" + + # Old issue where same named variables could override each other, + # want to verify that it's still working + assert {_var} is not set with "This var should not be set" From 1f5c02edbdd95c9c87e2418e539d6ad5aeb629c5 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Thu, 5 Mar 2026 19:31:27 -0800 Subject: [PATCH 6/9] EffTame.sk - fix spawn location not working --- .../skript/tests/elements/hyskript/effects/entity/EffTame.sk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/skript/tests/elements/hyskript/effects/entity/EffTame.sk b/src/test/skript/tests/elements/hyskript/effects/entity/EffTame.sk index 80573c5a..918b2e35 100644 --- a/src/test/skript/tests/elements/hyskript/effects/entity/EffTame.sk +++ b/src/test/skript/tests/elements/hyskript/effects/entity/EffTame.sk @@ -1,8 +1,8 @@ test "EffTame": - set {_loc} to world spawn of event-world + set {_loc} to event-location spawn a sheep at {_loc}: set {_e} to event-spawned-entity tame {_e} - wait 5 tick + wait 1 tick assert {_e} is tamed with "The sheep should be tamed now, but found '%npc role of {_e}%'" From 424d61092112b9b5ae7fe844dc46b9064c7e6ca5 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 10:40:36 -0800 Subject: [PATCH 7/9] PlayerUtils - world check, player loses their world when logging out --- .../github/skriptdev/skript/api/hytale/utils/PlayerUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/skriptdev/skript/api/hytale/utils/PlayerUtils.java b/src/main/java/com/github/skriptdev/skript/api/hytale/utils/PlayerUtils.java index 9adb7b7e..7d176479 100644 --- a/src/main/java/com/github/skriptdev/skript/api/hytale/utils/PlayerUtils.java +++ b/src/main/java/com/github/skriptdev/skript/api/hytale/utils/PlayerUtils.java @@ -78,7 +78,7 @@ public static List getPlayerRefs(@Nullable World world) { */ public static @Nullable PlayerRef getPlayerRef(Player player) { World world = player.getWorld(); - assert world != null; + if (world == null) return null; Ref reference = player.getReference(); assert reference != null; From 3a3ec0b2f72105d01762f1a092d37b4aad8eb5f8 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Fri, 6 Mar 2026 10:47:44 -0800 Subject: [PATCH 8/9] CondPlayerIsOnline - add --- .../elements/conditions/ConditionHandler.java | 2 + .../conditions/player/CondPlayerIsOnline.java | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/main/java/com/github/skriptdev/skript/plugin/elements/conditions/player/CondPlayerIsOnline.java diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/conditions/ConditionHandler.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/conditions/ConditionHandler.java index 7b966254..6599cc6d 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/conditions/ConditionHandler.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/conditions/ConditionHandler.java @@ -11,6 +11,7 @@ import com.github.skriptdev.skript.plugin.elements.conditions.other.CondObjectOfType; import com.github.skriptdev.skript.plugin.elements.conditions.player.CondPlayerHasPermission; import com.github.skriptdev.skript.plugin.elements.conditions.player.CondPlayerHasPlayedBefore; +import com.github.skriptdev.skript.plugin.elements.conditions.player.CondPlayerIsOnline; import com.github.skriptdev.skript.plugin.elements.conditions.player.CondPlayerMovementCrouching; import com.github.skriptdev.skript.plugin.elements.conditions.player.CondPlayerMovementFalling; import com.github.skriptdev.skript.plugin.elements.conditions.player.CondPlayerMovementFlying; @@ -50,6 +51,7 @@ public static void register(SkriptRegistration registration) { // PLAYER CondPlayerHasPermission.register(registration); CondPlayerHasPlayedBefore.register(registration); + CondPlayerIsOnline.register(registration); CondPlayerMovementCanFly.register(registration); CondPlayerMovementCrouching.register(registration); CondPlayerMovementFalling.register(registration); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/conditions/player/CondPlayerIsOnline.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/conditions/player/CondPlayerIsOnline.java new file mode 100644 index 00000000..8e23c312 --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/conditions/player/CondPlayerIsOnline.java @@ -0,0 +1,39 @@ +package com.github.skriptdev.skript.plugin.elements.conditions.player; + +import com.github.skriptdev.skript.api.hytale.utils.PlayerUtils; +import com.github.skriptdev.skript.api.skript.registration.SkriptRegistration; +import com.hypixel.hytale.server.core.entity.entities.Player; +import com.hypixel.hytale.server.core.universe.PlayerRef; +import io.github.syst3ms.skriptparser.lang.TriggerContext; +import io.github.syst3ms.skriptparser.lang.properties.ConditionalType; +import io.github.syst3ms.skriptparser.lang.properties.PropertyConditional; +import org.jetbrains.annotations.NotNull; + +public class CondPlayerIsOnline extends PropertyConditional { + + public static void register(SkriptRegistration reg) { + reg.newPropertyConditional(CondPlayerIsOnline.class, "players/playerrefs", + ConditionalType.BE, "online") + .name("Player is Online") + .description("Check if a player is online.") + .examples("if player is online:", + "if player is not online:", + "while player is online:") + .since("INSERT VERSION") + .register(); + } + + @Override + public boolean check(@NotNull TriggerContext ctx) { + return getPerformer().check(ctx, o -> { + if (o instanceof Player player) { + PlayerRef playerRef = PlayerUtils.getPlayerRef(player); + return playerRef != null && playerRef.isValid(); + } else if (o instanceof PlayerRef playerRef) { + return playerRef.isValid() && playerRef.getReference() != null; + } + return false; + }, isNegated()); + } + +} From d1eab29fdb7843199da291825536d630b3abdb29 Mon Sep 17 00:00:00 2001 From: ShaneBeee Date: Sat, 7 Mar 2026 05:48:44 -0800 Subject: [PATCH 9/9] build.gradle.kts - update parser --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index f1bb0789..50c7b2ce 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,7 +37,7 @@ dependencies { implementation("org.bstats:bstats-hytale:3.2.1") // Skript-Parser - implementation("com.github.SkriptDev:skript-parser:1.0.12") { + implementation("com.github.SkriptDev:skript-parser:1.0.13") { isTransitive = false } implementation("com.github.Zoltus:TinyMessage:2.0.1") {