KubeJS
This commit is contained in:
+27
-14
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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<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();
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user