1
0
forked from xjboss/KCauldronX

Added /kc dump command for some debug reports

This commit is contained in:
Prototik 2015-10-06 21:00:35 +07:00
parent e64531cffa
commit a5b10b36ab
4 changed files with 171 additions and 95 deletions

17
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,17 @@
Contribution Guide
==================
You can make and publish your changes, and even suggest to merge your changes with main codebase of the server.
Installing Dev Environment
--------------------------
* First of all you need to clone main server code and some other parts, like Forge and Bukkit
`git clone --recursive https://gitlab.prok.pw/Prototik/KCauldron.git`
* Move to `KCauldron` directory
`cd KCauldron`
* Prepare some stuff
`./gradlew setupCauldron`
* For now you need to open project in Eclipse IDE
* If you haven't Eclipse on your computer - [download and install it](https://www.eclipse.org/downloads/)
* In Eclipse choose File - Import... - General - Existing Projects into Workspace, specify KCauldron/eclipse folder
* Unmark `Copy projects into workspace` button!
* Click Finish and start your contributing!

View File

@ -193,7 +193,7 @@
+ // Spigot start
+
+ /** Positions to update */
+ protected final gnu.trove.map.hash.TLongShortHashMap activeChunkSet_CB;
+ public final gnu.trove.map.hash.TLongShortHashMap activeChunkSet_CB;
+ public float growthOdds = 100;
+ protected float modifiedOdds = 100;
+

View File

@ -1,5 +1,12 @@
package kcauldron;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.World;
import org.bukkit.command.Command;
@ -10,10 +17,13 @@ import org.bukkit.craftbukkit.entity.CraftPlayer;
import kcauldron.updater.CommandSenderUpdateCallback;
import kcauldron.updater.KCauldronUpdater;
import kcauldron.updater.KVersionRetriever;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.Entity;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.NextTickListEntry;
import net.minecraft.world.WorldServer;
import net.minecraftforge.server.command.ForgeCommand;
import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.common.DimensionManager;
public class KCauldronCommand extends Command {
public static final String NAME = "kc";
@ -21,6 +31,7 @@ public class KCauldronCommand extends Command {
public static final String UPDATE = NAME + ".update";
public static final String TPS = NAME + ".tps";
public static final String RESTART = NAME + ".restart";
public static final String DUMP = NAME + ".dump";
public KCauldronCommand() {
super(NAME);
@ -30,9 +41,10 @@ public class KCauldronCommand extends Command {
builder.append(String.format("/%s update [version] - Update to specified or latest version\n", NAME));
builder.append(String.format("/%s tps - Show tps statistics\n", NAME));
builder.append(String.format("/%s restart - Restart server\n", NAME));
builder.append(String.format("/%s dump - Dump statistics into kcauldron.dump file\n", NAME));
setUsage(builder.toString());
setPermission("kcauldron");
setPermission("kc");
}
public boolean testPermission(CommandSender target, String permission) {
@ -93,8 +105,8 @@ public class KCauldronCommand extends Command {
double worldTPS = Math.min(1000.0 / worldTickTime, 20);
sender.sendMessage(String.format("%s[%d] %s%s %s- %s%.2fms / %.2ftps", ChatColor.GOLD, dimensionId,
current ? ChatColor.GREEN : ChatColor.YELLOW, displayName, ChatColor.RESET, ChatColor.DARK_RED, worldTickTime,
worldTPS));
current ? ChatColor.GREEN : ChatColor.YELLOW, displayName, ChatColor.RESET,
ChatColor.DARK_RED, worldTickTime, worldTPS));
}
}
double meanTickTime = mean(server.tickTimeArray) * 1.0E-6D;
@ -105,6 +117,53 @@ public class KCauldronCommand extends Command {
if (!testPermission(sender, RESTART))
return true;
KCauldron.restart();
} else if ("dump".equals(action)) {
if (!testPermission(sender, DUMP))
return true;
try {
File outputFile = new File("kcauldron.dump");
OutputStream os = new FileOutputStream(outputFile);
Writer writer = new OutputStreamWriter(os);
for (WorldServer world : DimensionManager.getWorlds()) {
writer.write(String.format("Stats for %s [%s] with id %d\n", world,
world.provider.getDimensionName(), world.dimension));
writer.write("Current tick: " + world.worldInfo.getWorldTotalTime() + "\n");
writer.write("\nEntities: ");
writer.write("count - " + world.loadedEntityList_KC.size() + "\n");
for (Entity entity : world.loadedEntityList_KC) {
writer.write(String.format(" %s at (%.4f;%.4f;%.4f)\n", entity.getClass().getName(),
entity.posX, entity.posY, entity.posZ));
}
writer.write("\nTileEntities: ");
writer.write("count - " + world.loadedTileEntityList_KC.size() + "\n");
for (TileEntity entity : world.loadedTileEntityList_KC) {
writer.write(String.format(" %s at (%d;%d;%d)\n", entity.getClass().getName(), entity.xCoord,
entity.yCoord, entity.zCoord));
}
writer.write("\nLoaded chunks: ");
writer.write("count - " + world.activeChunkSet_CB.size() + "\n");
for (long chunkKey : world.activeChunkSet_CB.keys()) {
final int x = WorldServer.keyToX(chunkKey);
final int z = WorldServer.keyToZ(chunkKey);
Chunk chunk = world.chunkProvider.provideChunk(x, z);
if (chunk == null)
continue;
writer.write(String.format("Chunk at (%d;%d)\n", x, z));
@SuppressWarnings("unchecked")
List<NextTickListEntry> updates = world.getPendingBlockUpdates(chunk, false);
writer.write("Pending block updates [" + updates.size() + "]:\n");
for (NextTickListEntry entry : updates) {
writer.write(String.format("(%d;%d;%d) at %d with priority %d\n", entry.xCoord,
entry.yCoord, entry.zCoord, entry.scheduledTime, entry.priority));
}
}
writer.write("-------------------------\n");
}
writer.close();
sender.sendMessage(ChatColor.RED + "Dump saved!");
} catch (Exception e) {
e.printStackTrace();
}
} else {
sender.sendMessage(ChatColor.RED + "Unknown action");
}