From ed34b40dcec87eb2b6fde828debb0d3c00bcf8ce Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 11 Jul 2022 13:25:58 -0400 Subject: Implement world info provider for 1.7.10 --- .../spark/forge/Forge1710PlayerPingProvider.java | 48 ++++++++ .../spark/forge/Forge1710WorldInfoProvider.java | 126 +++++++++++++++++++++ .../forge/plugin/Forge1710ClientSparkPlugin.java | 11 ++ .../forge/plugin/Forge1710ServerSparkPlugin.java | 33 ++++++ 4 files changed, 218 insertions(+) create mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlayerPingProvider.java create mode 100644 spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java (limited to 'spark-forge1710/src') diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlayerPingProvider.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlayerPingProvider.java new file mode 100644 index 0000000..11ee45a --- /dev/null +++ b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlayerPingProvider.java @@ -0,0 +1,48 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * 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 . + */ + +package me.lucko.spark.forge; + +import com.google.common.collect.ImmutableMap; + +import me.lucko.spark.common.monitor.ping.PlayerPingProvider; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.server.MinecraftServer; + +import java.util.List; +import java.util.Map; + +public class Forge1710PlayerPingProvider implements PlayerPingProvider { + private final MinecraftServer server; + + public Forge1710PlayerPingProvider(MinecraftServer server) { + this.server = server; + } + + @Override + public Map poll() { + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (EntityPlayerMP player : (List)this.server.getConfigurationManager().playerEntityList) { + builder.put(player.getGameProfile().getName(), player.ping); + } + return builder.build(); + } +} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java new file mode 100644 index 0000000..86ef8ec --- /dev/null +++ b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java @@ -0,0 +1,126 @@ +/* + * This file is part of spark. + * + * Copyright (c) lucko (Luck) + * 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 . + */ + +package me.lucko.spark.forge; + +import cpw.mods.fml.relauncher.ReflectionHelper; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +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.ChunkProviderClient; +import net.minecraft.client.multiplayer.WorldClient; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.WorldServer; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public abstract class Forge1710WorldInfoProvider implements WorldInfoProvider { + public static final class Server extends Forge1710WorldInfoProvider { + private final MinecraftServer server; + + public Server(MinecraftServer server) { + this.server = server; + } + + @Override + public Result poll() { + Result data = new Result<>(); + + for (WorldServer level : this.server.worldServers) { + ArrayList list = new ArrayList<>(); + for(Chunk chunk : (List)level.theChunkProviderServer.loadedChunks) { + list.add(new ForgeChunkInfo(chunk)); + } + data.put(level.provider.getDimensionName(), list); + } + + return data; + } + } + + @SideOnly(Side.CLIENT) + public static final class Client extends Forge1710WorldInfoProvider { + private final Minecraft client; + + public Client(Minecraft client) { + this.client = client; + } + + @Override + public Result poll() { + Result data = new Result<>(); + + WorldClient level = this.client.theWorld; + if (level == null) { + return null; + } + + ArrayList list = new ArrayList<>(); + IChunkProvider provider = level.getChunkProvider(); + if(provider instanceof ChunkProviderClient) { + List chunks = ReflectionHelper.getPrivateValue(ChunkProviderClient.class, (ChunkProviderClient)provider, "chunkMapping", "field_73236_b"); + for(Chunk chunk : chunks) { + list.add(new ForgeChunkInfo(chunk)); + } + } + + data.put(level.provider.getDimensionName(), list); + + return data; + } + } + + static final class ForgeChunkInfo extends AbstractChunkInfo> { + private final CountMap> entityCounts; + + ForgeChunkInfo(Chunk chunk) { + super(chunk.xPosition, chunk.zPosition); + + this.entityCounts = new CountMap.Simple<>(new HashMap<>()); + for(List entityList : chunk.entityLists) { + entityList.forEach(entity -> { + this.entityCounts.increment(entity.getClass()); + }); + } + } + + @Override + public CountMap> getEntityCounts() { + return this.entityCounts; + } + + @Override + public String entityTypeName(Class type) { + return (String)EntityList.classToStringMapping.get(type); + } + } + + +} diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java index 305b06e..d0ae1ed 100644 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java +++ b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java @@ -22,6 +22,7 @@ package me.lucko.spark.forge.plugin; import cpw.mods.fml.common.gameevent.TickEvent; import me.lucko.spark.common.platform.PlatformInfo; +import me.lucko.spark.common.platform.world.WorldInfoProvider; import me.lucko.spark.common.tick.TickHook; import me.lucko.spark.common.tick.TickReporter; import me.lucko.spark.forge.*; @@ -72,6 +73,16 @@ public class Forge1710ClientSparkPlugin extends Forge1710SparkPlugin { return new Forge1710TickReporter(TickEvent.Type.CLIENT); } + @Override + public WorldInfoProvider createWorldInfoProvider() { + return new Forge1710WorldInfoProvider.Client(Minecraft.getMinecraft()); + } + + @Override + public void executeSync(Runnable task) { + this.minecraft.addScheduledTask(task); + } + @Override public PlatformInfo getPlatformInfo() { return new Forge1710PlatformInfo(PlatformInfo.Type.CLIENT); diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java index 303739f..8dff67e 100644 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java +++ b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java @@ -20,9 +20,13 @@ package me.lucko.spark.forge.plugin; +import com.google.common.collect.Queues; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.event.FMLServerStartingEvent; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; import me.lucko.spark.common.platform.PlatformInfo; +import me.lucko.spark.common.platform.world.WorldInfoProvider; import me.lucko.spark.common.tick.TickHook; import me.lucko.spark.common.tick.TickReporter; import me.lucko.spark.forge.*; @@ -32,20 +36,37 @@ import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import java.util.List; +import java.util.Queue; +import java.util.concurrent.FutureTask; import java.util.stream.Stream; public class Forge1710ServerSparkPlugin extends Forge1710SparkPlugin { + private final Queue scheduledServerTasks = Queues.newArrayDeque(); public static Forge1710ServerSparkPlugin register(Forge1710SparkMod mod, FMLServerStartingEvent event) { Forge1710ServerSparkPlugin plugin = new Forge1710ServerSparkPlugin(mod, event.getServer()); plugin.enable(); + FMLCommonHandler.instance().bus().register(plugin); + // register commands & permissions event.registerServerCommand(plugin); return plugin; } + @SubscribeEvent + public void onServerTickEnd(TickEvent.ServerTickEvent event) { + if(event.phase == TickEvent.Phase.START) { + synchronized(scheduledServerTasks) { + while (!scheduledServerTasks.isEmpty()) + { + scheduledServerTasks.poll().run(); + } + } + } + } + private final MinecraftServer server; public Forge1710ServerSparkPlugin(Forge1710SparkMod mod, MinecraftServer server) { @@ -81,6 +102,18 @@ public class Forge1710ServerSparkPlugin extends Forge1710SparkPlugin { return new Forge1710TickReporter(TickEvent.Type.SERVER); } + @Override + public WorldInfoProvider createWorldInfoProvider() { + return new Forge1710WorldInfoProvider.Server(FMLCommonHandler.instance().getMinecraftServerInstance()); + } + + @Override + public void executeSync(Runnable task) { + synchronized (scheduledServerTasks) { + scheduledServerTasks.add(task); + } + } + @Override public PlatformInfo getPlatformInfo() { return new Forge1710PlatformInfo(PlatformInfo.Type.SERVER); -- cgit From 077889c3f80c954ff97dc347f75da3b436e2ba38 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 30 Jul 2022 17:03:50 -0400 Subject: Modernize Forge 1.7.10 thread dumper --- spark-forge1710/build.gradle | 6 ++++++ .../lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java | 8 ++++++++ .../lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java | 10 ++++++++++ .../java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java | 8 -------- spark-forge1710/src/main/resources/META-INF/spark_at.cfg | 1 + 5 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 spark-forge1710/src/main/resources/META-INF/spark_at.cfg (limited to 'spark-forge1710/src') diff --git a/spark-forge1710/build.gradle b/spark-forge1710/build.gradle index 4b4f4e5..8fd166d 100644 --- a/spark-forge1710/build.gradle +++ b/spark-forge1710/build.gradle @@ -55,6 +55,12 @@ processResources { } } +jar { + manifest { + attributes 'FMLAT': 'spark_at.cfg' + } +} + shadowJar { archiveName = 'spark-forge1710.jar' configurations = [project.configurations.shade] diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java index d0ae1ed..446a0c9 100644 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java +++ b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java @@ -23,6 +23,7 @@ package me.lucko.spark.forge.plugin; import cpw.mods.fml.common.gameevent.TickEvent; import me.lucko.spark.common.platform.PlatformInfo; import me.lucko.spark.common.platform.world.WorldInfoProvider; +import me.lucko.spark.common.sampler.ThreadDumper; import me.lucko.spark.common.tick.TickHook; import me.lucko.spark.common.tick.TickReporter; import me.lucko.spark.forge.*; @@ -47,10 +48,17 @@ public class Forge1710ClientSparkPlugin extends Forge1710SparkPlugin { } private final Minecraft minecraft; + private final ThreadDumper gameThreadDumper; public Forge1710ClientSparkPlugin(Forge1710SparkMod mod, Minecraft minecraft) { super(mod); this.minecraft = minecraft; + this.gameThreadDumper = new ThreadDumper.Specific(minecraft.mcThread); + } + + @Override + public ThreadDumper getDefaultThreadDumper() { + return this.gameThreadDumper; } @Override diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java index 8dff67e..3fde91e 100644 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java +++ b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java @@ -27,6 +27,7 @@ import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; import me.lucko.spark.common.platform.PlatformInfo; import me.lucko.spark.common.platform.world.WorldInfoProvider; +import me.lucko.spark.common.sampler.ThreadDumper; import me.lucko.spark.common.tick.TickHook; import me.lucko.spark.common.tick.TickReporter; import me.lucko.spark.forge.*; @@ -43,6 +44,8 @@ import java.util.stream.Stream; public class Forge1710ServerSparkPlugin extends Forge1710SparkPlugin { private final Queue scheduledServerTasks = Queues.newArrayDeque(); + private final ThreadDumper.GameThread gameThreadDumper; + public static Forge1710ServerSparkPlugin register(Forge1710SparkMod mod, FMLServerStartingEvent event) { Forge1710ServerSparkPlugin plugin = new Forge1710ServerSparkPlugin(mod, event.getServer()); plugin.enable(); @@ -72,6 +75,13 @@ public class Forge1710ServerSparkPlugin extends Forge1710SparkPlugin { public Forge1710ServerSparkPlugin(Forge1710SparkMod mod, MinecraftServer server) { super(mod); this.server = server; + this.gameThreadDumper = new ThreadDumper.GameThread(); + this.scheduledServerTasks.add(() -> this.gameThreadDumper.setThread(Thread.currentThread())); + } + + @Override + public ThreadDumper getDefaultThreadDumper() { + return this.gameThreadDumper.get(); } @Override diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java index b67659f..26e1752 100644 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java +++ b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java @@ -23,7 +23,6 @@ package me.lucko.spark.forge.plugin; import cpw.mods.fml.common.FMLCommonHandler; import me.lucko.spark.common.SparkPlatform; import me.lucko.spark.common.SparkPlugin; -import me.lucko.spark.common.sampler.ThreadDumper; import me.lucko.spark.forge.Forge1710CommandSender; import me.lucko.spark.forge.Forge1710SparkMod; import net.minecraft.command.ICommand; @@ -45,7 +44,6 @@ public abstract class Forge1710SparkPlugin implements SparkPlugin, ICommand { private final Logger logger; protected final ScheduledExecutorService scheduler; protected final SparkPlatform platform; - protected final ThreadDumper.GameThread threadDumper = new ThreadDumper.GameThread(); protected Forge1710SparkPlugin(Forge1710SparkMod mod) { this.mod = mod; @@ -98,11 +96,6 @@ public abstract class Forge1710SparkPlugin implements SparkPlugin, ICommand { } } - @Override - public ThreadDumper getDefaultThreadDumper() { - return this.threadDumper.get(); - } - // implement ICommand @Override @@ -122,7 +115,6 @@ public abstract class Forge1710SparkPlugin implements SparkPlugin, ICommand { @Override public void processCommand(ICommandSender sender, String[] args) { - this.threadDumper.ensureSetup(); this.platform.executeCommand(new Forge1710CommandSender(sender, this), args); } diff --git a/spark-forge1710/src/main/resources/META-INF/spark_at.cfg b/spark-forge1710/src/main/resources/META-INF/spark_at.cfg new file mode 100644 index 0000000..ff29bd3 --- /dev/null +++ b/spark-forge1710/src/main/resources/META-INF/spark_at.cfg @@ -0,0 +1 @@ +public net.minecraft.client.Minecraft field_152352_aC # mcThread \ No newline at end of file -- cgit From d9550259c1995d21fc345c58f2e531fdecf75acd Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 26 Dec 2022 18:50:18 -0500 Subject: Attempt to fix NPE when running profiler --- .../lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'spark-forge1710/src') diff --git a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java index 3fde91e..db9f299 100644 --- a/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java +++ b/spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java @@ -88,7 +88,15 @@ public class Forge1710ServerSparkPlugin extends Forge1710SparkPlugin { public boolean hasPermission(ICommandSender sender, String permission) { if (sender instanceof EntityPlayerMP) { EntityPlayerMP player = (EntityPlayerMP)sender; - return isOp(player) || player.mcServer.getServerOwner().equals(player.getGameProfile().getName()); + if(isOp(player)) + return true; + else { + String serverOwner = MinecraftServer.getServer().getServerOwner(); + if(player.getGameProfile().getName() != null && serverOwner != null) + return serverOwner.equals(player.getGameProfile().getName()); + else + return false; + } } else { return true; } -- cgit