Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Basic Pregenerator #121

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/main/java/serverutils/ServerUtilitiesConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,9 @@ public static class Commands {

@Config.DefaultBoolean(true)
public boolean dump_stats;

@Config.DefaultBoolean(true)
public boolean pregen;
}

public static class Backups {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import cpw.mods.fml.common.event.FMLServerStartingEvent;
import serverutils.ServerUtilitiesConfig;
import serverutils.command.chunks.CmdChunks;
import serverutils.command.pregen.CmdPregen;
import serverutils.command.ranks.CmdRanks;
import serverutils.command.team.CmdTeam;
import serverutils.command.tp.CmdBack;
Expand Down Expand Up @@ -143,5 +144,8 @@ public static void registerCommands(FMLServerStartingEvent event) {
if (ServerUtilitiesConfig.commands.dump_stats) {
event.registerServerCommand(new CmdDumpStats());
}
if (ServerUtilitiesConfig.commands.pregen) {
event.registerServerCommand(new CmdPregen());
}
}
}
15 changes: 15 additions & 0 deletions src/main/java/serverutils/command/pregen/CmdPregen.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package serverutils.command.pregen;

import serverutils.lib.command.CmdTreeBase;
import serverutils.lib.command.CmdTreeHelp;

public class CmdPregen extends CmdTreeBase {

public CmdPregen() {
super("pregen");
addSubcommand(new CmdProgress());
addSubcommand(new CmdStart());
addSubcommand(new CmdStop());
addSubcommand(new CmdTreeHelp(this));
}
}
23 changes: 23 additions & 0 deletions src/main/java/serverutils/command/pregen/CmdProgress.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package serverutils.command.pregen;

import net.minecraft.command.ICommandSender;
import net.minecraft.util.ChatComponentText;

import serverutils.lib.command.CmdBase;
import serverutils.pregenerator.ChunkLoaderManager;

public class CmdProgress extends CmdBase {

public CmdProgress() {
super("progress", Level.OP);
}

@Override
public void processCommand(ICommandSender sender, String[] args) {
if (ChunkLoaderManager.instance.isGenerating()) {
sender.addChatMessage(new ChatComponentText(ChunkLoaderManager.instance.progressString()));
} else {
sender.addChatMessage(new ChatComponentText("No generator running."));
}
}
}
98 changes: 98 additions & 0 deletions src/main/java/serverutils/command/pregen/CmdStart.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package serverutils.command.pregen;

import java.io.IOException;

import net.minecraft.command.ICommandSender;
import net.minecraft.command.WrongUsageException;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentText;

import serverutils.lib.command.CmdBase;
import serverutils.lib.command.ICommandWithParent;
import serverutils.lib.util.misc.PregeneratorCommandInfo;
import serverutils.pregenerator.ChunkLoaderManager;

public class CmdStart extends CmdBase {

public CmdStart() {
super("start", Level.OP);
}

@Override
public void processCommand(ICommandSender sender, String[] args) {
checkArgs(sender, args, 1);

int radius;
double xLoc, zLoc;

if (args.length == 3) {
xLoc = parseDoubleBounded(sender, args[0], -30000000.0D, 30000000.0D);
zLoc = parseDoubleBounded(sender, args[1], -30000000.0D, 30000000.0D);

radius = parseInt(sender, args[2]);
if (radius > 2000) {
sender.addChatMessage(
new ChatComponentText(
"Radii larger than 2000 are not permitted. World sizes will be 100's of gbs"));
return;
}
} else {
xLoc = sender.getPlayerCoordinates().posX;
zLoc = sender.getPlayerCoordinates().posZ;

radius = parseInt(sender, args[0]);
if (radius > 2000) {
sender.addChatMessage(
new ChatComponentText(
"Radii larger than 2000 are not permitted. World sizes will be 100's of gbs"));
return;
}
}

int dimensionID = sender.getEntityWorld().provider.dimensionId;
PregeneratorCommandInfo commandInfo = new PregeneratorCommandInfo(xLoc, zLoc, radius, dimensionID);

if (!ChunkLoaderManager.instance.isGenerating()) {
try {
sender.addChatMessage(
new ChatComponentText("Initializing pregenerator. Check progress with '/pregen progress'."));
ChunkLoaderManager.instance.initializePregenerator(commandInfo, MinecraftServer.getServer());
} catch (IOException e) {
e.printStackTrace();
sender.addChatMessage(
new ChatComponentText(
"Cannot start a pregenerator! File exception when starting pregenerator!"));
}
} else {
sender.addChatMessage(
new ChatComponentText("Cannot start a pregenerator! There's already generation in progress!"));
}
}

@Override
public void checkArgs(ICommandSender sender, String[] args, int i) {

if (args.length < i) {
throw new WrongUsageException(getCommandUsage(sender));
}

if (sender instanceof MinecraftServer) {
if (args.length != 3) {
throw new WrongUsageException(getCommandUsage(sender));
}
} else {
if (!(args.length == 1 || args.length == 3)) {
throw new WrongUsageException(getCommandUsage(sender));
}
}
}

@Override
public String getCommandUsage(ICommandSender sender) {
if (sender instanceof MinecraftServer) {
return "commands." + ICommandWithParent.getCommandPath(this) + ".usage_server";
}

return "commands." + ICommandWithParent.getCommandPath(this) + ".usage_client";
}
}
24 changes: 24 additions & 0 deletions src/main/java/serverutils/command/pregen/CmdStop.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package serverutils.command.pregen;

import net.minecraft.command.ICommandSender;
import net.minecraft.util.ChatComponentText;

import serverutils.lib.command.CmdBase;
import serverutils.pregenerator.ChunkLoaderManager;

public class CmdStop extends CmdBase {

public CmdStop() {
super("stop", Level.OP);
}

@Override
public void processCommand(ICommandSender sender, String[] args) {
if (ChunkLoaderManager.instance.isGenerating()) {
ChunkLoaderManager.instance.reset(true);
sender.addChatMessage(new ChatComponentText("Cancelling pregeneration."));
} else {
sender.addChatMessage(new ChatComponentText("No generator running."));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import serverutils.lib.util.text_components.Notification;
import serverutils.lib.util.text_components.TextComponentParser;
import serverutils.net.MessageUpdatePlayTime;
import serverutils.pregenerator.ChunkLoaderManager;
import serverutils.ranks.Ranks;

public class ServerUtilitiesServerEventHandler {
Expand Down Expand Up @@ -227,6 +228,10 @@ public void onServerTick(TickEvent.ServerTickEvent event) {
playerToKickForAfk.playerNetServerHandler
.onDisconnect(new ChatComponentTranslation("multiplayer.disconnect.idling"));
}

if (ChunkLoaderManager.instance.isGenerating()) {
ChunkLoaderManager.instance.queueChunks(1);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@
import net.minecraftforge.event.world.WorldEvent;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import serverutils.ServerUtilities;
import serverutils.ServerUtilitiesConfig;
import serverutils.data.ClaimedChunk;
import serverutils.data.ClaimedChunks;
import serverutils.data.ServerUtilitiesUniverseData;
import serverutils.lib.math.ChunkDimPos;
import serverutils.pregenerator.ChunkLoaderManager;

public class ServerUtilitiesWorldEventHandler {

Expand Down Expand Up @@ -95,4 +97,26 @@ public void onExplosionDetonate(ExplosionEvent.Detonate event) {
}
}
}

@SubscribeEvent
public void onWorldLoad(WorldEvent.Load event) {
if (!event.world.isRemote) {
int dimensionId = event.world.provider.dimensionId;
MinecraftServer server = MinecraftServer.getServer();
if (!ChunkLoaderManager.instance.isGenerating()
&& ChunkLoaderManager.instance.initializeFromPregeneratorFiles(server, dimensionId)) {
ServerUtilities.LOGGER.info("Pregenerator loaded and running for dimension Id: " + dimensionId);
}
}
}

@SubscribeEvent
public void onWorldUnload(WorldEvent.Unload event) {
if (!event.world.isRemote) {
if (event.world.provider.dimensionId == ChunkLoaderManager.instance.getDimensionID()
&& ChunkLoaderManager.instance.isGenerating()) {
ChunkLoaderManager.instance.reset(false);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package serverutils.lib.util.misc;

public class PregeneratorCommandInfo {

private final double xLoc;
private final double zLoc;
private final int radius;
private final int dimensionID;
private final int iteration;

public PregeneratorCommandInfo(double xLoc, double zLoc, int radius, int dimensionID, int iteration) {
this.xLoc = xLoc;
this.zLoc = zLoc;
this.radius = radius;
this.iteration = iteration;
this.dimensionID = dimensionID;
}

public PregeneratorCommandInfo(double xLoc, double zLoc, int radius, int dimensionID) {
this(xLoc, zLoc, radius, dimensionID, -1);
}

public double getXLoc() {
return xLoc;
}

public double getZLoc() {
return zLoc;
}

public int getRadius() {
return radius;
}

public int getIteration() {
return this.iteration;
}

public int getDimensionID() {
return this.dimensionID;
}
}
35 changes: 35 additions & 0 deletions src/main/java/serverutils/pregenerator/ChunkLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package serverutils.pregenerator;

import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.unpackX;
import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.unpackZ;

import net.minecraft.server.MinecraftServer;
import net.minecraft.world.gen.ChunkProviderServer;

import serverutils.ServerUtilities;
import serverutils.pregenerator.filemanager.PregeneratorFileManager;

public class ChunkLoader {

private PregeneratorFileManager fileManager;
private int loadIteration = 0;

public ChunkLoader(PregeneratorFileManager fileManager) {
this.fileManager = fileManager;
}

public void processLoadChunk(MinecraftServer server, int dimensionId, Long chunk) {
int x = unpackX(chunk);
int z = unpackZ(chunk);

ChunkProviderServer cps = server.worldServerForDimension(dimensionId).theChunkProviderServer;
cps.loadChunk(x, z, () -> {
ChunkLoaderManager.instance.removeChunkFromList();
this.fileManager.saveIteration(ChunkLoaderManager.instance.getChunkToLoadSize());
loadIteration++;
if (loadIteration % 100 == 0) {
ServerUtilities.LOGGER.info(ChunkLoaderManager.instance.progressString());
}
});
}
}
Loading