package net.minecraft.server.management; import cpw.mods.fml.common.network.FMLNetworkHandler; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.io.File; import java.net.SocketAddress; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemInWorldManager; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.INetworkManager; import net.minecraft.network.NetServerHandler; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet16BlockItemSwitch; import net.minecraft.network.packet.Packet1Login; import net.minecraft.network.packet.Packet201PlayerInfo; import net.minecraft.network.packet.Packet202PlayerAbilities; import net.minecraft.network.packet.Packet209SetPlayerTeam; import net.minecraft.network.packet.Packet3Chat; import net.minecraft.network.packet.Packet41EntityEffect; import net.minecraft.network.packet.Packet43Experience; import net.minecraft.network.packet.Packet4UpdateTime; import net.minecraft.network.packet.Packet6SpawnPosition; import net.minecraft.network.packet.Packet70GameEvent; import net.minecraft.network.packet.Packet9Respawn; import net.minecraft.potion.PotionEffect; import net.minecraft.scoreboard.Score; import net.minecraft.scoreboard.ScoreObjective; import net.minecraft.scoreboard.ScorePlayerTeam; import net.minecraft.scoreboard.Scoreboard; import net.minecraft.scoreboard.ServerScoreboard; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraft.world.EnumGameType; import net.minecraft.world.Teleporter; import net.minecraft.world.World; import net.minecraft.world.WorldProvider; import net.minecraft.world.WorldServer; import net.minecraft.world.demo.DemoWorldManager; import net.minecraft.world.storage.IPlayerFileData; import net.minecraftforge.common.DimensionManager; public abstract class ServerConfigurationManager { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); /** Reference to the MinecraftServer object. */ private final MinecraftServer mcServer; /** A list of player entities that exist on this server. */ public final List playerEntityList = new ArrayList(); private final BanList bannedPlayers = new BanList(new File("banned-players.txt")); private final BanList bannedIPs = new BanList(new File("banned-ips.txt")); /** A set containing the OPs. */ private Set ops = new HashSet(); /** The Set of all whitelisted players. */ private Set whiteListedPlayers = new HashSet(); /** Reference to the PlayerNBTManager object. */ private IPlayerFileData playerNBTManagerObj; /** * Server setting to only allow OPs and whitelisted players to join the server. */ private boolean whiteListEnforced; /** The maximum number of players that can be connected at a time. */ protected int maxPlayers; protected int viewDistance; private EnumGameType gameType; /** True if all players are allowed to use commands (cheats). */ private boolean commandsAllowedForAll; /** * index into playerEntities of player to ping, updated every tick; currently hardcoded to max at 200 players */ private int playerPingIndex = 0; public ServerConfigurationManager(MinecraftServer par1MinecraftServer) { this.mcServer = par1MinecraftServer; this.bannedPlayers.setListActive(false); this.bannedIPs.setListActive(false); this.maxPlayers = 8; } public void initializeConnectionToPlayer(INetworkManager par1INetworkManager, EntityPlayerMP par2EntityPlayerMP) { NBTTagCompound nbttagcompound = this.readPlayerDataFromFile(par2EntityPlayerMP); par2EntityPlayerMP.setWorld(this.mcServer.worldServerForDimension(par2EntityPlayerMP.dimension)); par2EntityPlayerMP.theItemInWorldManager.setWorld((WorldServer)par2EntityPlayerMP.worldObj); String s = "local"; if (par1INetworkManager.getSocketAddress() != null) { s = par1INetworkManager.getSocketAddress().toString(); } this.mcServer.getLogAgent().logInfo(par2EntityPlayerMP.username + "[" + s + "] logged in with entity id " + par2EntityPlayerMP.entityId + " at (" + par2EntityPlayerMP.posX + ", " + par2EntityPlayerMP.posY + ", " + par2EntityPlayerMP.posZ + ")"); WorldServer worldserver = this.mcServer.worldServerForDimension(par2EntityPlayerMP.dimension); ChunkCoordinates chunkcoordinates = worldserver.getSpawnPoint(); this.func_72381_a(par2EntityPlayerMP, (EntityPlayerMP)null, worldserver); NetServerHandler netserverhandler = new NetServerHandler(this.mcServer, par1INetworkManager, par2EntityPlayerMP); netserverhandler.sendPacketToPlayer(new Packet1Login(par2EntityPlayerMP.entityId, worldserver.getWorldInfo().getTerrainType(), par2EntityPlayerMP.theItemInWorldManager.getGameType(), worldserver.getWorldInfo().isHardcoreModeEnabled(), worldserver.provider.dimensionId, worldserver.difficultySetting, worldserver.getHeight(), this.getMaxPlayers())); netserverhandler.sendPacketToPlayer(new Packet6SpawnPosition(chunkcoordinates.posX, chunkcoordinates.posY, chunkcoordinates.posZ)); netserverhandler.sendPacketToPlayer(new Packet202PlayerAbilities(par2EntityPlayerMP.capabilities)); netserverhandler.sendPacketToPlayer(new Packet16BlockItemSwitch(par2EntityPlayerMP.inventory.currentItem)); this.func_96456_a((ServerScoreboard)worldserver.getScoreboard(), par2EntityPlayerMP); this.updateTimeAndWeatherForPlayer(par2EntityPlayerMP, worldserver); this.sendPacketToAllPlayers(new Packet3Chat(EnumChatFormatting.YELLOW + par2EntityPlayerMP.getTranslatedEntityName() + EnumChatFormatting.YELLOW + " joined the game.")); this.playerLoggedIn(par2EntityPlayerMP); netserverhandler.setPlayerLocation(par2EntityPlayerMP.posX, par2EntityPlayerMP.posY, par2EntityPlayerMP.posZ, par2EntityPlayerMP.rotationYaw, par2EntityPlayerMP.rotationPitch); this.mcServer.getNetworkThread().addPlayer(netserverhandler); netserverhandler.sendPacketToPlayer(new Packet4UpdateTime(worldserver.getTotalWorldTime(), worldserver.getWorldTime())); if (this.mcServer.getTexturePack().length() > 0) { par2EntityPlayerMP.requestTexturePackLoad(this.mcServer.getTexturePack(), this.mcServer.textureSize()); } Iterator iterator = par2EntityPlayerMP.getActivePotionEffects().iterator(); while (iterator.hasNext()) { PotionEffect potioneffect = (PotionEffect)iterator.next(); netserverhandler.sendPacketToPlayer(new Packet41EntityEffect(par2EntityPlayerMP.entityId, potioneffect)); } par2EntityPlayerMP.addSelfToInternalCraftingInventory(); FMLNetworkHandler.handlePlayerLogin(par2EntityPlayerMP, netserverhandler, par1INetworkManager); if (nbttagcompound != null && nbttagcompound.hasKey("Riding")) { Entity entity = EntityList.createEntityFromNBT(nbttagcompound.getCompoundTag("Riding"), worldserver); if (entity != null) { entity.field_98038_p = true; worldserver.spawnEntityInWorld(entity); par2EntityPlayerMP.mountEntity(entity); entity.field_98038_p = false; } } } protected void func_96456_a(ServerScoreboard par1ServerScoreboard, EntityPlayerMP par2EntityPlayerMP) { HashSet hashset = new HashSet(); Iterator iterator = par1ServerScoreboard.func_96525_g().iterator(); while (iterator.hasNext()) { ScorePlayerTeam scoreplayerteam = (ScorePlayerTeam)iterator.next(); par2EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet209SetPlayerTeam(scoreplayerteam, 0)); } for (int i = 0; i < 3; ++i) { ScoreObjective scoreobjective = par1ServerScoreboard.func_96539_a(i); if (scoreobjective != null && !hashset.contains(scoreobjective)) { List list = par1ServerScoreboard.func_96550_d(scoreobjective); Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { Packet packet = (Packet)iterator1.next(); par2EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(packet); } hashset.add(scoreobjective); } } } /** * Sets the NBT manager to the one for the WorldServer given. */ public void setPlayerManager(WorldServer[] par1ArrayOfWorldServer) { this.playerNBTManagerObj = par1ArrayOfWorldServer[0].getSaveHandler().getSaveHandler(); } public void func_72375_a(EntityPlayerMP par1EntityPlayerMP, WorldServer par2WorldServer) { WorldServer worldserver1 = par1EntityPlayerMP.getServerForPlayer(); if (par2WorldServer != null) { par2WorldServer.getPlayerManager().removePlayer(par1EntityPlayerMP); } worldserver1.getPlayerManager().addPlayer(par1EntityPlayerMP); worldserver1.theChunkProviderServer.loadChunk((int)par1EntityPlayerMP.posX >> 4, (int)par1EntityPlayerMP.posZ >> 4); } public int getEntityViewDistance() { return PlayerManager.getFurthestViewableBlock(this.getViewDistance()); } /** * called during player login. reads the player information from disk. */ public NBTTagCompound readPlayerDataFromFile(EntityPlayerMP par1EntityPlayerMP) { NBTTagCompound nbttagcompound = this.mcServer.worldServers[0].getWorldInfo().getPlayerNBTTagCompound(); NBTTagCompound nbttagcompound1; if (par1EntityPlayerMP.getCommandSenderName().equals(this.mcServer.getServerOwner()) && nbttagcompound != null) { par1EntityPlayerMP.readFromNBT(nbttagcompound); nbttagcompound1 = nbttagcompound; System.out.println("loading single player"); } else { nbttagcompound1 = this.playerNBTManagerObj.readPlayerData(par1EntityPlayerMP); } return nbttagcompound1; } /** * also stores the NBTTags if this is an intergratedPlayerList */ protected void writePlayerData(EntityPlayerMP par1EntityPlayerMP) { this.playerNBTManagerObj.writePlayerData(par1EntityPlayerMP); } /** * Called when a player successfully logs in. Reads player data from disk and inserts the player into the world. */ public void playerLoggedIn(EntityPlayerMP par1EntityPlayerMP) { this.sendPacketToAllPlayers(new Packet201PlayerInfo(par1EntityPlayerMP.username, true, 1000)); this.playerEntityList.add(par1EntityPlayerMP); WorldServer worldserver = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension); worldserver.spawnEntityInWorld(par1EntityPlayerMP); this.func_72375_a(par1EntityPlayerMP, (WorldServer)null); for (int i = 0; i < this.playerEntityList.size(); ++i) { EntityPlayerMP entityplayermp1 = (EntityPlayerMP)this.playerEntityList.get(i); par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet201PlayerInfo(entityplayermp1.username, true, entityplayermp1.ping)); } } /** * using player's dimension, update their movement when in a vehicle (e.g. cart, boat) */ public void serverUpdateMountedMovingPlayer(EntityPlayerMP par1EntityPlayerMP) { par1EntityPlayerMP.getServerForPlayer().getPlayerManager().updateMountedMovingPlayer(par1EntityPlayerMP); } /** * Called when a player disconnects from the game. Writes player data to disk and removes them from the world. */ public void playerLoggedOut(EntityPlayerMP par1EntityPlayerMP) { GameRegistry.onPlayerLogout(par1EntityPlayerMP); this.writePlayerData(par1EntityPlayerMP); WorldServer worldserver = par1EntityPlayerMP.getServerForPlayer(); if (par1EntityPlayerMP.ridingEntity != null) { worldserver.removeEntity(par1EntityPlayerMP.ridingEntity); System.out.println("removing player mount"); } worldserver.removeEntity(par1EntityPlayerMP); worldserver.getPlayerManager().removePlayer(par1EntityPlayerMP); this.playerEntityList.remove(par1EntityPlayerMP); this.sendPacketToAllPlayers(new Packet201PlayerInfo(par1EntityPlayerMP.username, false, 9999)); } /** * checks ban-lists, then white-lists, then space for the server. Returns null on success, or an error message */ public String allowUserToConnect(SocketAddress par1SocketAddress, String par2Str) { if (this.bannedPlayers.isBanned(par2Str)) { BanEntry banentry = (BanEntry)this.bannedPlayers.getBannedList().get(par2Str); String s1 = "You are banned from this server!\nReason: " + banentry.getBanReason(); if (banentry.getBanEndDate() != null) { s1 = s1 + "\nYour ban will be removed on " + dateFormat.format(banentry.getBanEndDate()); } return s1; } else if (!this.isAllowedToLogin(par2Str)) { return "You are not white-listed on this server!"; } else { String s2 = par1SocketAddress.toString(); s2 = s2.substring(s2.indexOf("/") + 1); s2 = s2.substring(0, s2.indexOf(":")); if (this.bannedIPs.isBanned(s2)) { BanEntry banentry1 = (BanEntry)this.bannedIPs.getBannedList().get(s2); String s3 = "Your IP address is banned from this server!\nReason: " + banentry1.getBanReason(); if (banentry1.getBanEndDate() != null) { s3 = s3 + "\nYour ban will be removed on " + dateFormat.format(banentry1.getBanEndDate()); } return s3; } else { return this.playerEntityList.size() >= this.maxPlayers ? "The server is full!" : null; } } } /** * also checks for multiple logins */ public EntityPlayerMP createPlayerForUser(String par1Str) { ArrayList arraylist = new ArrayList(); EntityPlayerMP entityplayermp; for (int i = 0; i < this.playerEntityList.size(); ++i) { entityplayermp = (EntityPlayerMP)this.playerEntityList.get(i); if (entityplayermp.username.equalsIgnoreCase(par1Str)) { arraylist.add(entityplayermp); } } Iterator iterator = arraylist.iterator(); while (iterator.hasNext()) { entityplayermp = (EntityPlayerMP)iterator.next(); entityplayermp.playerNetServerHandler.kickPlayerFromServer("You logged in from another location"); } Object object; if (this.mcServer.isDemo()) { object = new DemoWorldManager(this.mcServer.worldServerForDimension(0)); } else { object = new ItemInWorldManager(this.mcServer.worldServerForDimension(0)); } return new EntityPlayerMP(this.mcServer, this.mcServer.worldServerForDimension(0), par1Str, (ItemInWorldManager)object); } /** * creates and returns a respawned player based on the provided PlayerEntity. Args are the PlayerEntityMP to * respawn, an INT for the dimension to respawn into (usually 0), and a boolean value that is true if the player * beat the game rather than dying */ public EntityPlayerMP respawnPlayer(EntityPlayerMP par1EntityPlayerMP, int par2, boolean par3) { World world = mcServer.worldServerForDimension(par2); if (world == null) { par2 = 0; } else if (!world.provider.canRespawnHere()) { par2 = world.provider.getRespawnDimension(par1EntityPlayerMP); } par1EntityPlayerMP.getServerForPlayer().getEntityTracker().removePlayerFromTrackers(par1EntityPlayerMP); par1EntityPlayerMP.getServerForPlayer().getEntityTracker().removeEntityFromAllTrackingPlayers(par1EntityPlayerMP); par1EntityPlayerMP.getServerForPlayer().getPlayerManager().removePlayer(par1EntityPlayerMP); this.playerEntityList.remove(par1EntityPlayerMP); this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension).removePlayerEntityDangerously(par1EntityPlayerMP); ChunkCoordinates chunkcoordinates = par1EntityPlayerMP.getBedLocation(); boolean flag1 = par1EntityPlayerMP.isSpawnForced(); par1EntityPlayerMP.dimension = par2; Object object; if (this.mcServer.isDemo()) { object = new DemoWorldManager(this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension)); } else { object = new ItemInWorldManager(this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension)); } EntityPlayerMP entityplayermp1 = new EntityPlayerMP(this.mcServer, this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension), par1EntityPlayerMP.username, (ItemInWorldManager)object); entityplayermp1.playerNetServerHandler = par1EntityPlayerMP.playerNetServerHandler; entityplayermp1.clonePlayer(par1EntityPlayerMP, par3); entityplayermp1.dimension = par2; entityplayermp1.entityId = par1EntityPlayerMP.entityId; WorldServer worldserver = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension); this.func_72381_a(entityplayermp1, par1EntityPlayerMP, worldserver); ChunkCoordinates chunkcoordinates1; if (chunkcoordinates != null) { chunkcoordinates1 = EntityPlayer.verifyRespawnCoordinates(this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension), chunkcoordinates, flag1); if (chunkcoordinates1 != null) { entityplayermp1.setLocationAndAngles((double)((float)chunkcoordinates1.posX + 0.5F), (double)((float)chunkcoordinates1.posY + 0.1F), (double)((float)chunkcoordinates1.posZ + 0.5F), 0.0F, 0.0F); entityplayermp1.setSpawnChunk(chunkcoordinates, flag1); } else { entityplayermp1.playerNetServerHandler.sendPacketToPlayer(new Packet70GameEvent(0, 0)); } } worldserver.theChunkProviderServer.loadChunk((int)entityplayermp1.posX >> 4, (int)entityplayermp1.posZ >> 4); while (!worldserver.getCollidingBoundingBoxes(entityplayermp1, entityplayermp1.boundingBox).isEmpty()) { entityplayermp1.setPosition(entityplayermp1.posX, entityplayermp1.posY + 1.0D, entityplayermp1.posZ); } entityplayermp1.playerNetServerHandler.sendPacketToPlayer(new Packet9Respawn(entityplayermp1.dimension, (byte)entityplayermp1.worldObj.difficultySetting, entityplayermp1.worldObj.getWorldInfo().getTerrainType(), entityplayermp1.worldObj.getHeight(), entityplayermp1.theItemInWorldManager.getGameType())); chunkcoordinates1 = worldserver.getSpawnPoint(); entityplayermp1.playerNetServerHandler.setPlayerLocation(entityplayermp1.posX, entityplayermp1.posY, entityplayermp1.posZ, entityplayermp1.rotationYaw, entityplayermp1.rotationPitch); entityplayermp1.playerNetServerHandler.sendPacketToPlayer(new Packet6SpawnPosition(chunkcoordinates1.posX, chunkcoordinates1.posY, chunkcoordinates1.posZ)); entityplayermp1.playerNetServerHandler.sendPacketToPlayer(new Packet43Experience(entityplayermp1.experience, entityplayermp1.experienceTotal, entityplayermp1.experienceLevel)); this.updateTimeAndWeatherForPlayer(entityplayermp1, worldserver); worldserver.getPlayerManager().addPlayer(entityplayermp1); worldserver.spawnEntityInWorld(entityplayermp1); this.playerEntityList.add(entityplayermp1); entityplayermp1.addSelfToInternalCraftingInventory(); entityplayermp1.setEntityHealth(entityplayermp1.getHealth()); GameRegistry.onPlayerRespawn(entityplayermp1); return entityplayermp1; } public void transferPlayerToDimension(EntityPlayerMP par1EntityPlayerMP, int par2) { transferPlayerToDimension(par1EntityPlayerMP, par2, mcServer.worldServerForDimension(par2).getDefaultTeleporter()); } public void transferPlayerToDimension(EntityPlayerMP par1EntityPlayerMP, int par2, Teleporter teleporter) { int j = par1EntityPlayerMP.dimension; WorldServer worldserver = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension); par1EntityPlayerMP.dimension = par2; WorldServer worldserver1 = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension); par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet9Respawn(par1EntityPlayerMP.dimension, (byte)par1EntityPlayerMP.worldObj.difficultySetting, worldserver1.getWorldInfo().getTerrainType(), worldserver1.getHeight(), par1EntityPlayerMP.theItemInWorldManager.getGameType())); worldserver.removePlayerEntityDangerously(par1EntityPlayerMP); par1EntityPlayerMP.isDead = false; this.transferEntityToWorld(par1EntityPlayerMP, j, worldserver, worldserver1, teleporter); this.func_72375_a(par1EntityPlayerMP, worldserver); par1EntityPlayerMP.playerNetServerHandler.setPlayerLocation(par1EntityPlayerMP.posX, par1EntityPlayerMP.posY, par1EntityPlayerMP.posZ, par1EntityPlayerMP.rotationYaw, par1EntityPlayerMP.rotationPitch); par1EntityPlayerMP.theItemInWorldManager.setWorld(worldserver1); this.updateTimeAndWeatherForPlayer(par1EntityPlayerMP, worldserver1); this.syncPlayerInventory(par1EntityPlayerMP); Iterator iterator = par1EntityPlayerMP.getActivePotionEffects().iterator(); while (iterator.hasNext()) { PotionEffect potioneffect = (PotionEffect)iterator.next(); par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet41EntityEffect(par1EntityPlayerMP.entityId, potioneffect)); } GameRegistry.onPlayerChangedDimension(par1EntityPlayerMP); } /** * Transfers an entity from a world to another world. */ public void transferEntityToWorld(Entity par1Entity, int par2, WorldServer par3WorldServer, WorldServer par4WorldServer) { transferEntityToWorld(par1Entity, par2, par3WorldServer, par4WorldServer, par4WorldServer.getDefaultTeleporter()); } public void transferEntityToWorld(Entity par1Entity, int par2, WorldServer par3WorldServer, WorldServer par4WorldServer, Teleporter teleporter) { WorldProvider pOld = par3WorldServer.provider; WorldProvider pNew = par4WorldServer.provider; double moveFactor = pOld.getMovementFactor() / pNew.getMovementFactor(); double d0 = par1Entity.posX * moveFactor; double d1 = par1Entity.posZ * moveFactor; double d3 = par1Entity.posX; double d4 = par1Entity.posY; double d5 = par1Entity.posZ; float f = par1Entity.rotationYaw; par3WorldServer.theProfiler.startSection("moving"); if (par1Entity.dimension == 1) { ChunkCoordinates chunkcoordinates; if (par2 == 1) { chunkcoordinates = par4WorldServer.getSpawnPoint(); } else { chunkcoordinates = par4WorldServer.getEntrancePortalLocation(); } d0 = (double)chunkcoordinates.posX; par1Entity.posY = (double)chunkcoordinates.posY; d1 = (double)chunkcoordinates.posZ; par1Entity.setLocationAndAngles(d0, par1Entity.posY, d1, 90.0F, 0.0F); if (par1Entity.isEntityAlive()) { par3WorldServer.updateEntityWithOptionalForce(par1Entity, false); } } par3WorldServer.theProfiler.endSection(); if (par2 != 1) { par3WorldServer.theProfiler.startSection("placing"); d0 = (double)MathHelper.clamp_int((int)d0, -29999872, 29999872); d1 = (double)MathHelper.clamp_int((int)d1, -29999872, 29999872); if (par1Entity.isEntityAlive()) { par4WorldServer.spawnEntityInWorld(par1Entity); par1Entity.setLocationAndAngles(d0, par1Entity.posY, d1, par1Entity.rotationYaw, par1Entity.rotationPitch); par4WorldServer.updateEntityWithOptionalForce(par1Entity, false); teleporter.placeInPortal(par1Entity, d3, d4, d5, f); } par3WorldServer.theProfiler.endSection(); } par1Entity.setWorld(par4WorldServer); } /** * sends 1 player per tick, but only sends a player once every 600 ticks */ public void sendPlayerInfoToAllPlayers() { if (++this.playerPingIndex > 600) { this.playerPingIndex = 0; } if (this.playerPingIndex < this.playerEntityList.size()) { EntityPlayerMP entityplayermp = (EntityPlayerMP)this.playerEntityList.get(this.playerPingIndex); this.sendPacketToAllPlayers(new Packet201PlayerInfo(entityplayermp.username, true, entityplayermp.ping)); } } /** * sends a packet to all players */ public void sendPacketToAllPlayers(Packet par1Packet) { for (int i = 0; i < this.playerEntityList.size(); ++i) { ((EntityPlayerMP)this.playerEntityList.get(i)).playerNetServerHandler.sendPacketToPlayer(par1Packet); } } /** * Sends a packet to all players in the specified Dimension */ public void sendPacketToAllPlayersInDimension(Packet par1Packet, int par2) { for (int j = 0; j < this.playerEntityList.size(); ++j) { EntityPlayerMP entityplayermp = (EntityPlayerMP)this.playerEntityList.get(j); if (entityplayermp.dimension == par2) { entityplayermp.playerNetServerHandler.sendPacketToPlayer(par1Packet); } } } /** * returns a string containing a comma-seperated list of player names */ public String getPlayerListAsString() { String s = ""; for (int i = 0; i < this.playerEntityList.size(); ++i) { if (i > 0) { s = s + ", "; } s = s + ((EntityPlayerMP)this.playerEntityList.get(i)).username; } return s; } /** * Returns an array of the usernames of all the connected players. */ public String[] getAllUsernames() { String[] astring = new String[this.playerEntityList.size()]; for (int i = 0; i < this.playerEntityList.size(); ++i) { astring[i] = ((EntityPlayerMP)this.playerEntityList.get(i)).username; } return astring; } public BanList getBannedPlayers() { return this.bannedPlayers; } public BanList getBannedIPs() { return this.bannedIPs; } /** * This adds a username to the ops list, then saves the op list */ public void addOp(String par1Str) { this.ops.add(par1Str.toLowerCase()); } /** * This removes a username from the ops list, then saves the op list */ public void removeOp(String par1Str) { this.ops.remove(par1Str.toLowerCase()); } /** * Determine if the player is allowed to connect based on current server settings. */ public boolean isAllowedToLogin(String par1Str) { par1Str = par1Str.trim().toLowerCase(); return !this.whiteListEnforced || this.ops.contains(par1Str) || this.whiteListedPlayers.contains(par1Str); } /** * Returns true if the specific player is allowed to use commands. */ public boolean areCommandsAllowed(String par1Str) { return this.ops.contains(par1Str.trim().toLowerCase()) || this.mcServer.isSinglePlayer() && this.mcServer.worldServers[0].getWorldInfo().areCommandsAllowed() && this.mcServer.getServerOwner().equalsIgnoreCase(par1Str) || this.commandsAllowedForAll; } public EntityPlayerMP getPlayerForUsername(String par1Str) { Iterator iterator = this.playerEntityList.iterator(); EntityPlayerMP entityplayermp; do { if (!iterator.hasNext()) { return null; } entityplayermp = (EntityPlayerMP)iterator.next(); } while (!entityplayermp.username.equalsIgnoreCase(par1Str)); return entityplayermp; } /** * Find all players in a specified range and narrowing down by other parameters */ public List findPlayers(ChunkCoordinates par1ChunkCoordinates, int par2, int par3, int par4, int par5, int par6, int par7, Map par8Map, String par9Str, String par10Str) { if (this.playerEntityList.isEmpty()) { return null; } else { Object object = new ArrayList(); boolean flag = par4 < 0; int k1 = par2 * par2; int l1 = par3 * par3; par4 = MathHelper.abs_int(par4); for (int i2 = 0; i2 < this.playerEntityList.size(); ++i2) { EntityPlayerMP entityplayermp = (EntityPlayerMP)this.playerEntityList.get(i2); boolean flag1; if (par9Str != null) { flag1 = par9Str.startsWith("!"); if (flag1) { par9Str = par9Str.substring(1); } if (flag1 == par9Str.equalsIgnoreCase(entityplayermp.getEntityName())) { continue; } } if (par10Str != null) { flag1 = par10Str.startsWith("!"); if (flag1) { par10Str = par10Str.substring(1); } ScorePlayerTeam scoreplayerteam = entityplayermp.getTeam(); String s2 = scoreplayerteam == null ? "" : scoreplayerteam.func_96661_b(); if (flag1 == par10Str.equalsIgnoreCase(s2)) { continue; } } if (par1ChunkCoordinates != null && (par2 > 0 || par3 > 0)) { float f = par1ChunkCoordinates.getDistanceSquaredToChunkCoordinates(entityplayermp.getPlayerCoordinates()); if (par2 > 0 && f < (float)k1 || par3 > 0 && f > (float)l1) { continue; } } if (this.func_96457_a(entityplayermp, par8Map) && (par5 == EnumGameType.NOT_SET.getID() || par5 == entityplayermp.theItemInWorldManager.getGameType().getID()) && (par6 <= 0 || entityplayermp.experienceLevel >= par6) && entityplayermp.experienceLevel <= par7) { ((List)object).add(entityplayermp); } } if (par1ChunkCoordinates != null) { Collections.sort((List)object, new PlayerPositionComparator(par1ChunkCoordinates)); } if (flag) { Collections.reverse((List)object); } if (par4 > 0) { object = ((List)object).subList(0, Math.min(par4, ((List)object).size())); } return (List)object; } } private boolean func_96457_a(EntityPlayer par1EntityPlayer, Map par2Map) { if (par2Map != null && par2Map.size() != 0) { Iterator iterator = par2Map.entrySet().iterator(); Entry entry; boolean flag; int i; do { if (!iterator.hasNext()) { return true; } entry = (Entry)iterator.next(); String s = (String)entry.getKey(); flag = false; if (s.endsWith("_min") && s.length() > 4) { flag = true; s = s.substring(0, s.length() - 4); } Scoreboard scoreboard = par1EntityPlayer.getWorldScoreboard(); ScoreObjective scoreobjective = scoreboard.getObjective(s); if (scoreobjective == null) { return false; } Score score = par1EntityPlayer.getWorldScoreboard().func_96529_a(par1EntityPlayer.getEntityName(), scoreobjective); i = score.func_96652_c(); if (i < ((Integer)entry.getValue()).intValue() && flag) { return false; } } while (i <= ((Integer)entry.getValue()).intValue() || flag); return false; } else { return true; } } /** * params: x,y,z,d,dimension. The packet is sent to all players within d distance of x,y,z (d^2<x^2+y^2+z^2) */ public void sendToAllNear(double par1, double par3, double par5, double par7, int par9, Packet par10Packet) { this.sendToAllNearExcept((EntityPlayer)null, par1, par3, par5, par7, par9, par10Packet); } /** * params: srcPlayer,x,y,z,d,dimension. The packet is not sent to the srcPlayer, but all other players where * dx*dx+dy*dy+dz*dz<d*d */ public void sendToAllNearExcept(EntityPlayer par1EntityPlayer, double par2, double par4, double par6, double par8, int par10, Packet par11Packet) { for (int j = 0; j < this.playerEntityList.size(); ++j) { EntityPlayerMP entityplayermp = (EntityPlayerMP)this.playerEntityList.get(j); if (entityplayermp != par1EntityPlayer && entityplayermp.dimension == par10) { double d4 = par2 - entityplayermp.posX; double d5 = par4 - entityplayermp.posY; double d6 = par6 - entityplayermp.posZ; if (d4 * d4 + d5 * d5 + d6 * d6 < par8 * par8) { entityplayermp.playerNetServerHandler.sendPacketToPlayer(par11Packet); } } } } /** * Saves all of the players' current states. */ public void saveAllPlayerData() { for (int i = 0; i < this.playerEntityList.size(); ++i) { this.writePlayerData((EntityPlayerMP)this.playerEntityList.get(i)); } } /** * Add the specified player to the white list. */ public void addToWhiteList(String par1Str) { this.whiteListedPlayers.add(par1Str); } /** * Remove the specified player from the whitelist. */ public void removeFromWhitelist(String par1Str) { this.whiteListedPlayers.remove(par1Str); } /** * Returns the whitelisted players. */ public Set getWhiteListedPlayers() { return this.whiteListedPlayers; } public Set getOps() { return this.ops; } /** * Either does nothing, or calls readWhiteList. */ public void loadWhiteList() {} /** * Updates the time and weather for the given player to those of the given world */ public void updateTimeAndWeatherForPlayer(EntityPlayerMP par1EntityPlayerMP, WorldServer par2WorldServer) { par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet4UpdateTime(par2WorldServer.getTotalWorldTime(), par2WorldServer.getWorldTime())); if (par2WorldServer.isRaining()) { par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet70GameEvent(1, 0)); } } /** * sends the players inventory to himself */ public void syncPlayerInventory(EntityPlayerMP par1EntityPlayerMP) { par1EntityPlayerMP.sendContainerToPlayer(par1EntityPlayerMP.inventoryContainer); par1EntityPlayerMP.setPlayerHealthUpdated(); par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet16BlockItemSwitch(par1EntityPlayerMP.inventory.currentItem)); } /** * Returns the number of players currently on the server. */ public int getCurrentPlayerCount() { return this.playerEntityList.size(); } /** * Returns the maximum number of players allowed on the server. */ public int getMaxPlayers() { return this.maxPlayers; } /** * Returns an array of usernames for which player.dat exists for. */ public String[] getAvailablePlayerDat() { return this.mcServer.worldServers[0].getSaveHandler().getSaveHandler().getAvailablePlayerDat(); } public boolean isWhiteListEnabled() { return this.whiteListEnforced; } public void setWhiteListEnabled(boolean par1) { this.whiteListEnforced = par1; } public List getPlayerList(String par1Str) { ArrayList arraylist = new ArrayList(); Iterator iterator = this.playerEntityList.iterator(); while (iterator.hasNext()) { EntityPlayerMP entityplayermp = (EntityPlayerMP)iterator.next(); if (entityplayermp.getPlayerIP().equals(par1Str)) { arraylist.add(entityplayermp); } } return arraylist; } /** * Gets the View Distance. */ public int getViewDistance() { return this.viewDistance; } public MinecraftServer getServerInstance() { return this.mcServer; } /** * On integrated servers, returns the host's player data to be written to level.dat. */ public NBTTagCompound getHostPlayerData() { return null; } @SideOnly(Side.CLIENT) public void setGameType(EnumGameType par1EnumGameType) { this.gameType = par1EnumGameType; } private void func_72381_a(EntityPlayerMP par1EntityPlayerMP, EntityPlayerMP par2EntityPlayerMP, World par3World) { if (par2EntityPlayerMP != null) { par1EntityPlayerMP.theItemInWorldManager.setGameType(par2EntityPlayerMP.theItemInWorldManager.getGameType()); } else if (this.gameType != null) { par1EntityPlayerMP.theItemInWorldManager.setGameType(this.gameType); } par1EntityPlayerMP.theItemInWorldManager.initializeGameType(par3World.getWorldInfo().getGameType()); } @SideOnly(Side.CLIENT) /** * Sets whether all players are allowed to use commands (cheats) on the server. */ public void setCommandsAllowedForAll(boolean par1) { this.commandsAllowedForAll = par1; } /** * Kicks everyone with "Server closed" as reason. */ public void removeAllPlayers() { while (!this.playerEntityList.isEmpty()) { ((EntityPlayerMP)this.playerEntityList.get(0)).playerNetServerHandler.kickPlayerFromServer("Server closed"); } } /** * Sends the given string to every player as chat message. */ public void sendChatMsg(String par1Str) { this.mcServer.logInfo(par1Str); this.sendPacketToAllPlayers(new Packet3Chat(par1Str)); } }