diff options
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 |
