aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--settings.gradle4
-rw-r--r--spark-forge/build.gradle44
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java26
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientCommandSender.java69
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientTickHook.java50
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientTickReporter.java (renamed from spark-forge/src/main/java/me/lucko/spark/forge/ForgeTickReporter.java)62
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgePlatformInfo.java15
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgePlayerPingProvider.java30
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerCommandSender.java90
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerTickHook.java (renamed from spark-forge/src/main/java/me/lucko/spark/forge/ForgeTickHook.java)17
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerTickReporter.java54
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java64
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java323
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/SidedExecutor.java41
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeClientSparkPlugin.java188
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeServerSparkPlugin.java322
-rw-r--r--spark-forge/src/main/java/me/lucko/spark/forge/plugin/ForgeSparkPlugin.java254
-rw-r--r--spark-forge/src/main/resources/mcmod.info8
18 files changed, 803 insertions, 858 deletions
diff --git a/settings.gradle b/settings.gradle
index d689d80..7822e61 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -13,6 +13,10 @@ pluginManagement {
name = 'NeoForge'
url = 'https://maven.neoforged.net/releases'
}
+ maven {
+ name = "WagYourMaven"
+ url = "https://maven.wagyourtail.xyz/releases"
+ }
}
}
diff --git a/spark-forge/build.gradle b/spark-forge/build.gradle
index 6ab62da..a939d6c 100644
--- a/spark-forge/build.gradle
+++ b/spark-forge/build.gradle
@@ -1,17 +1,22 @@
plugins {
id 'com.gradleup.shadow' version '8.3.0'
- id 'net.minecraftforge.gradle' version '[6.0.24,6.2)'
+ id "xyz.wagyourtail.unimined" version "1.2.14"
}
tasks.withType(JavaCompile) {
- // override, compile targeting J21
- options.release = 21
+ // override, compile targeting J8
+ options.release = 8
}
-minecraft {
- mappings channel: 'official', version: '1.21.4'
- accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
- reobf = false
+unimined.minecraft {
+ version "1.8.9"
+ mappings {
+ searge()
+ mcp "stable", "22-1.8.9"
+ }
+ minecraftForge {
+ loader "11.15.1.2318-1.8.9"
+ }
}
configurations {
@@ -20,26 +25,19 @@ configurations {
}
dependencies {
- minecraft 'net.minecraftforge:forge:1.21.4-54.0.6'
shade project(':spark-common')
}
processResources {
- from(sourceSets.main.resources.srcDirs) {
- include 'META-INF/mods.toml'
- expand (
- 'pluginVersion': project.pluginVersion,
- 'pluginDescription': project.pluginDescription
- )
- }
-
- from(sourceSets.main.resources.srcDirs) {
- exclude 'META-INF/mods.toml'
+ inputs.property 'pluginVersion', project.pluginVersion
+ inputs.property 'pluginDescription', project.pluginDescription
+ filesMatching("mcmod.info") {
+ expand(inputs.properties)
}
}
shadowJar {
- archiveFileName = "spark-${project.pluginVersion}-forge.jar"
+ archiveFileName = "spark-${project.pluginVersion}-legacy-forge-1.8.9-dev.jar"
configurations = [project.configurations.shade]
relocate 'net.kyori.adventure', 'me.lucko.spark.lib.adventure'
@@ -55,7 +53,13 @@ shadowJar {
project.applyExcludes(delegate)
}
+remapJar {
+ inputFile = tasks.shadowJar.archiveFile
+ dependsOn tasks.shadowJar
+ archiveFileName = "spark-${project.pluginVersion}-legacy-forge-1.8.9.jar"
+}
+
artifacts {
- archives shadowJar
+ archives remapJar
shadow shadowJar
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java
index 1f7d90d..264cd40 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClassSourceLookup.java
@@ -20,17 +20,31 @@
package me.lucko.spark.forge;
-import cpw.mods.modlauncher.TransformingClassLoader;
import me.lucko.spark.common.sampler.source.ClassSourceLookup;
+import net.minecraftforge.fml.common.Loader;
+import net.minecraftforge.fml.common.ModContainer;
+
+import java.util.HashMap;
+import java.util.Map;
public class ForgeClassSourceLookup implements ClassSourceLookup {
+ Map<String, ModContainer> packageLUT = new HashMap<>();
+
+ public ForgeClassSourceLookup() {
+ for (ModContainer modContainer : Loader.instance().getModList()) {
+ for (String ownedPackage : modContainer.getOwnedPackages()) {
+ packageLUT.put(ownedPackage, modContainer);
+ }
+ }
+ }
+
@Override
public String identify(Class<?> clazz) {
- if (clazz.getClassLoader() instanceof TransformingClassLoader) {
- String name = clazz.getModule().getName();
- return name.equals("forge") || name.equals("minecraft") ? null : name;
- }
- return null;
+ ModContainer modContainer = packageLUT.get(clazz.getPackage().getName());
+ String modId = modContainer != null ? modContainer.getModId() : null;
+ if ("forge".equals(modId) || "minecraft".equals(modId) || "fml".equals(modId))
+ return null;
+ return modId;
}
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientCommandSender.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientCommandSender.java
index 5416370..f54a111 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientCommandSender.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientCommandSender.java
@@ -23,49 +23,34 @@ package me.lucko.spark.forge;
import me.lucko.spark.common.command.sender.AbstractCommandSender;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
-import net.minecraft.client.player.LocalPlayer;
-import net.minecraft.commands.CommandSourceStack;
-import net.minecraft.core.RegistryAccess;
-import net.minecraft.network.chat.Component.Serializer;
-import net.minecraft.network.chat.MutableComponent;
-import net.minecraft.world.entity.Entity;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.util.IChatComponent;
-import java.util.Objects;
import java.util.UUID;
-public class ForgeClientCommandSender extends AbstractCommandSender<CommandSourceStack> {
- public ForgeClientCommandSender(CommandSourceStack source) {
- super(source);
- }
-
- @Override
- public String getName() {
- return this.delegate.getTextName();
- }
-
- @Override
- public UUID getUniqueId() {
- Entity entity = this.delegate.getEntity();
- if (entity instanceof LocalPlayer player) {
- return player.getUUID();
- }
- return null;
- }
-
- @Override
- public void sendMessage(Component message) {
- MutableComponent component = Serializer.fromJson(GsonComponentSerializer.gson().serializeToTree(message), RegistryAccess.EMPTY);
- Objects.requireNonNull(component, "component");
- super.delegate.sendSystemMessage(component);
- }
-
- @Override
- public boolean hasPermission(String permission) {
- return true;
- }
-
- @Override
- protected Object getObjectForComparison() {
- return this.delegate.getEntity();
- }
+public class ForgeClientCommandSender extends AbstractCommandSender<EntityPlayerSP> {
+ public ForgeClientCommandSender(EntityPlayerSP source) {
+ super(source);
+ }
+
+ @Override
+ public String getName() {
+ return delegate.getName();
+ }
+
+ @Override
+ public UUID getUniqueId() {
+ return delegate.getUniqueID();
+ }
+
+ @Override
+ public void sendMessage(Component message) {
+ IChatComponent component = IChatComponent.Serializer.jsonToComponent(GsonComponentSerializer.gson().serialize(message));
+ delegate.addChatMessage(component);
+ }
+
+ @Override
+ public boolean hasPermission(String permission) {
+ return true;
+ }
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientTickHook.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientTickHook.java
new file mode 100644
index 0000000..dba0b94
--- /dev/null
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientTickHook.java
@@ -0,0 +1,50 @@
+/*
+ * This file is part of spark.
+ *
+ * Copyright (c) lucko (Luck) <luck@lucko.me>
+ * Copyright (c) contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package me.lucko.spark.forge;
+
+import me.lucko.spark.common.tick.AbstractTickHook;
+import me.lucko.spark.common.tick.TickHook;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+public class ForgeClientTickHook extends AbstractTickHook implements TickHook {
+
+ @SubscribeEvent
+ public void onTick(TickEvent.ClientTickEvent e) {
+ if (e.phase != TickEvent.Phase.START) {
+ return;
+ }
+
+ onTick();
+ }
+
+ @Override
+ public void start() {
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public void close() {
+ MinecraftForge.EVENT_BUS.unregister(this);
+ }
+
+}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeTickReporter.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientTickReporter.java
index 06d0f3e..cce9a40 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeTickReporter.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeClientTickReporter.java
@@ -20,41 +20,37 @@
package me.lucko.spark.forge;
+
import me.lucko.spark.common.tick.SimpleTickReporter;
import me.lucko.spark.common.tick.TickReporter;
import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.TickEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-
-public class ForgeTickReporter extends SimpleTickReporter implements TickReporter {
- private final TickEvent.Type type;
-
- public ForgeTickReporter(TickEvent.Type type) {
- this.type = type;
- }
-
- @SubscribeEvent
- public void onTick(TickEvent e) {
- if (e.type != this.type) {
- return;
- }
-
- switch (e.phase) {
- case START -> onStart();
- case END -> onEnd();
- default -> throw new AssertionError(e.phase);
- }
- }
-
- @Override
- public void start() {
- MinecraftForge.EVENT_BUS.register(this);
- }
-
- @Override
- public void close() {
- MinecraftForge.EVENT_BUS.unregister(this);
- super.close();
- }
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+public class ForgeClientTickReporter extends SimpleTickReporter implements TickReporter {
+
+ @SubscribeEvent
+ public void onTick(TickEvent.ClientTickEvent e) {
+
+ switch (e.phase) {
+ case START:
+ onStart();
+ break;
+ case END:
+ onEnd();
+ break;
+ }
+ }
+
+ @Override
+ public void start() {
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public void close() {
+ MinecraftForge.EVENT_BUS.unregister(this);
+ super.close();
+ }
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgePlatformInfo.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgePlatformInfo.java
index ede1996..b1906c1 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgePlatformInfo.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgePlatformInfo.java
@@ -21,11 +21,9 @@
package me.lucko.spark.forge;
import me.lucko.spark.common.platform.PlatformInfo;
-import net.minecraftforge.fml.ModContainer;
-import net.minecraftforge.fml.ModList;
-import net.minecraftforge.forgespi.language.IModInfo;
-import net.minecraftforge.versions.forge.ForgeVersion;
-import net.minecraftforge.versions.mcp.MCPVersion;
+import net.minecraftforge.common.ForgeVersion;
+import net.minecraftforge.fml.common.FMLCommonHandler;
+import net.minecraftforge.fml.common.Loader;
public class ForgePlatformInfo implements PlatformInfo {
private final Type type;
@@ -46,10 +44,7 @@ public class ForgePlatformInfo implements PlatformInfo {
@Override
public String getBrand() {
- return ModList.get().getModContainerById(ForgeVersion.MOD_ID)
- .map(ModContainer::getModInfo)
- .map(IModInfo::getDisplayName)
- .orElse("Forge");
+ return FMLCommonHandler.instance().getModName();
}
@Override
@@ -59,6 +54,6 @@ public class ForgePlatformInfo implements PlatformInfo {
@Override
public String getMinecraftVersion() {
- return MCPVersion.getMCVersion();
+ return Loader.instance().getMinecraftModContainer().getVersion();
}
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgePlayerPingProvider.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgePlayerPingProvider.java
index 8b96b65..7b7795a 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgePlayerPingProvider.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgePlayerPingProvider.java
@@ -22,24 +22,28 @@ package me.lucko.spark.forge;
import com.google.common.collect.ImmutableMap;
import me.lucko.spark.common.monitor.ping.PlayerPingProvider;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.WorldServer;
import java.util.Map;
public class ForgePlayerPingProvider implements PlayerPingProvider {
- private final MinecraftServer server;
+ private final MinecraftServer server;
- public ForgePlayerPingProvider(MinecraftServer server) {
- this.server = server;
- }
+ public ForgePlayerPingProvider(MinecraftServer server) {
+ this.server = server;
+ }
- @Override
- public Map<String, Integer> poll() {
- ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
- for (ServerPlayer player : this.server.getPlayerList().getPlayers()) {
- builder.put(player.getGameProfile().getName(), player.connection.latency());
- }
- return builder.build();
- }
+ @Override
+ public Map<String, Integer> poll() {
+ ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
+ for (WorldServer world : this.server.worldServers) {
+ for (EntityPlayer player : world.playerEntities) {
+ builder.put(player.getGameProfile().getName(), ((EntityPlayerMP) player).ping);
+ }
+ }
+ return builder.build();
+ }
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerCommandSender.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerCommandSender.java
index 6951d9a..e825dce 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerCommandSender.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerCommandSender.java
@@ -21,63 +21,57 @@
package me.lucko.spark.forge;
import me.lucko.spark.common.command.sender.AbstractCommandSender;
-import me.lucko.spark.forge.plugin.ForgeServerSparkPlugin;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
-import net.minecraft.commands.CommandSourceStack;
-import net.minecraft.core.RegistryAccess;
-import net.minecraft.network.chat.Component.Serializer;
-import net.minecraft.network.chat.MutableComponent;
-import net.minecraft.world.entity.Entity;
+import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.Entity;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.util.IChatComponent;
-import java.util.Objects;
import java.util.UUID;
-public class ForgeServerCommandSender extends AbstractCommandSender<CommandSourceStack> {
- private final ForgeServerSparkPlugin plugin;
+public class ForgeServerCommandSender extends AbstractCommandSender<ICommandSender> {
- public ForgeServerCommandSender(CommandSourceStack commandSource, ForgeServerSparkPlugin plugin) {
- super(commandSource);
- this.plugin = plugin;
- }
+ public ForgeServerCommandSender(ICommandSender commandSource) {
+ super(commandSource);
+ }
- @Override
- public String getName() {
- String name = this.delegate.getTextName();
- if (this.delegate.getEntity() != null && name.equals("Server")) {
- return "Console";
- }
- return name;
- }
+ @Override
+ public String getName() {
+ String name = this.delegate.getName();
+ if (delegate instanceof MinecraftServer) {
+ return "Console";
+ }
+ return name;
+ }
- @Override
- public UUID getUniqueId() {
- Entity entity = this.delegate.getEntity();
- return entity != null ? entity.getUUID() : null;
- }
+ @Override
+ public UUID getUniqueId() {
+ Entity entity = this.delegate.getCommandSenderEntity();
+ return entity != null ? entity.getUniqueID() : null;
+ }
- @Override
- public void sendMessage(Component message) {
- MutableComponent component = Serializer.fromJson(GsonComponentSerializer.gson().serializeToTree(message), RegistryAccess.EMPTY);
- Objects.requireNonNull(component, "component");
- super.delegate.sendSystemMessage(component);
- }
+ @Override
+ public void sendMessage(Component message) {
+ IChatComponent component = IChatComponent.Serializer.jsonToComponent(GsonComponentSerializer.gson().serialize(message));
+ delegate.addChatMessage(component);
+ }
- @Override
- public boolean hasPermission(String permission) {
- return this.plugin.hasPermission(this.delegate, permission);
- }
+ @Override
+ public boolean hasPermission(String permission) {
+ return this.delegate.canCommandSenderUseCommand(3, permission);
+ }
- @Override
- protected Object getObjectForComparison() {
- UUID uniqueId = getUniqueId();
- if (uniqueId != null) {
- return uniqueId;
- }
- Entity entity = this.delegate.getEntity();
- if (entity != null) {
- return entity;
- }
- return getName();
- }
+ @Override
+ protected Object getObjectForComparison() {
+ UUID uniqueId = getUniqueId();
+ if (uniqueId != null) {
+ return uniqueId;
+ }
+ Entity entity = this.delegate.getCommandSenderEntity();
+ if (entity != null) {
+ return entity;
+ }
+ return getName();
+ }
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeTickHook.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerTickHook.java
index 84de970..bd750fa 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeTickHook.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerTickHook.java
@@ -23,26 +23,17 @@ package me.lucko.spark.forge;
import me.lucko.spark.common.tick.AbstractTickHook;
import me.lucko.spark.common.tick.TickHook;
import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.TickEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
-public class ForgeTickHook extends AbstractTickHook implements TickHook {
- private final TickEvent.Type type;
-
- public ForgeTickHook(TickEvent.Type type) {
- this.type = type;
- }
+public class ForgeServerTickHook extends AbstractTickHook implements TickHook {
@SubscribeEvent
- public void onTick(TickEvent e) {
+ public void onTick(TickEvent.ServerTickEvent e) {
if (e.phase != TickEvent.Phase.START) {
return;
}
- if (e.type != this.type) {
- return;
- }
-
onTick();
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerTickReporter.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerTickReporter.java
new file mode 100644
index 0000000..292f0b1
--- /dev/null
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeServerTickReporter.java
@@ -0,0 +1,54 @@
+/*
+ * This file is part of spark.
+ *
+ * Copyright (c) lucko (Luck) <luck@lucko.me>
+ * Copyright (c) contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package me.lucko.spark.forge;
+
+import me.lucko.spark.common.tick.SimpleTickReporter;
+import me.lucko.spark.common.tick.TickReporter;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+
+public class ForgeServerTickReporter extends SimpleTickReporter implements TickReporter {
+
+ @SubscribeEvent
+ public void onTick(TickEvent.ServerTickEvent e) {
+ switch (e.phase) {
+ case START:
+ onStart();
+ break;
+ case END:
+ onEnd();
+ break;
+ }
+ }
+
+ @Override
+ public void start() {
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @Override
+ public void close() {
+ MinecraftForge.EVENT_BUS.unregister(this);
+ super.close();
+ }
+
+}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java
index 07dce65..5ade1ea 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeSparkMod.java
@@ -22,48 +22,44 @@ package me.lucko.spark.forge;
import me.lucko.spark.forge.plugin.ForgeClientSparkPlugin;
import me.lucko.spark.forge.plugin.ForgeServerSparkPlugin;
-import net.minecraftforge.common.MinecraftForge;
-import net.minecraftforge.event.server.ServerAboutToStartEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-import net.minecraftforge.fml.IExtensionPoint;
-import net.minecraftforge.fml.ModContainer;
+import me.lucko.spark.forge.plugin.ForgeSparkPlugin;
+import net.minecraft.client.Minecraft;
+import net.minecraft.server.MinecraftServer;
+import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Mod;
-import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
-import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
-import net.minecraftforge.fml.loading.FMLPaths;
+import net.minecraftforge.fml.common.ModContainer;
+import net.minecraftforge.fml.common.event.FMLInitializationEvent;
+import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
+import java.io.File;
import java.nio.file.Path;
-@Mod("spark")
+@Mod(modid = "spark", useMetadata = true)
public class ForgeSparkMod {
- private final ModContainer container;
- private final Path configDirectory;
+ private ModContainer container;
+ private Path configDirectory;
+ ForgeSparkPlugin plugin;
- public ForgeSparkMod(FMLJavaModLoadingContext ctx) {
- this.container = ctx.getContainer();
- this.configDirectory = FMLPaths.CONFIGDIR.get().resolve(this.container.getModId());
+ @Mod.EventHandler
+ public void preInit(FMLPreInitializationEvent event) {
+ container = Loader.instance().activeModContainer();
+ configDirectory = new File(event.getModConfigurationDirectory(), container.getModId()).toPath();
+ }
- ctx.getModEventBus().addListener(this::clientInit);
- ctx.registerDisplayTest(IExtensionPoint.DisplayTest.IGNORE_ALL_VERSION);
+ @Mod.EventHandler
+ public void init(FMLInitializationEvent event) {
+ plugin = SidedExecutor.executeIf(
+ () -> () -> ForgeClientSparkPlugin.register(this, Minecraft.getMinecraft()),
+ () -> () -> ForgeServerSparkPlugin.register(this, MinecraftServer.getServer())
+ );
+ }
- MinecraftForge.EVENT_BUS.register(this);
- }
+ public String getVersion() {
+ return this.container.getMetadata().version;
+ }
- public String getVersion() {
- return this.container.getModInfo().getVersion().toString();
- }
-
- public void clientInit(FMLClientSetupEvent e) {
- ForgeClientSparkPlugin.register(this, e);
- }
-
- @SubscribeEvent
- public void serverInit(ServerAboutToStartEvent e) {
- ForgeServerSparkPlugin.register(this, e);
- }
-
- public Path getConfigDirectory() {
- return this.configDirectory;
- }
+ public Path getConfigDirectory() {
+ return this.configDirectory;
+ }
}
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java
index a87aa03..84ba2f9 100644
--- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java
+++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java
@@ -20,205 +20,156 @@
package me.lucko.spark.forge;
-import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
+import com.mojang.realmsclient.util.Pair;
import me.lucko.spark.common.platform.world.AbstractChunkInfo;
import me.lucko.spark.common.platform.world.CountMap;
import me.lucko.spark.common.platform.world.WorldInfoProvider;
import net.minecraft.client.Minecraft;
-import net.minecraft.client.multiplayer.ClientLevel;
+import net.minecraft.client.multiplayer.WorldClient;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityList;
import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.level.ServerLevel;
-import net.minecraft.server.packs.repository.PackRepository;
-import net.minecraft.server.packs.repository.PackSource;
-import net.minecraft.world.entity.Entity;
-import net.minecraft.world.entity.EntityType;
-import net.minecraft.world.level.ChunkPos;
-import net.minecraft.world.level.GameRules;
-import net.minecraft.world.level.entity.EntityLookup;
-import net.minecraft.world.level.entity.PersistentEntitySectionManager;
-import net.minecraft.world.level.entity.TransientEntitySectionManager;
+import net.minecraft.world.World;
+import net.minecraft.world.WorldServer;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
-import java.util.List;
-import java.util.stream.Collectors;
+import java.util.Map;
public abstract class ForgeWorldInfoProvider implements WorldInfoProvider {
- protected abstract PackRepository getPackRepository();
-
- @Override
- public Collection<DataPackInfo> pollDataPacks() {
- return getPackRepository().getSelectedPacks().stream()
- .map(pack -> new DataPackInfo(
- pack.getId(),
- pack.getDescription().getString(),
- resourcePackSource(pack.getPackSource())
- ))
- .collect(Collectors.toList());
- }
-
- private static String resourcePackSource(PackSource source) {
- if (source == PackSource.DEFAULT) {
- return "none";
- } else if (source == PackSource.BUILT_IN) {
- return "builtin";
- } else if (source == PackSource.WORLD) {
- return "world";
- } else if (source == PackSource.SERVER) {
- return "server";
- } else {
- return "unknown";
- }
- }
-
- public static final class Server extends ForgeWorldInfoProvider {
- private final MinecraftServer server;
-
- public Server(MinecraftServer server) {
- this.server = server;
- }
-
- @Override
- public CountsResult pollCounts() {
- int players = this.server.getPlayerCount();
- int entities = 0;
- int chunks = 0;
-
- for (ServerLevel level : this.server.getAllLevels()) {
- PersistentEntitySectionManager<Entity> entityManager = level.entityManager;
- EntityLookup<Entity> entityIndex = entityManager.visibleEntityStorage;
-
- entities += entityIndex.count();
- chunks += level.getChunkSource().getLoadedChunksCount();
- }
-
- return new CountsResult(players, entities, -1, chunks);
- }
-
- @Override
- public ChunksResult<ForgeChunkInfo> pollChunks() {
- ChunksResult<ForgeChunkInfo> data = new ChunksResult<>();
-
- for (ServerLevel level : this.server.getAllLevels()) {
- Long2ObjectOpenHashMap<ForgeChunkInfo> levelInfos = new Long2ObjectOpenHashMap<>();
-
- for (Entity entity : level.getEntities().getAll()) {
- ForgeChunkInfo info = levelInfos.computeIfAbsent(
- entity.chunkPosition().toLong(), ForgeChunkInfo::new);
- info.entityCounts.increment(entity.getType());
- }
-
- data.put(level.dimension().location().getPath(), List.copyOf(levelInfos.values()));
- }
-
- return data;
- }
-
- @Override
- public GameRulesResult pollGameRules() {
- GameRulesResult data = new GameRulesResult();
- Iterable<ServerLevel> levels = this.server.getAllLevels();
-
- for (ServerLevel level : levels) {
- String levelName = level.dimension().location().getPath();
-
- level.getGameRules().visitGameRuleTypes(new GameRules.GameRuleTypeVisitor() {
- @Override
- public <T extends GameRules.Value<T>> void visit(GameRules.Key<T> key, GameRules.Type<T> type) {
- String defaultValue = type.createRule().serialize();
- data.putDefault(key.getId(), defaultValue);
-
- String value = level.getGameRules().getRule(key).serialize();
- data.put(key.getId(), level