aboutsummaryrefslogtreecommitdiff
path: root/spark-forge1710/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'spark-forge1710/src/main')
-rw-r--r--spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710PlayerPingProvider.java48
-rw-r--r--spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java150
-rw-r--r--spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ClientSparkPlugin.java19
-rw-r--r--spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710ServerSparkPlugin.java53
-rw-r--r--spark-forge1710/src/main/java/me/lucko/spark/forge/plugin/Forge1710SparkPlugin.java8
-rw-r--r--spark-forge1710/src/main/resources/META-INF/spark_at.cfg1
6 files changed, 270 insertions, 9 deletions
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) <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 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<String, Integer> poll() {
+ ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder();
+ for (EntityPlayerMP player : (List<EntityPlayerMP>)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..7252d71
--- /dev/null
+++ b/spark-forge1710/src/main/java/me/lucko/spark/forge/Forge1710WorldInfoProvider.java
@@ -0,0 +1,150 @@
+/*
+ * 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 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 ChunksResult<ForgeChunkInfo> pollChunks() {
+ ChunksResult<ForgeChunkInfo> data = new ChunksResult<>();
+
+ for (WorldServer level : this.server.worldServers) {
+ ArrayList<ForgeChunkInfo> list = new ArrayList<>();
+ for(Chunk chunk : (List<Chunk>)level.theChunkProviderServer.loadedChunks) {
+ list.add(new ForgeChunkInfo(chunk));
+ }
+ data.put(level.provider.getDimensionName(), list);
+ }
+
+ return data;
+ }
+
+ @Override
+ public CountsResult pollCounts() {
+ int players = this.server.getCurrentPlayerCount();
+ int entities = 0;
+ int chunks = 0;
+
+ for (WorldServer level : this.server.worldServers) {
+ entities += level.loadedEntityList.size();
+ chunks += level.getChunkProvider().getLoadedChunkCount();
+ }
+
+ return new CountsResult(players, entities, -1, chunks);
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ public static final class Client extends Forge1710WorldInfoProvider {
+ private final Minecraft client;
+
+ public Client(Minecraft client) {
+ this.client = client;
+ }
+
+ @Override
+ public ChunksResult<ForgeChunkInfo> pollChunks() {
+ ChunksResult<ForgeChunkInfo> data = new ChunksResult<>();
+
+ WorldClient level = this.client.theWorld;
+ if (level == null) {
+ return null;
+ }
+
+ ArrayList<ForgeChunkInfo> list = new ArrayList<>();
+ IChunkProvider provider = level.getChunkProvider();
+ if(provider instanceof ChunkProviderClient) {
+ List<Chunk> 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;
+ }
+
+ @Override
+ public CountsResult pollCounts() {
+ WorldClient level = this.client.theWorld;
+ if (level == null) {
+ return null;
+ }
+
+ return new CountsResult(-1, level.loadedEntityList.size(), -1, level.getChunkProvider().getLoadedChunkCount());
+ }
+ }
+
+ static final class ForgeChunkInfo extends AbstractChunkInfo<Class<? extends Entity>> {
+ private final CountMap<Class<? extends Entity>> entityCounts;
+
+ ForgeChunkInfo(Chunk chunk) {
+ super(chunk.xPosition, chunk.zPosition);
+
+ this.entityCounts = new CountMap.Simple<>(new HashMap<>());
+ for(List<Entity> entityList : chunk.entityLists) {
+ entityList.forEach(entity -> {
+ this.entityCounts.increment(entity.getClass());
+ });
+ }
+ }
+
+ @Override
+ public CountMap<Class<? extends Entity>> getEntityCounts() {
+ return this.entityCounts;
+ }
+
+ @Override
+ public String entityTypeName(Class<? extends Entity> 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..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
@@ -22,6 +22,8 @@ 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.*;
@@ -46,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
@@ -73,6 +82,16 @@ public class Forge1710ClientSparkPlugin extends Forge1710SparkPlugin {
}
@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..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
@@ -20,9 +20,14 @@
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.sampler.ThreadDumper;
import me.lucko.spark.common.tick.TickHook;
import me.lucko.spark.common.tick.TickReporter;
import me.lucko.spark.forge.*;
@@ -32,32 +37,66 @@ 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<Runnable> 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();
+ 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) {
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
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;
}
@@ -82,6 +121,18 @@ public class Forge1710ServerSparkPlugin extends Forge1710SparkPlugin {
}
@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);
}
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