package net.minecraft.server.integrated;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.util.concurrent.Callable;
import net.minecraft.client.ClientBrandRetriever;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ThreadLanServerPing;
import net.minecraft.crash.CrashReport;
import net.minecraft.profiler.PlayerUsageSnooper;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.CryptManager;
import net.minecraft.util.HttpUtil;
import net.minecraft.world.EnumDifficulty;
import net.minecraft.world.WorldManager;
import net.minecraft.world.WorldServer;
import net.minecraft.world.WorldServerMulti;
import net.minecraft.world.WorldSettings;
import net.minecraft.world.WorldType;
import net.minecraft.world.demo.DemoWorldServer;
import net.minecraft.world.storage.ISaveHandler;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.world.WorldEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@SideOnly(Side.CLIENT)
public class IntegratedServer extends MinecraftServer
{
private static final Logger logger = LogManager.getLogger();
/** The Minecraft instance. */
private final Minecraft mc;
private final WorldSettings theWorldSettings;
private boolean isGamePaused;
private boolean isPublic;
private ThreadLanServerPing lanServerPing;
private static final String __OBFID = "CL_00001129";
public IntegratedServer(Minecraft p_i1317_1_, String p_i1317_2_, String p_i1317_3_, WorldSettings p_i1317_4_)
{
super(new File(p_i1317_1_.mcDataDir, "saves"), p_i1317_1_.getProxy());
this.setServerOwner(p_i1317_1_.getSession().getUsername());
this.setFolderName(p_i1317_2_);
this.setWorldName(p_i1317_3_);
this.setDemo(p_i1317_1_.isDemo());
this.canCreateBonusChest(p_i1317_4_.isBonusChestEnabled());
this.setBuildLimit(256);
this.setConfigManager(new IntegratedPlayerList(this));
this.mc = p_i1317_1_;
this.theWorldSettings = p_i1317_4_;
}
protected void loadAllWorlds(String p_71247_1_, String p_71247_2_, long p_71247_3_, WorldType p_71247_5_, String p_71247_6_)
{
this.convertMapIfNeeded(p_71247_1_);
ISaveHandler isavehandler = this.getActiveAnvilConverter().getSaveLoader(p_71247_1_, true);
WorldServer overWorld = (isDemo() ? new DemoWorldServer(this, isavehandler, p_71247_2_, 0, theProfiler) : new WorldServer(this, isavehandler, p_71247_2_, 0, theWorldSettings, theProfiler));
for (int dim : DimensionManager.getStaticDimensionIDs())
{
WorldServer world = (dim == 0 ? overWorld : new WorldServerMulti(this, isavehandler, p_71247_2_, dim, theWorldSettings, overWorld, theProfiler));
world.addWorldAccess(new WorldManager(this, world));
if (!this.isSinglePlayer())
{
world.getWorldInfo().setGameType(getGameType());
}
MinecraftForge.EVENT_BUS.post(new WorldEvent.Load(world));
}
this.getConfigurationManager().setPlayerManager(new WorldServer[]{ overWorld });
this.setDifficultyForAllWorlds(this.getDifficulty());
this.initialWorldChunkLoad();
}
/**
* Initialises the server and starts it.
*/
protected boolean startServer() throws IOException
{
logger.info("Starting integrated minecraft server version 1.7.10");
this.setOnlineMode(true);
this.setCanSpawnAnimals(true);
this.setCanSpawnNPCs(true);
this.setAllowPvp(true);
this.setAllowFlight(true);
logger.info("Generating keypair");
this.setKeyPair(CryptManager.generateKeyPair());
if (!FMLCommonHandler.instance().handleServerAboutToStart(this)) { return false; }
this.loadAllWorlds(this.getFolderName(), this.getWorldName(), this.theWorldSettings.getSeed(), this.theWorldSettings.getTerrainType(), this.theWorldSettings.func_82749_j());
this.setMOTD(this.getServerOwner() + " - " + this.worldServers[0].getWorldInfo().getWorldName());
return FMLCommonHandler.instance().handleServerStarting(this);
}
/**
* Main function called by run() every loop.
*/
public void tick()
{
boolean flag = this.isGamePaused;
this.isGamePaused = Minecraft.getMinecraft().getNetHandler() != null && Minecraft.getMinecraft().isGamePaused();
if (!flag && this.isGamePaused)
{
logger.info("Saving and pausing game...");
this.getConfigurationManager().saveAllPlayerData();
this.saveAllWorlds(false);
}
if (!this.isGamePaused)
{
super.tick();
if (this.mc.gameSettings.renderDistanceChunks != this.getConfigurationManager().getViewDistance())
{
logger.info("Changing view distance to {}, from {}", new Object[] {Integer.valueOf(this.mc.gameSettings.renderDistanceChunks), Integer.valueOf(this.getConfigurationManager().getViewDistance())});
this.getConfigurationManager().setViewDistance(this.mc.gameSettings.renderDistanceChunks);
}
}
}
public boolean canStructuresSpawn()
{
return false;
}
public WorldSettings.GameType getGameType()
{
return this.theWorldSettings.getGameType();
}
/**
* Get the server's difficulty
*/
public EnumDifficulty getDifficulty()
{
return this.mc.gameSettings.difficulty;
}
/**
* Defaults to false.
*/
public boolean isHardcore()
{
return this.theWorldSettings.getHardcoreEnabled();
}
public boolean func_152363_m()
{
return false;
}
protected File getDataDirectory()
{
return this.mc.mcDataDir;
}
public boolean isDedicatedServer()
{
return false;
}
/**
* Called on exit from the main run() loop.
*/
protected void finalTick(CrashReport report)
{
this.mc.crashed(report);
}
/**
* Adds the server info, including from theWorldServer, to the crash report.
*/
public CrashReport addServerInfoToCrashReport(CrashReport report)
{
report = super.addServerInfoToCrashReport(report);
report.getCategory().addCrashSectionCallable("Type", new Callable()
{
private static final String __OBFID = "CL_00001130";
public String call()
{
return "Integrated Server (map_client.txt)";
}
});
report.getCategory().addCrashSectionCallable("Is Modded", new Callable()
{
private static final String __OBFID = "CL_00001131";
public String call()
{
String s = ClientBrandRetriever.getClientModName();
if (!s.equals("vanilla"))
{
return "Definitely; Client brand changed to \'" + s + "\'";
}
else
{
s = IntegratedServer.this.getServerModName();
return !s.equals("vanilla") ? "Definitely; Server brand changed to \'" + s + "\'" : (Minecraft.class.getSigners() == null ? "Very likely; Jar signature invalidated" : "Probably not. Jar signature remains and both client + server brands are untouched.");
}
}
});
return report;
}
public void addServerStatsToSnooper(PlayerUsageSnooper playerSnooper)
{
super.addServerStatsToSnooper(playerSnooper);
playerSnooper.addClientStat("snooper_partner", this.mc.getPlayerUsageSnooper().getUniqueID());
}
/**
* Returns whether snooping is enabled or not.
*/
public boolean isSnooperEnabled()
{
return Minecraft.getMinecraft().isSnooperEnabled();
}
/**
* On dedicated does nothing. On integrated, sets commandsAllowedForAll, gameType and allows external connections.
*/
public String shareToLAN(WorldSettings.GameType type, boolean allowCheats)
{
try
{
int i = -1;
try
{
i = HttpUtil.getSuitableLanPort();
}
catch (IOException ioexception)
{
;
}
if (i <= 0)
{
i = 25564;
}
this.getNetworkSystem().addLanEndpoint((InetAddress)null, i);
logger.info("Started on " + i);
this.isPublic = true;
this.lanServerPing = new ThreadLanServerPing(this.getMOTD(), i + "");
this.lanServerPing.start();
this.getConfigurationManager().func_152604_a(type);
this.getConfigurationManager().setCommandsAllowedForAll(allowCheats);
return i + "";
}
catch (IOException ioexception1)
{
return null;
}
}
/**
* Saves all necessary data as preparation for stopping the server.
*/
public void stopServer()
{
super.stopServer();
if (this.lanServerPing != null)
{
this.lanServerPing.interrupt();
this.lanServerPing = null;
}
}
/**
* Sets the serverRunning variable to false, in order to get the server to shut down.
*/
public void initiateShutdown()
{
super.initiateShutdown();
if (this.lanServerPing != null)
{
this.lanServerPing.interrupt();
this.lanServerPing = null;
}
}
/**
* Returns true if this integrated server is open to LAN
*/
public boolean getPublic()
{
return this.isPublic;
}
/**
* Sets the game type for all worlds.
*/
public void setGameType(WorldSettings.GameType gameMode)
{
this.getConfigurationManager().func_152604_a(gameMode);
}
/**
* Return whether command blocks are enabled.
*/
public boolean isCommandBlockEnabled()
{
return true;
}
public int getOpPermissionLevel()
{
return 4;
}
}