This commit is contained in:
2026-09-08 16:31:12 +02:00
parent 24242cc895
commit a509adcd1c
15 changed files with 211 additions and 34 deletions
+27 -14
View File
@@ -4,9 +4,6 @@ buildscript {
maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } maven { url = 'https://repo.spongepowered.org/repository/maven-public/' }
mavenCentral() mavenCentral()
} }
dependencies {
classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT'
}
} }
plugins { plugins {
@@ -15,8 +12,6 @@ plugins {
id 'net.minecraftforge.gradle' version '[6.0.16,6.2)' id 'net.minecraftforge.gradle' version '[6.0.16,6.2)'
} }
apply plugin: 'org.spongepowered.mixin'
group = mod_group_id group = mod_group_id
version = mod_version 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. // Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' } sourceSets.main.resources { srcDir 'src/generated/resources' }
@@ -143,6 +132,30 @@ repositories {
maven { maven {
url = "https://maven.blamejared.com" 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 { 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.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("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 // Example mod dependency using a mod jar from ./libs with a flat dir repository
// This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar
// The group id is ignored when searching -- in this case, it is "blank" // The group id is ignored when searching -- in this case, it is "blank"
@@ -169,9 +185,6 @@ dependencies {
// For more info: // For more info:
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.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. // This block of code expands all declared replace properties in the specified resource targets.
+4
View File
@@ -47,3 +47,7 @@ mod_group_id=dev.lazysucksat
mod_authors=LazySucksAtDev 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. # 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. 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
@@ -26,6 +26,11 @@ public class Config {
comment("Stage required to teleport players (only if gamestages is included)") comment("Stage required to teleport players (only if gamestages is included)")
.define("requiredStage", "allowpurgatory"); .define("requiredStage", "allowpurgatory");
private static final ForgeConfigSpec.ConfigValue<String> 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(); static final ForgeConfigSpec SPEC = BUILDER.build();
public static boolean allowPurgatory; public static boolean allowPurgatory;
@@ -36,5 +41,6 @@ public class Config {
static void onLoad(final ModConfigEvent event) { static void onLoad(final ModConfigEvent event) {
allowPurgatory = ALLOW_PURGATORY.get(); allowPurgatory = ALLOW_PURGATORY.get();
requiredStage = REQUIRED_STAGE.get(); requiredStage = REQUIRED_STAGE.get();
inProgressStage = IN_PROGRESS_STAGE.get();
} }
} }
@@ -1,5 +1,6 @@
package dev.lazysucksat.purgatory.compat; package dev.lazysucksat.purgatory.compat;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.darkhax.gamestages.GameStageHelper; import net.darkhax.gamestages.GameStageHelper;
@@ -8,4 +9,11 @@ public class GameStagesCompat {
return GameStageHelper.hasStage(player, stage); 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);
}
} }
@@ -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));
}
}
@@ -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;
}
}
@@ -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);
}
}
@@ -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);
}
@@ -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();
}
}
@@ -1,7 +1,10 @@
package dev.lazysucksat.purgatory.dimension; package dev.lazysucksat.purgatory.dimension;
import com.mojang.logging.LogUtils; import com.mojang.logging.LogUtils;
import dev.lazysucksat.purgatory.Config;
import dev.lazysucksat.purgatory.Purgatory; 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.BlockPos;
import net.minecraft.core.Position; import net.minecraft.core.Position;
import net.minecraft.core.registries.Registries; 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.TickEvent;
import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import java.util.ArrayList; import java.util.ArrayList;
@@ -27,6 +31,10 @@ public class DimensionTeleporter {
public static void escapePurgatory(ServerPlayer player) { public static void escapePurgatory(ServerPlayer player) {
CompoundTag persistentData = player.getPersistentData(); CompoundTag persistentData = player.getPersistentData();
if (ModList.get().isLoaded("gamestages")) {
GameStagesCompat.removeStage(player, Config.inProgressStage);
}
if (persistentData.contains("PurgatorySavedSpawn")) { if (persistentData.contains("PurgatorySavedSpawn")) {
CompoundTag purgatoryData = persistentData.getCompound("PurgatorySavedSpawn"); CompoundTag purgatoryData = persistentData.getCompound("PurgatorySavedSpawn");
@@ -61,5 +69,7 @@ public class DimensionTeleporter {
if (overworld != null) { if (overworld != null) {
player.changeDimension(overworld, new PurgatoryTeleport()); player.changeDimension(overworld, new PurgatoryTeleport());
} }
EventHelper.fireEnterEvent(player);
} }
} }
@@ -1,6 +1,9 @@
package dev.lazysucksat.purgatory.dimension; package dev.lazysucksat.purgatory.dimension;
import dev.lazysucksat.purgatory.Config;
import dev.lazysucksat.purgatory.Purgatory; 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.core.BlockPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceKey; 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.living.LivingDeathEvent;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@Mod.EventBusSubscriber(modid = Purgatory.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) @Mod.EventBusSubscriber(modid = Purgatory.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE)
@@ -24,7 +28,10 @@ public class PurgatoryEventHandler {
} }
// Only redirect death if dying outside Purgatory // 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 // 1. Save original Bed/Anchor info into player persistent NBT
BlockPos bedPos = player.getRespawnPosition(); BlockPos bedPos = player.getRespawnPosition();
@@ -120,6 +127,9 @@ public class PurgatoryEventHandler {
surfacePos.getZ() + 0.5 surfacePos.getZ() + 0.5
); );
player.setRespawnPosition(PurgatoryDim.PURGATORY_KEY, surfacePos, player.getYRot(), true, false);
player.fallDistance = 0.0F; // Prevent fall damage from the snap player.fallDistance = 0.0F; // Prevent fall damage from the snap
} }
} }
@@ -1,11 +1,13 @@
package dev.lazysucksat.purgatory.dimension; package dev.lazysucksat.purgatory.dimension;
import dev.lazysucksat.purgatory.compat.kubejs.EventHelper;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraftforge.common.util.ITeleporter; import net.minecraftforge.common.util.ITeleporter;
import net.minecraftforge.fml.ModList;
import java.util.function.Function; import java.util.function.Function;
@@ -47,6 +49,10 @@ public class PurgatoryTeleport implements ITeleporter {
player.getXRot() player.getXRot()
); );
if (ModList.get().isLoaded("kubejs")) {
EventHelper.fireEnterEvent(player);
}
return player; return player;
} }
} }
@@ -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<Level> senderDim = sender.level().dimension();
// Construct standard chat appearance: <Username> 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);
}
}
}
}
}
+8 -2
View File
@@ -65,7 +65,13 @@ side = "BOTH"
[[dependencies."${mod_id}"]] [[dependencies."${mod_id}"]]
modId = "gamestages" modId = "gamestages"
mandatory = false 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.2]"
versionRange = "[15.0.1,)" ordering = "AFTER"
side = "BOTH"
[[dependencies."${mod_id}"]]
modId = "kubejs"
mandatory = false
versionRange = "[2001.6.5-build.26]"
ordering = "AFTER" ordering = "AFTER"
side = "BOTH" side = "BOTH"
-17
View File
@@ -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
}
}