ForgePatch/forge/patches/minecraft_server/net/minecraft/server/MinecraftServer.java.patch
LexManos d2c7a856c1 Initial attempt at server side extra dimensions support.
Mods must register there dimensions on load, by calling DimensionManager.registerDimension(uniqueID, WorldProvier, boolean)
Mods are resposible for writing there own transporter blocks.
Initial commit, needs some more testing and design thoughts.
2012-02-24 02:38:16 -08:00

250 lines
9.7 KiB
Diff

--- ../src_base/minecraft_server/net/minecraft/server/MinecraftServer.java 0000-00-00 00:00:00.000000000 -0000
+++ ../src_work/minecraft_server/net/minecraft/server/MinecraftServer.java 0000-00-00 00:00:00.000000000 -0000
@@ -7,6 +7,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
@@ -42,12 +43,14 @@
import net.minecraft.src.ThreadServerApplication;
import net.minecraft.src.ThreadSleepForever;
import net.minecraft.src.Vec3D;
+import net.minecraft.src.World;
import net.minecraft.src.WorldInfo;
import net.minecraft.src.WorldManager;
import net.minecraft.src.WorldProvider;
import net.minecraft.src.WorldServer;
import net.minecraft.src.WorldServerMulti;
import net.minecraft.src.WorldSettings;
+import net.minecraft.src.forge.DimensionManager;
public class MinecraftServer
implements Runnable, ICommandListener, IServer
@@ -58,9 +61,10 @@
private int serverPort;
public NetworkListenThread networkServer;
public PropertyManager propertyManagerObj;
- public WorldServer worldMngr[];
+ //public WorldServer worldMngr[];
public long field_40027_f[];
- public long field_40028_g[][];
+ //public long field_40028_g[][];
+ public Hashtable<Integer, long[]> worldTickTimes = new Hashtable<Integer, long[]>();
public ServerConfigurationManager configManager;
private ConsoleCommandHandler commandHandler;
private boolean serverRunning;
@@ -70,7 +74,7 @@
public int percentDone;
private List playersOnline;
private List commands;
- public EntityTracker entityTracker[];
+ //public EntityTracker entityTracker[];
public boolean onlineMode;
public boolean spawnPeacefulMobs;
public boolean field_44002_p;
@@ -88,7 +92,7 @@
deathTime = 0;
playersOnline = new ArrayList();
commands = Collections.synchronizedList(new ArrayList());
- entityTracker = new EntityTracker[3];
+ //entityTracker = new EntityTracker[3];
new ThreadSleepForever(this);
}
@@ -143,9 +147,11 @@
logger.warning("To change this, set \"online-mode\" to \"true\" in the server.settings file.");
}
configManager = new ServerConfigurationManager(this);
+ /*
entityTracker[0] = new EntityTracker(this, 0);
entityTracker[1] = new EntityTracker(this, -1);
entityTracker[2] = new EntityTracker(this, 1);
+ */
long l = System.nanoTime();
String s = propertyManagerObj.getStringProperty("level-name", "world");
String s1 = propertyManagerObj.getStringProperty("level-seed", "");
@@ -196,46 +202,43 @@
logger.info("Converting map!");
isaveformat.convertMapFormat(s, new ConvertProgressUpdater(this));
}
- worldMngr = new WorldServer[3];
- field_40028_g = new long[worldMngr.length][100];
+ //worldMngr = new WorldServer[3];
+ //field_40028_g = new long[3][100];
int i = propertyManagerObj.getIntProperty("gamemode", 0);
i = WorldSettings.validGameType(i);
logger.info((new StringBuilder()).append("Default game type: ").append(i).toString());
boolean flag = propertyManagerObj.getBooleanProperty("generate-structures", true);
WorldSettings worldsettings = new WorldSettings(l, i, flag, false, enumworldtype);
SaveOldDir saveolddir = new SaveOldDir(new File("."), s, true);
- for (int j = 0; j < worldMngr.length; j++)
- {
- byte byte0 = 0;
- if (j == 1)
- {
- byte0 = -1;
- }
- if (j == 2)
- {
- byte0 = 1;
- }
- if (j == 0)
- {
- worldMngr[j] = new WorldServer(this, saveolddir, s, byte0, worldsettings);
- }
- else
- {
- worldMngr[j] = new WorldServerMulti(this, saveolddir, s, byte0, worldsettings, worldMngr[0]);
- }
- worldMngr[j].addWorldAccess(new WorldManager(this, worldMngr[j]));
- worldMngr[j].difficultySetting = propertyManagerObj.getIntProperty("difficulty", 1);
- worldMngr[j].setAllowedSpawnTypes(propertyManagerObj.getBooleanProperty("spawn-monsters", true), spawnPeacefulMobs);
- worldMngr[j].getWorldInfo().setGameType(i);
- configManager.setPlayerManager(worldMngr);
+
+ WorldServer overWorld = new WorldServer(this, saveolddir, s, 0, worldsettings);
+ overWorld.addWorldAccess(new WorldManager(this, overWorld));
+ overWorld.difficultySetting = propertyManagerObj.getIntProperty("difficulty", 1);
+ overWorld.setAllowedSpawnTypes(propertyManagerObj.getBooleanProperty("spawn-monsters", true), spawnPeacefulMobs);
+ overWorld.getWorldInfo().setGameType(i);
+ worldTickTimes.put(0, new long[100]);
+ configManager.setPlayerManager(new WorldServer[]{ overWorld });
+
+ for (Integer id : DimensionManager.getIDs())
+ {
+ if (id == 0)
+ {
+ continue;
+ }
+ WorldServer world = new WorldServerMulti(this, saveolddir, s, id, worldsettings, overWorld);
+ world.addWorldAccess(new WorldManager(this, overWorld));
+ world.difficultySetting = propertyManagerObj.getIntProperty("difficulty", 1);
+ world.setAllowedSpawnTypes(propertyManagerObj.getBooleanProperty("spawn-monsters", true), spawnPeacefulMobs);
+ world.getWorldInfo().setGameType(i);
+ worldTickTimes.put(id, new long[100]);
}
char c = \304;
long l1 = System.currentTimeMillis();
- for (int k = 0; k < 1; k++)
+ for (Integer id : DimensionManager.getIDs())
{
- logger.info((new StringBuilder()).append("Preparing start region for level ").append(k).toString());
- WorldServer worldserver = worldMngr[k];
+ logger.info("Preparing start region for level " + id);
+ WorldServer worldserver = (WorldServer)DimensionManager.getWorld(id);
ChunkCoordinates chunkcoordinates = worldserver.getSpawnPoint();
for (int i1 = -c; i1 <= c && serverRunning; i1 += 16)
{
@@ -278,9 +281,9 @@
private void saveServerWorld()
{
logger.info("Saving chunks");
- for (int i = 0; i < worldMngr.length; i++)
+ for (World world : DimensionManager.getWorlds())
{
- WorldServer worldserver = worldMngr[i];
+ WorldServer worldserver = (WorldServer)world;
worldserver.saveWorld(true, null);
worldserver.func_30006_w();
}
@@ -293,12 +296,12 @@
{
configManager.savePlayerStates();
}
- for (int i = 0; i < worldMngr.length; i++)
+ for (World worldserver : DimensionManager.getWorlds())
{
- WorldServer worldserver = worldMngr[i];
if (worldserver != null)
{
saveServerWorld();
+ break;
}
}
}
@@ -333,7 +336,7 @@
}
l1 += l3;
l = l2;
- if (worldMngr[0].isAllPlayersFullyAsleep())
+ if (((WorldServer)DimensionManager.getWorld(0)).isAllPlayersFullyAsleep())
{
doTick();
l1 = 0L;
@@ -426,12 +429,12 @@
AxisAlignedBB.clearBoundingBoxPool();
Vec3D.initialize();
deathTime++;
- for (int j = 0; j < worldMngr.length; j++)
+ for (Integer j : DimensionManager.getIDs())
{
long l1 = System.nanoTime();
if (j == 0 || propertyManagerObj.getBooleanProperty("allow-nether", true))
{
- WorldServer worldserver = worldMngr[j];
+ WorldServer worldserver = (WorldServer)DimensionManager.getWorld(j);
if (deathTime % 20 == 0)
{
configManager.sendPacketToAllPlayersInDimension(new Packet4UpdateTime(worldserver.getWorldTime()), worldserver.worldProvider.worldType);
@@ -440,14 +443,14 @@
while (worldserver.updatingLighting()) ;
worldserver.updateEntities();
}
- field_40028_g[j][deathTime % 100] = System.nanoTime() - l1;
+ worldTickTimes.get(j)[deathTime % 100] = System.nanoTime() - l1;
}
networkServer.handleNetworkListenThread();
configManager.onTick();
- for (int k = 0; k < entityTracker.length; k++)
+ for (World world : DimensionManager.getWorlds())
{
- entityTracker[k].updateTrackedEntities();
+ ((WorldServer)world).entityTracker.updateTrackedEntities();
}
for (int i1 = 0; i1 < playersOnline.size(); i1++)
@@ -525,34 +528,17 @@
public WorldServer getWorldManager(int i)
{
- if (i == -1)
- {
- return worldMngr[1];
- }
- if (i == 1)
- {
- return worldMngr[2];
- }
- else
+ WorldServer ret = (WorldServer)DimensionManager.getWorld(i);
+ if (ret == null)
{
- return worldMngr[0];
+ ret = (WorldServer)DimensionManager.getWorld(0);
}
+ return ret;
}
public EntityTracker getEntityTracker(int i)
{
- if (i == -1)
- {
- return entityTracker[1];
- }
- if (i == 1)
- {
- return entityTracker[2];
- }
- else
- {
- return entityTracker[0];
- }
+ return getWorldManager(i).entityTracker;
}
public int getIntProperty(String s, int i)