From a509adcd1c473eb387445aa9920e07e3376aa328 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 8 Sep 2026 16:31:12 +0200 Subject: [PATCH] KubeJS --- build.gradle | 41 +++++++++----- gradle.properties | 4 ++ .../dev/lazysucksat/purgatory/Config.java | 6 ++ .../purgatory/compat/GameStagesCompat.java | 8 +++ .../purgatory/compat/kubejs/EventHelper.java | 13 +++++ .../compat/kubejs/PurgatoryEvents.java | 18 ++++++ .../kubejs/PurgatoryKubeJSBindings.java | 10 ++++ .../compat/kubejs/PurgatoryKubeJSEvents.java | 14 +++++ .../compat/kubejs/PurgatoryKubeJSPlugin.java | 21 +++++++ .../dimension/DimensionTeleporter.java | 10 ++++ .../dimension/PurgatoryEventHandler.java | 12 +++- .../dimension/PurgatoryTeleport.java | 6 ++ .../purgatory/dimension/chat/ChatHandler.java | 55 +++++++++++++++++++ src/main/resources/META-INF/mods.toml | 10 +++- src/main/resources/purgatory.mixins.json | 17 ------ 15 files changed, 211 insertions(+), 34 deletions(-) create mode 100644 src/main/java/dev/lazysucksat/purgatory/compat/kubejs/EventHelper.java create mode 100644 src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryEvents.java create mode 100644 src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSBindings.java create mode 100644 src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSEvents.java create mode 100644 src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSPlugin.java create mode 100644 src/main/java/dev/lazysucksat/purgatory/dimension/chat/ChatHandler.java delete mode 100644 src/main/resources/purgatory.mixins.json diff --git a/build.gradle b/build.gradle index 76ef812..cf68191 100644 --- a/build.gradle +++ b/build.gradle @@ -4,9 +4,6 @@ buildscript { maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } mavenCentral() } - dependencies { - classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' - } } plugins { @@ -15,8 +12,6 @@ plugins { id 'net.minecraftforge.gradle' version '[6.0.16,6.2)' } -apply plugin: 'org.spongepowered.mixin' - group = mod_group_id version = mod_version @@ -121,12 +116,6 @@ minecraft { } } -mixin { - add sourceSets.main, "${mod_id}.refmap.json" - - config "${mod_id}.mixins.json" -} - // Include resources generated by data generators. sourceSets.main.resources { srcDir 'src/generated/resources' } @@ -143,6 +132,30 @@ repositories { maven { url = "https://maven.blamejared.com" } + + maven { + url "https://maven.latvian.dev/releases" + content { + includeGroup "dev.latvian.mods" + includeGroup "dev.latvian.apps" + } + } + + maven { + url 'https://jitpack.io' + content { + includeGroup "com.github.rtyley" + } + } + + maven { + url = "https://maven.architectury.dev/" + } + + // Recommended: KubeJS / LatvianModder dependencies + maven { + url = "https://maven.saps.dev/releases" + } } dependencies { @@ -161,6 +174,9 @@ dependencies { implementation fg.deobf("net.darkhax.gamestages:GameStages-Forge-1.20.1:15.0.2") implementation fg.deobf("net.darkhax.bookshelf:Bookshelf-Forge-1.20.1:20.2.15") + implementation fg.deobf("dev.latvian.mods:kubejs-forge:$kubejs_version") + implementation fg.deobf("dev.latvian.mods:rhino-forge:${rhino_version}") + implementation fg.deobf("dev.architectury:architectury-forge:9.2.14") // Example mod dependency using a mod jar from ./libs with a flat dir repository // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar // The group id is ignored when searching -- in this case, it is "blank" @@ -169,9 +185,6 @@ dependencies { // For more info: // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html // http://www.gradle.org/docs/current/userguide/dependency_management.html - - annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' - } // This block of code expands all declared replace properties in the specified resource targets. diff --git a/gradle.properties b/gradle.properties index 2f4cff8..fd0c4d1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -47,3 +47,7 @@ mod_group_id=dev.lazysucksat mod_authors=LazySucksAtDev # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. mod_description=A mod to add the purgatory dimension, controlled via gamestages. + +kubejs_version=2001.6.5-build.26 +rhino_version=2001.2.3-build.10 + diff --git a/src/main/java/dev/lazysucksat/purgatory/Config.java b/src/main/java/dev/lazysucksat/purgatory/Config.java index 2fe2657..7b84ee1 100644 --- a/src/main/java/dev/lazysucksat/purgatory/Config.java +++ b/src/main/java/dev/lazysucksat/purgatory/Config.java @@ -26,6 +26,11 @@ public class Config { comment("Stage required to teleport players (only if gamestages is included)") .define("requiredStage", "allowpurgatory"); + private static final ForgeConfigSpec.ConfigValue IN_PROGRESS_STAGE = BUILDER. + comment("Stage for players who are in Purgatory (only if gamestages is included)") + .define("inProgressStage", "purginprogress"); + + static final ForgeConfigSpec SPEC = BUILDER.build(); public static boolean allowPurgatory; @@ -36,5 +41,6 @@ public class Config { static void onLoad(final ModConfigEvent event) { allowPurgatory = ALLOW_PURGATORY.get(); requiredStage = REQUIRED_STAGE.get(); + inProgressStage = IN_PROGRESS_STAGE.get(); } } diff --git a/src/main/java/dev/lazysucksat/purgatory/compat/GameStagesCompat.java b/src/main/java/dev/lazysucksat/purgatory/compat/GameStagesCompat.java index 0a19d07..6396c9a 100644 --- a/src/main/java/dev/lazysucksat/purgatory/compat/GameStagesCompat.java +++ b/src/main/java/dev/lazysucksat/purgatory/compat/GameStagesCompat.java @@ -1,5 +1,6 @@ package dev.lazysucksat.purgatory.compat; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.darkhax.gamestages.GameStageHelper; @@ -8,4 +9,11 @@ public class GameStagesCompat { return GameStageHelper.hasStage(player, stage); } + public static void addStage(ServerPlayer player, String stage) { + GameStageHelper.addStage(player, stage); + } + + public static void removeStage(ServerPlayer player, String stage) { + GameStageHelper.removeStage(player, stage); + } } diff --git a/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/EventHelper.java b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/EventHelper.java new file mode 100644 index 0000000..0648d8d --- /dev/null +++ b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/EventHelper.java @@ -0,0 +1,13 @@ +package dev.lazysucksat.purgatory.compat.kubejs; + +import net.minecraft.server.level.ServerPlayer; + +public class EventHelper { + public static void fireEnterEvent(ServerPlayer player) { + PurgatoryKubeJSEvents.ENTER.post(new PurgatoryEvents(player)); + } + + public static void fireExitEvent(ServerPlayer player) { + PurgatoryKubeJSEvents.EXIT.post(new PurgatoryEvents(player)); + } +} diff --git a/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryEvents.java b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryEvents.java new file mode 100644 index 0000000..8dd80af --- /dev/null +++ b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryEvents.java @@ -0,0 +1,18 @@ +package dev.lazysucksat.purgatory.compat.kubejs; + +import dev.latvian.mods.kubejs.event.EventJS; +import net.minecraft.server.level.ServerPlayer; + +public class PurgatoryEvents extends EventJS { + + private final ServerPlayer player; + + public PurgatoryEvents(ServerPlayer player) { + this.player = player; + } + + // Expose methods to JavaScript (e.g., event.player) + public ServerPlayer getPlayer() { + return this.player; + } +} diff --git a/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSBindings.java b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSBindings.java new file mode 100644 index 0000000..be7a5f2 --- /dev/null +++ b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSBindings.java @@ -0,0 +1,10 @@ +package dev.lazysucksat.purgatory.compat.kubejs; +import dev.lazysucksat.purgatory.dimension.PurgatoryDim; +import net.minecraft.server.level.ServerPlayer; + +public class PurgatoryKubeJSBindings { + + public static boolean isInPurgatory(ServerPlayer player) { + return player != null && player.level().dimension().equals(PurgatoryDim.PURGATORY_KEY); + } +} diff --git a/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSEvents.java b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSEvents.java new file mode 100644 index 0000000..2d7b100 --- /dev/null +++ b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSEvents.java @@ -0,0 +1,14 @@ +package dev.lazysucksat.purgatory.compat.kubejs; + +import dev.latvian.mods.kubejs.event.EventGroup; +import dev.latvian.mods.kubejs.event.EventHandler; + +public interface PurgatoryKubeJSEvents { + + // Creates the 'PurgatoryEvents' object in KubeJS + EventGroup GROUP = EventGroup.of("PurgatoryEvents"); + + // Defines PurgatoryEvents.enter and PurgatoryEvents.exit + EventHandler ENTER = GROUP.server("enter", () -> PurgatoryEvents.class); + EventHandler EXIT = GROUP.server("exit", () -> PurgatoryEvents.class); +} \ No newline at end of file diff --git a/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSPlugin.java b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSPlugin.java new file mode 100644 index 0000000..e55df8e --- /dev/null +++ b/src/main/java/dev/lazysucksat/purgatory/compat/kubejs/PurgatoryKubeJSPlugin.java @@ -0,0 +1,21 @@ +package dev.lazysucksat.purgatory.compat.kubejs; + +import dev.latvian.mods.kubejs.KubeJSPlugin; +import dev.latvian.mods.kubejs.event.EventGroup; +import dev.latvian.mods.kubejs.script.BindingsEvent; + +public class PurgatoryKubeJSPlugin extends KubeJSPlugin { + + @Override + public void registerBindings(BindingsEvent event) { + // Expose a custom JS object or utility class directly to KubeJS scripts + // e.g., allow scripts to call `Purgatory.sendToPurgatory(player)` + event.add("PurgatoryAPI", PurgatoryKubeJSBindings.class); + } + + @Override + public void init() { + // In KubeJS 6+, register event groups directly in init() + PurgatoryKubeJSEvents.GROUP.register(); + } +} diff --git a/src/main/java/dev/lazysucksat/purgatory/dimension/DimensionTeleporter.java b/src/main/java/dev/lazysucksat/purgatory/dimension/DimensionTeleporter.java index 94aa42b..f262799 100644 --- a/src/main/java/dev/lazysucksat/purgatory/dimension/DimensionTeleporter.java +++ b/src/main/java/dev/lazysucksat/purgatory/dimension/DimensionTeleporter.java @@ -1,7 +1,10 @@ package dev.lazysucksat.purgatory.dimension; import com.mojang.logging.LogUtils; +import dev.lazysucksat.purgatory.Config; import dev.lazysucksat.purgatory.Purgatory; +import dev.lazysucksat.purgatory.compat.GameStagesCompat; +import dev.lazysucksat.purgatory.compat.kubejs.EventHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Position; import net.minecraft.core.registries.Registries; @@ -16,6 +19,7 @@ import net.minecraft.world.level.levelgen.Heightmap; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import java.util.ArrayList; @@ -27,6 +31,10 @@ public class DimensionTeleporter { public static void escapePurgatory(ServerPlayer player) { CompoundTag persistentData = player.getPersistentData(); + if (ModList.get().isLoaded("gamestages")) { + GameStagesCompat.removeStage(player, Config.inProgressStage); + } + if (persistentData.contains("PurgatorySavedSpawn")) { CompoundTag purgatoryData = persistentData.getCompound("PurgatorySavedSpawn"); @@ -61,5 +69,7 @@ public class DimensionTeleporter { if (overworld != null) { player.changeDimension(overworld, new PurgatoryTeleport()); } + + EventHelper.fireEnterEvent(player); } } diff --git a/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryEventHandler.java b/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryEventHandler.java index d274a2e..f905962 100644 --- a/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryEventHandler.java +++ b/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryEventHandler.java @@ -1,6 +1,9 @@ package dev.lazysucksat.purgatory.dimension; +import dev.lazysucksat.purgatory.Config; import dev.lazysucksat.purgatory.Purgatory; +import dev.lazysucksat.purgatory.compat.GameStagesCompat; +import dev.lazysucksat.purgatory.players.PlayerChecks; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; @@ -12,6 +15,7 @@ import net.minecraft.world.level.levelgen.Heightmap; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; @Mod.EventBusSubscriber(modid = Purgatory.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) @@ -24,7 +28,10 @@ public class PurgatoryEventHandler { } // Only redirect death if dying outside Purgatory - if (!player.level().dimension().equals(PurgatoryDim.PURGATORY_KEY)) { + if (!player.level().dimension().equals(PurgatoryDim.PURGATORY_KEY) && PlayerChecks.playerUnlockedPurgatory(player)) { + if (!ModList.get().isLoaded("gamestages")) { + GameStagesCompat.addStage(player, Config.inProgressStage); + } // 1. Save original Bed/Anchor info into player persistent NBT BlockPos bedPos = player.getRespawnPosition(); @@ -120,6 +127,9 @@ public class PurgatoryEventHandler { surfacePos.getZ() + 0.5 ); + player.setRespawnPosition(PurgatoryDim.PURGATORY_KEY, surfacePos, player.getYRot(), true, false); + + player.fallDistance = 0.0F; // Prevent fall damage from the snap } } diff --git a/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryTeleport.java b/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryTeleport.java index dcdcdb4..6851bab 100644 --- a/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryTeleport.java +++ b/src/main/java/dev/lazysucksat/purgatory/dimension/PurgatoryTeleport.java @@ -1,11 +1,13 @@ package dev.lazysucksat.purgatory.dimension; +import dev.lazysucksat.purgatory.compat.kubejs.EventHelper; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraftforge.common.util.ITeleporter; +import net.minecraftforge.fml.ModList; import java.util.function.Function; @@ -47,6 +49,10 @@ public class PurgatoryTeleport implements ITeleporter { player.getXRot() ); + if (ModList.get().isLoaded("kubejs")) { + EventHelper.fireEnterEvent(player); + } + return player; } } diff --git a/src/main/java/dev/lazysucksat/purgatory/dimension/chat/ChatHandler.java b/src/main/java/dev/lazysucksat/purgatory/dimension/chat/ChatHandler.java new file mode 100644 index 0000000..2757aae --- /dev/null +++ b/src/main/java/dev/lazysucksat/purgatory/dimension/chat/ChatHandler.java @@ -0,0 +1,55 @@ +package dev.lazysucksat.purgatory.dimension.chat; + +import dev.lazysucksat.purgatory.Purgatory; +import dev.lazysucksat.purgatory.dimension.PurgatoryDim; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraftforge.event.ServerChatEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.Objects; + +@Mod.EventBusSubscriber(modid = Purgatory.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) +public class ChatHandler { + @SubscribeEvent + public static void onServerChat(ServerChatEvent event) { + ServerPlayer sender = event.getPlayer(); + if (sender == null) return; + + ResourceKey senderDim = sender.level().dimension(); + + // Construct standard chat appearance: Message + Component formattedMessage = Component.literal("<") + .append(sender.getDisplayName()) + .append("> ") + .append(event.getMessage()); + + // Cancel vanilla global broadcast + event.setCanceled(true); + + if (senderDim.equals(PurgatoryDim.PURGATORY_KEY)) { + // Purgatory local chat restricted to 48 blocks radius (~3 chunks) + double radiusSq = 48.0 * 48.0; + ServerLevel level = sender.serverLevel(); + + for (ServerPlayer player : level.players()) { + if (player.level().dimension().equals(PurgatoryDim.PURGATORY_KEY)) { + if (sender.distanceToSqr(player) <= radiusSq) { + player.sendSystemMessage(formattedMessage); + } + } + } + } else { + // Overworld and other dimensions isolated to their respective dimensions + for (ServerPlayer player : Objects.requireNonNull(sender.getServer()).getPlayerList().getPlayers()) { + if (player.level().dimension().equals(senderDim)) { + player.sendSystemMessage(formattedMessage); + } + } + } + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 21f2f8c..c4d2e3e 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -65,7 +65,13 @@ side = "BOTH" [[dependencies."${mod_id}"]] modId = "gamestages" mandatory = false -# This version range declares a minimum of the current minecraft version up to but not including the next major version -versionRange = "[15.0.1,)" +versionRange = "[15.0.2]" +ordering = "AFTER" +side = "BOTH" + +[[dependencies."${mod_id}"]] +modId = "kubejs" +mandatory = false +versionRange = "[2001.6.5-build.26]" ordering = "AFTER" side = "BOTH" diff --git a/src/main/resources/purgatory.mixins.json b/src/main/resources/purgatory.mixins.json deleted file mode 100644 index 1dec8bc..0000000 --- a/src/main/resources/purgatory.mixins.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "dev.lazysucksat.purgatory.mixin", - "compatibilityLevel": "JAVA_8", - "refmap": "purgatory.refmap.json", - "mixins": [ - ], - "client": [ - ], - "injectors": { - "defaultRequire": 1 - }, - "overwrites": { - "requireAnnotations": true - } -}