From 50d4a30fc2e0676be42b653b934668f74a8fb6ef Mon Sep 17 00:00:00 2001 From: Q Date: Thu, 5 Feb 2026 00:00:25 +0000 Subject: [PATCH 1/9] Added game mode support preliminarily including GameMode type and serialization/deserialization, OnGameModeChange event and context values (old and new game mode), added cancellation support, and included name of support for game mode objects. --- .../plugin/elements/events/EventHandler.java | 16 +-- .../player/EvtPlayerChangeGameMode.java | 111 ++++++++++++++++++ .../elements/expressions/entity/ExprName.java | 2 + .../plugin/elements/types/TypesServer.java | 20 +++- 4 files changed, 134 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.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 5f8363fe..ad2336bf 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 @@ -10,20 +10,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.player.EvtPlayerAddToWorld; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerBreakBlock; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerChat; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerDamageBlock; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerDrainFromWorld; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerDropItem; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerDropItemRequest; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerJoin; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerMouseClick; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerMouseMove; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerPlaceBlock; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerSetupConnect; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerSetupDisconnect; -import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerUseBlock; +import com.github.skriptdev.skript.plugin.elements.events.player.*; import com.github.skriptdev.skript.plugin.elements.events.server.EvtBoot; import com.github.skriptdev.skript.plugin.elements.events.server.EvtShutdown; import com.github.skriptdev.skript.plugin.elements.events.skript.EvtLoad; @@ -55,6 +42,7 @@ public static void register(SkriptRegistration registration) { EvtPlayerSetupConnect.register(registration); EvtPlayerSetupDisconnect.register(registration); EvtPlayerUseBlock.register(registration); + EvtPlayerChangeGameMode.register(registration); // SERVER EvtBoot.register(registration); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java new file mode 100644 index 00000000..a96febfa --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java @@ -0,0 +1,111 @@ +package com.github.skriptdev.skript.plugin.elements.events.player; + +import com.github.skriptdev.skript.api.skript.event.CancellableContext; +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.registration.SkriptRegistration; +import com.hypixel.hytale.component.ArchetypeChunk; +import com.hypixel.hytale.component.CommandBuffer; +import com.hypixel.hytale.component.Ref; +import com.hypixel.hytale.component.Store; +import com.hypixel.hytale.component.query.Query; +import com.hypixel.hytale.component.system.EntityEventSystem; +import com.hypixel.hytale.protocol.GameMode; +import com.hypixel.hytale.server.core.entity.entities.Player; +import com.hypixel.hytale.server.core.event.events.ecs.ChangeGameModeEvent; +import com.hypixel.hytale.server.core.universe.PlayerRef; +import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; +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 org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class EvtPlayerChangeGameMode extends SystemEvent> { + + public static void register(SkriptRegistration reg) { + reg.newEvent(EvtPlayerChangeGameMode.class, "[player(s| )] game[ ]mode change[s]") + .setHandledContexts(PlayerChangeGameModeContext.class). + name("Player Change GameMode").description("Called when a player's game-mode is changed.") + .since("1.0.4").register(); + + reg.addSingleContextValue(PlayerChangeGameModeContext.class, GameMode.class, "new-game-mode", PlayerChangeGameModeContext::getNewGameMode); + reg.addSingleContextValue(PlayerChangeGameModeContext.class, GameMode.class, "current-game-mode", PlayerChangeGameModeContext::getOldGameMode); + reg.addSingleContextValue(PlayerChangeGameModeContext.class, Player.class, "player", PlayerChangeGameModeContext::getPlayer); + } + + private static ChangeGameModeEventSystem SYSTEM; + + @Override + public boolean init(Expression[] expressions, int matchedPattern, ParseContext parseContext) { + if (SYSTEM == null) { + SYSTEM = new ChangeGameModeEventSystem(ChangeGameModeEvent.class); + applySystem(SYSTEM); + } + return true; + } + + @Override + public boolean check(@NotNull TriggerContext triggerContext) { + return triggerContext instanceof PlayerChangeGameModeContext; + } + + @Override + public String toString(@Nullable TriggerContext triggerContext, boolean debug) { + return "player change gamemode"; + } + + private record PlayerChangeGameModeContext(ChangeGameModeEvent event, + Player player) implements PlayerContext, CancellableContext { + + public Player getPlayer() { + return this.player; + } + + public GameMode getNewGameMode() { + return event.getGameMode(); + } + + public GameMode getOldGameMode() { + return getPlayer().getGameMode(); + } + + @Override + public String getName() { + return "player change gamemode context"; + } + + @Override + public boolean isCancelled() { + return event.isCancelled(); + } + + @Override + public void setCancelled(boolean cancelled) { + event.setCancelled(cancelled); + } + } + + private static final class ChangeGameModeEventSystem extends EntityEventSystem { + + private ChangeGameModeEventSystem(@NotNull Class eventType) { + super(eventType); + } + + @Override + public void handle(int i, @NotNull ArchetypeChunk archetypeChunk, @NotNull Store store, @NotNull CommandBuffer commandBuffer, @NotNull ChangeGameModeEvent event) { + + Ref ref = archetypeChunk.getReferenceTo(i); + Player player = store.getComponent(ref, Player.getComponentType()); + if (player == null) return; + + TriggerMap.callTriggersByContext(new PlayerChangeGameModeContext(event, player)); + } + + @Override + public @NotNull Query getQuery() { + return PlayerRef.getComponentType(); + } + } +} diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprName.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprName.java index dafb1883..541d599d 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprName.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/entity/ExprName.java @@ -1,5 +1,6 @@ package com.github.skriptdev.skript.plugin.elements.expressions.entity; +import com.hypixel.hytale.protocol.GameMode; import com.hypixel.hytale.server.core.entity.Entity; import com.hypixel.hytale.server.core.entity.entities.Player; import com.hypixel.hytale.server.core.universe.PlayerRef; @@ -28,6 +29,7 @@ public static void register(SkriptRegistration registration) { case Player player -> player.getDisplayName(); case Entity entity -> entity.getLegacyDisplayName(); case World world -> world.getName(); + case GameMode gameMode -> gameMode.name(); default -> null; }; } diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesServer.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesServer.java index c97ca8bc..3400b47f 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesServer.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesServer.java @@ -9,6 +9,7 @@ import com.hypixel.hytale.math.vector.Vector3d; import com.hypixel.hytale.math.vector.Vector3f; import com.hypixel.hytale.math.vector.Vector3i; +import com.hypixel.hytale.protocol.GameMode; import com.hypixel.hytale.protocol.Vector2f; import com.hypixel.hytale.server.core.HytaleServer; import com.hypixel.hytale.server.core.Message; @@ -18,6 +19,7 @@ import com.hypixel.hytale.server.core.receiver.IMessageReceiver; import io.github.syst3ms.skriptparser.types.changers.TypeSerializer; import org.bson.BsonDocument; +import org.bson.BsonInt32; import org.bson.BsonString; import org.bson.BsonValue; import org.jetbrains.annotations.NotNull; @@ -175,6 +177,22 @@ public Location deserialize(@NotNull Gson gson, @NotNull JsonElement element) { }) .since("1.0.0") .register(); - } + registration.newType(GameMode.class, "gamemode", "gamemode@s") + .name("GameMode") + .description("Represents a game mode.") + .serializer(new TypeSerializer<>() { + @Override + public JsonElement serialize(Gson gson, GameMode value) { + BsonDocument bsonDocument = new BsonDocument(); + bsonDocument.put("gamemode", bsonDocument.put("gamemode", new BsonInt32(value.getValue()))); + return gson.toJsonTree(bsonDocument); + } + @Override + public GameMode deserialize(Gson gson, JsonElement element) { + BsonDocument decode = BsonDocument.parse(element.toString()); + return GameMode.fromValue(decode.getInt32("gamemode").getValue()); + } + }).since("1.0.4").register(); + } } From 9799350dfddce0e42686e9df4106be36bff30bb7 Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 5 Feb 2026 10:29:28 +0000 Subject: [PATCH 2/9] Update src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java Co-authored-by: Shane Bee --- .../elements/events/player/EvtPlayerChangeGameMode.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java index a96febfa..a146eb9b 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java @@ -26,9 +26,11 @@ public class EvtPlayerChangeGameMode extends SystemEvent Date: Thu, 5 Feb 2026 10:29:41 +0000 Subject: [PATCH 3/9] Update src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java Co-authored-by: Shane Bee --- .../plugin/elements/events/player/EvtPlayerChangeGameMode.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java index a146eb9b..685caf49 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java @@ -34,7 +34,6 @@ public static void register(SkriptRegistration reg) { reg.addSingleContextValue(PlayerChangeGameModeContext.class, GameMode.class, "new-game-mode", PlayerChangeGameModeContext::getNewGameMode); reg.addSingleContextValue(PlayerChangeGameModeContext.class, GameMode.class, "current-game-mode", PlayerChangeGameModeContext::getOldGameMode); - reg.addSingleContextValue(PlayerChangeGameModeContext.class, Player.class, "player", PlayerChangeGameModeContext::getPlayer); } private static ChangeGameModeEventSystem SYSTEM; From e1b8c072b91f7c0e2f84c3ba51af11525cfe3ffd Mon Sep 17 00:00:00 2001 From: Shaun Date: Thu, 5 Feb 2026 10:30:07 +0000 Subject: [PATCH 4/9] Update src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java Co-authored-by: Shane Bee --- .../elements/events/player/EvtPlayerChangeGameMode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java index 685caf49..1e6011ab 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java @@ -57,8 +57,8 @@ public String toString(@Nullable TriggerContext triggerContext, boolean debug) { return "player change gamemode"; } - private record PlayerChangeGameModeContext(ChangeGameModeEvent event, - Player player) implements PlayerContext, CancellableContext { + private record PlayerChangeGameModeContext(ChangeGameModeEvent event, Player player) + implements PlayerContext, CancellableContext { public Player getPlayer() { return this.player; From 94a89d8ac39afe3eed080958dd7fdbfc9c10b411 Mon Sep 17 00:00:00 2001 From: Q Date: Thu, 5 Feb 2026 10:31:08 +0000 Subject: [PATCH 5/9] Moved EvtPlayerChangeGameMode registration to be in alphabetical order. Removed serializer from type registration and changed to INSERT VERSION --- .../plugin/elements/events/EventHandler.java | 2 +- .../skript/plugin/elements/types/TypesServer.java | 15 +-------------- 2 files changed, 2 insertions(+), 15 deletions(-) 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 ad2336bf..b5819718 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 @@ -30,6 +30,7 @@ public static void register(SkriptRegistration registration) { // PLAYER EvtPlayerAddToWorld.register(registration); EvtPlayerBreakBlock.register(registration); + EvtPlayerChangeGameMode.register(registration); EvtPlayerChat.register(registration); EvtPlayerDamageBlock.register(registration); EvtPlayerDrainFromWorld.register(registration); @@ -42,7 +43,6 @@ public static void register(SkriptRegistration registration) { EvtPlayerSetupConnect.register(registration); EvtPlayerSetupDisconnect.register(registration); EvtPlayerUseBlock.register(registration); - EvtPlayerChangeGameMode.register(registration); // SERVER EvtBoot.register(registration); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesServer.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesServer.java index 3400b47f..d17fad82 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesServer.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/types/TypesServer.java @@ -180,19 +180,6 @@ public Location deserialize(@NotNull Gson gson, @NotNull JsonElement element) { registration.newType(GameMode.class, "gamemode", "gamemode@s") .name("GameMode") .description("Represents a game mode.") - .serializer(new TypeSerializer<>() { - @Override - public JsonElement serialize(Gson gson, GameMode value) { - BsonDocument bsonDocument = new BsonDocument(); - bsonDocument.put("gamemode", bsonDocument.put("gamemode", new BsonInt32(value.getValue()))); - return gson.toJsonTree(bsonDocument); - } - - @Override - public GameMode deserialize(Gson gson, JsonElement element) { - BsonDocument decode = BsonDocument.parse(element.toString()); - return GameMode.fromValue(decode.getInt32("gamemode").getValue()); - } - }).since("1.0.4").register(); + .since("INSERT VERSION").register(); } } From 55bda8ea51c08e7462d852427466e3c4bcac3f28 Mon Sep 17 00:00:00 2001 From: Q Date: Thu, 5 Feb 2026 10:34:26 +0000 Subject: [PATCH 6/9] Removed star import from EventHandler --- .../plugin/elements/events/EventHandler.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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 b5819718..20339533 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 @@ -10,7 +10,21 @@ 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.player.*; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerAddToWorld; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerBreakBlock; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerChangeGameMode; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerChat; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerDamageBlock; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerDrainFromWorld; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerDropItem; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerDropItemRequest; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerJoin; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerMouseClick; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerMouseMove; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerPlaceBlock; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerSetupConnect; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerSetupDisconnect; +import com.github.skriptdev.skript.plugin.elements.events.player.EvtPlayerUseBlock; import com.github.skriptdev.skript.plugin.elements.events.server.EvtBoot; import com.github.skriptdev.skript.plugin.elements.events.server.EvtShutdown; import com.github.skriptdev.skript.plugin.elements.events.skript.EvtLoad; From 83db5b75ea7651fa428a2f80888a21adb77ef9b8 Mon Sep 17 00:00:00 2001 From: Q Date: Thu, 5 Feb 2026 12:08:34 +0000 Subject: [PATCH 7/9] Updated game mode syntax and implemented past and present tense for context values --- .../events/player/EvtPlayerChangeGameMode.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java index 1e6011ab..f366f8be 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/events/player/EvtPlayerChangeGameMode.java @@ -19,21 +19,29 @@ 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; public class EvtPlayerChangeGameMode extends SystemEvent> { public static void register(SkriptRegistration reg) { - reg.newEvent(EvtPlayerChangeGameMode.class, "[player(s| )] game[ ]mode change[s]") + reg.newEvent(EvtPlayerChangeGameMode.class, "[player(s| )] game[(-| )]mode change[s]") .setHandledContexts(PlayerChangeGameModeContext.class) .name("Player Change GameMode") .description("Called when a player's game-mode is changed.") .since("INSERT VERSION") .register(); - reg.addSingleContextValue(PlayerChangeGameModeContext.class, GameMode.class, "new-game-mode", PlayerChangeGameModeContext::getNewGameMode); - reg.addSingleContextValue(PlayerChangeGameModeContext.class, GameMode.class, "current-game-mode", PlayerChangeGameModeContext::getOldGameMode); + reg.newSingleContextValue(PlayerChangeGameModeContext.class, GameMode.class, "game[(-| )]mode", PlayerChangeGameModeContext::getOldGameMode) + .setState(ContextValue.State.PAST) + .setUsage(ContextValue.Usage.EXPRESSION_OR_ALONE) + .register(); + reg.newSingleContextValue(PlayerChangeGameModeContext.class, GameMode.class, "game[(-| )]mode", PlayerChangeGameModeContext::getNewGameMode) + .setState(ContextValue.State.PRESENT) + .setUsage(ContextValue.Usage.EXPRESSION_OR_ALONE) + .addSetter(PlayerChangeGameModeContext::setNewGameMode) + .register(); } private static ChangeGameModeEventSystem SYSTEM; @@ -72,6 +80,10 @@ public GameMode getOldGameMode() { return getPlayer().getGameMode(); } + public void setNewGameMode(GameMode gameMode) { + event.setGameMode(gameMode); + } + @Override public String getName() { return "player change gamemode context"; From e87902eddf5ff189d0c9b6e9d0bd04e351047a75 Mon Sep 17 00:00:00 2001 From: Q Date: Thu, 5 Feb 2026 12:09:05 +0000 Subject: [PATCH 8/9] Implemented game mode property expression --- .../expressions/ExpressionHandler.java | 2 + .../expressions/player/ExprGameMode.java | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/player/ExprGameMode.java diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java index c647b549..0bc119cf 100644 --- a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/ExpressionHandler.java @@ -46,6 +46,7 @@ import com.github.skriptdev.skript.plugin.elements.expressions.other.ExprVector3i; import com.github.skriptdev.skript.plugin.elements.expressions.player.ExprAllPlayers; import com.github.skriptdev.skript.plugin.elements.expressions.player.ExprChatMessage; +import com.github.skriptdev.skript.plugin.elements.expressions.player.ExprGameMode; import com.github.skriptdev.skript.plugin.elements.expressions.player.ExprPlayerPermissionGroup; import com.github.skriptdev.skript.plugin.elements.expressions.player.ExprPlayerPermissions; import com.github.skriptdev.skript.plugin.elements.expressions.player.ExprPlayerSpawns; @@ -114,6 +115,7 @@ public static void register(SkriptRegistration registration) { // PLAYER ExprAllPlayers.register(registration); ExprChatMessage.register(registration); + ExprGameMode.register(registration); ExprPlayerPermissionGroup.register(registration); ExprPlayerPermissions.register(registration); ExprPlayerSpawns.register(registration); diff --git a/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/player/ExprGameMode.java b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/player/ExprGameMode.java new file mode 100644 index 00000000..5ab49d4b --- /dev/null +++ b/src/main/java/com/github/skriptdev/skript/plugin/elements/expressions/player/ExprGameMode.java @@ -0,0 +1,56 @@ +package com.github.skriptdev.skript.plugin.elements.expressions.player; + +import com.hypixel.hytale.protocol.GameMode; +import com.hypixel.hytale.server.core.entity.entities.Player; +import io.github.syst3ms.skriptparser.lang.TriggerContext; +import io.github.syst3ms.skriptparser.lang.properties.PropertyExpression; +import io.github.syst3ms.skriptparser.registration.SkriptRegistration; +import io.github.syst3ms.skriptparser.types.changers.ChangeMode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class ExprGameMode extends PropertyExpression { + + public static void register(SkriptRegistration registration) { + registration.newPropertyExpression(ExprGameMode.class, GameMode.class, "game[(-| )]mode", "players") + .name("GameMode of a player") + .description("Returns the game mode of a player.") + .examples("set {_gm} to game-mode of context-player") + .since("INSERT VERSION") + .register(); + } + + @Override + public @Nullable GameMode getProperty(@NotNull Object owner) { + if (owner instanceof Player player) { + return player.getGameMode(); + } + return null; + } + + @Override + public Optional[]> acceptsChange(@NotNull ChangeMode mode) { + if (mode == ChangeMode.SET) return Optional.of(new Class[]{GameMode.class}); + return Optional.empty(); + } + + @SuppressWarnings("ConstantConditions") + @Override + public void change(@NotNull TriggerContext ctx, @NotNull ChangeMode changeMode, @NotNull Object[] changeWith) { + if (changeMode != ChangeMode.SET || changeWith == null) return; + GameMode newGameMode = changeWith[0] instanceof GameMode ? (GameMode) changeWith[0] : null; + if (newGameMode == null) return; + + Optional owner = getOwner().getSingle(ctx); + if (!(owner.isPresent() && owner.get() instanceof Player player)) return; + + Player.setGameMode(player.getReference(), newGameMode, player.getReference().getStore()); + } + + @Override + public Class getReturnType() { + return GameMode.class; + } +} From 1bda65c7783ee4b35e77de4b51bcdf8dbcf487ab Mon Sep 17 00:00:00 2001 From: Q Date: Thu, 5 Feb 2026 12:21:20 +0000 Subject: [PATCH 9/9] Is GitHub sleeping? Poke