aboutsummaryrefslogtreecommitdiff
path: root/spark-forge/src/main/java/me/lucko
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2025-02-28 14:17:45 +0100
committerLinnea Gräf <nea@nea.moe>2025-02-28 14:37:10 +0100
commit3738efb56b920d29918aceb42c30698884389caf (patch)
tree3800c10d7abcfb42c687bfc8e9a61ffff3590d3e /spark-forge/src/main/java/me/lucko
parentcccd48323b9987274a14bd2cbc9e009b0ed8e407 (diff)
downloadspark-master.tar.gz
spark-master.tar.bz2
spark-master.zip
Diffstat (limited to 'spark-forge/src/main/java/me/lucko')
-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
15 files changed, 767 insertions, 838 deletions
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(), levelName, value);
- }
- });
- }
-
- return data;
- }
-
- @Override
- protected PackRepository getPackRepository() {
- return this.server.getPackRepository();
- }
- }
-
- public static final class Client extends ForgeWorldInfoProvider {
- private final Minecraft client;
-
- public Client(Minecraft client) {
- this.client = client;
- }
-
- @Override
- public CountsResult pollCounts() {
- ClientLevel level = this.client.level;
- if (level == null) {
- return null;
- }
-
- TransientEntitySectionManager<Entity> entityManager = level.entityStorage;
- EntityLookup<Entity> entityIndex = entityManager.entityStorage;
-
- int entities = entityIndex.count();
- int chunks = level.getChunkSource().getLoadedChunksCount();
-
- return new CountsResult(-1, entities, -1, chunks);
- }
-
- @Override
- public ChunksResult<ForgeChunkInfo> pollChunks() {
- ClientLevel level = this.client.level;
- if (level == null) {
- return null;
- }
-
- ChunksResult<ForgeChunkInfo> data = new ChunksResult<>();
-
- 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()));
+ protected void fillLevelChunkEntityCounts(World level, ChunksResult<ForgeChunkInfo> data) {
+ Map<Pair<Integer, Integer>, ForgeChunkInfo> levelInfos = new HashMap<>();
- return data;
- }
-
- @Override
- public GameRulesResult pollGameRules() {
- // Not available on client since 24w39a
- return null;
- }
-
- @Override
- protected PackRepository getPackRepository() {
- return this.client.getResourcePackRepository();
- }
- }
-
- public static final class ForgeChunkInfo extends AbstractChunkInfo<EntityType<?>> {
- private final CountMap<EntityType<?>> entityCounts;
-
- ForgeChunkInfo(long chunkPos) {
- super(ChunkPos.getX(chunkPos), ChunkPos.getZ(chunkPos));
-
- this.entityCounts = new CountMap.Simple<>(new HashMap<>());
- }
+ for (Entity entity : level.loadedEntityList) {
+ ForgeChunkInfo info = levelInfos.computeIfAbsent(
+ // TODO: pack ints to long
+ Pair.of(entity.chunkCoordX, entity.chunkCoordZ), ForgeChunkInfo::ne