package net.minecraft.world; import com.google.common.base.Predicate; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.TreeSet; import java.util.UUID; import net.minecraft.block.Block; import net.minecraft.block.BlockEventData; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EntityTracker; import net.minecraft.entity.EnumCreatureType; import net.minecraft.entity.INpc; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.passive.EntityWaterMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.network.play.server.S19PacketEntityStatus; import net.minecraft.network.play.server.S24PacketBlockAction; import net.minecraft.network.play.server.S27PacketExplosion; import net.minecraft.network.play.server.S2APacketParticles; import net.minecraft.network.play.server.S2BPacketChangeGameState; import net.minecraft.network.play.server.S2CPacketSpawnGlobalEntity; import net.minecraft.profiler.Profiler; import net.minecraft.scoreboard.ScoreboardSaveData; import net.minecraft.scoreboard.ServerScoreboard; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.PlayerManager; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumParticleTypes; import net.minecraft.util.IProgressUpdate; import net.minecraft.util.IThreadListener; import net.minecraft.util.ReportedException; import net.minecraft.util.Vec3; import net.minecraft.util.WeightedRandom; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.village.VillageCollection; import net.minecraft.village.VillageSiege; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.biome.WorldChunkManager; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.chunk.storage.ExtendedBlockStorage; import net.minecraft.world.chunk.storage.IChunkLoader; import net.minecraft.world.gen.ChunkProviderServer; import net.minecraft.world.gen.feature.WorldGeneratorBonusChest; import net.minecraft.world.gen.structure.StructureBoundingBox; import net.minecraft.world.storage.ISaveHandler; import net.minecraft.world.storage.MapStorage; import net.minecraft.world.storage.WorldInfo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class WorldServer extends World implements IThreadListener { private static final Logger logger = LogManager.getLogger(); private final MinecraftServer mcServer; private final EntityTracker theEntityTracker; private final PlayerManager thePlayerManager; private final Set pendingTickListEntriesHashSet = Sets.newHashSet(); /** All work to do in future ticks. */ private final TreeSet pendingTickListEntriesTreeSet = new TreeSet(); private final Map entitiesByUuid = Maps.newHashMap(); public ChunkProviderServer theChunkProviderServer; /** Whether level saving is disabled or not */ public boolean disableLevelSaving; /** is false if there are no players */ private boolean allPlayersSleeping; private int updateEntityTick; /** * the teleporter to use when the entity is being transferred into the dimension */ private final Teleporter worldTeleporter; private final SpawnerAnimals field_175742_R = new SpawnerAnimals(); protected final VillageSiege villageSiege = new VillageSiege(this); private WorldServer.ServerBlockEventList[] field_147490_S = new WorldServer.ServerBlockEventList[] {new WorldServer.ServerBlockEventList(null), new WorldServer.ServerBlockEventList(null)}; private int blockEventCacheIndex; private static final List bonusChestContent = Lists.newArrayList(new WeightedRandomChestContent[] {new WeightedRandomChestContent(Items.stick, 0, 1, 3, 10), new WeightedRandomChestContent(Item.getItemFromBlock(Blocks.planks), 0, 1, 3, 10), new WeightedRandomChestContent(Item.getItemFromBlock(Blocks.log), 0, 1, 3, 10), new WeightedRandomChestContent(Items.stone_axe, 0, 1, 1, 3), new WeightedRandomChestContent(Items.wooden_axe, 0, 1, 1, 5), new WeightedRandomChestContent(Items.stone_pickaxe, 0, 1, 1, 3), new WeightedRandomChestContent(Items.wooden_pickaxe, 0, 1, 1, 5), new WeightedRandomChestContent(Items.apple, 0, 2, 3, 5), new WeightedRandomChestContent(Items.bread, 0, 2, 3, 3), new WeightedRandomChestContent(Item.getItemFromBlock(Blocks.log2), 0, 1, 3, 10)}); private List pendingTickListEntriesThisTick = Lists.newArrayList(); private static final String __OBFID = "CL_00001437"; public WorldServer(MinecraftServer server, ISaveHandler saveHandlerIn, WorldInfo info, int dimensionId, Profiler profilerIn) { super(saveHandlerIn, info, WorldProvider.getProviderForDimension(dimensionId), profilerIn, false); this.mcServer = server; this.theEntityTracker = new EntityTracker(this); this.thePlayerManager = new PlayerManager(this); this.provider.registerWorld(this); this.chunkProvider = this.createChunkProvider(); this.worldTeleporter = new Teleporter(this); this.calculateInitialSkylight(); this.calculateInitialWeather(); this.getWorldBorder().setSize(server.getMaxWorldSize()); } public World init() { this.mapStorage = new MapStorage(this.saveHandler); String var1 = VillageCollection.func_176062_a(this.provider); VillageCollection var2 = (VillageCollection)this.mapStorage.loadData(VillageCollection.class, var1); if (var2 == null) { this.villageCollectionObj = new VillageCollection(this); this.mapStorage.setData(var1, this.villageCollectionObj); } else { this.villageCollectionObj = var2; this.villageCollectionObj.func_82566_a(this); } this.worldScoreboard = new ServerScoreboard(this.mcServer); ScoreboardSaveData var3 = (ScoreboardSaveData)this.mapStorage.loadData(ScoreboardSaveData.class, "scoreboard"); if (var3 == null) { var3 = new ScoreboardSaveData(); this.mapStorage.setData("scoreboard", var3); } var3.func_96499_a(this.worldScoreboard); ((ServerScoreboard)this.worldScoreboard).func_96547_a(var3); this.getWorldBorder().setCenter(this.worldInfo.func_176120_C(), this.worldInfo.func_176126_D()); this.getWorldBorder().func_177744_c(this.worldInfo.func_176140_I()); this.getWorldBorder().setDamageBuffer(this.worldInfo.func_176138_H()); this.getWorldBorder().setWarningDistance(this.worldInfo.func_176131_J()); this.getWorldBorder().setWarningTime(this.worldInfo.func_176139_K()); if (this.worldInfo.func_176134_F() > 0L) { this.getWorldBorder().setTransition(this.worldInfo.func_176137_E(), this.worldInfo.func_176132_G(), this.worldInfo.func_176134_F()); } else { this.getWorldBorder().setTransition(this.worldInfo.func_176137_E()); } return this; } /** * Runs a single tick for the world */ public void tick() { super.tick(); if (this.getWorldInfo().isHardcoreModeEnabled() && this.getDifficulty() != EnumDifficulty.HARD) { this.getWorldInfo().setDifficulty(EnumDifficulty.HARD); } this.provider.getWorldChunkManager().cleanupCache(); if (this.areAllPlayersAsleep()) { if (this.getGameRules().getGameRuleBooleanValue("doDaylightCycle")) { long var1 = this.worldInfo.getWorldTime() + 24000L; this.worldInfo.setWorldTime(var1 - var1 % 24000L); } this.wakeAllPlayers(); } this.theProfiler.startSection("mobSpawner"); if (this.getGameRules().getGameRuleBooleanValue("doMobSpawning") && this.worldInfo.getTerrainType() != WorldType.DEBUG_WORLD) { this.field_175742_R.findChunksForSpawning(this, this.spawnHostileMobs, this.spawnPeacefulMobs, this.worldInfo.getWorldTotalTime() % 400L == 0L); } this.theProfiler.endStartSection("chunkSource"); this.chunkProvider.unloadQueuedChunks(); int var3 = this.calculateSkylightSubtracted(1.0F); if (var3 != this.getSkylightSubtracted()) { this.setSkylightSubtracted(var3); } this.worldInfo.incrementTotalWorldTime(this.worldInfo.getWorldTotalTime() + 1L); if (this.getGameRules().getGameRuleBooleanValue("doDaylightCycle")) { this.worldInfo.setWorldTime(this.worldInfo.getWorldTime() + 1L); } this.theProfiler.endStartSection("tickPending"); this.tickUpdates(false); this.theProfiler.endStartSection("tickBlocks"); this.func_147456_g(); this.theProfiler.endStartSection("chunkMap"); this.thePlayerManager.updatePlayerInstances(); this.theProfiler.endStartSection("village"); this.villageCollectionObj.tick(); this.villageSiege.tick(); this.theProfiler.endStartSection("portalForcer"); this.worldTeleporter.removeStalePortalLocations(this.getTotalWorldTime()); this.theProfiler.endSection(); this.func_147488_Z(); } public BiomeGenBase.SpawnListEntry func_175734_a(EnumCreatureType p_175734_1_, BlockPos p_175734_2_) { List var3 = this.getChunkProvider().func_177458_a(p_175734_1_, p_175734_2_); return var3 != null && !var3.isEmpty() ? (BiomeGenBase.SpawnListEntry)WeightedRandom.getRandomItem(this.rand, var3) : null; } public boolean func_175732_a(EnumCreatureType p_175732_1_, BiomeGenBase.SpawnListEntry p_175732_2_, BlockPos p_175732_3_) { List var4 = this.getChunkProvider().func_177458_a(p_175732_1_, p_175732_3_); return var4 != null && !var4.isEmpty() ? var4.contains(p_175732_2_) : false; } /** * Updates the flag that indicates whether or not all players in the world are sleeping. */ public void updateAllPlayersSleepingFlag() { this.allPlayersSleeping = false; if (!this.playerEntities.isEmpty()) { int var1 = 0; int var2 = 0; Iterator var3 = this.playerEntities.iterator(); while (var3.hasNext()) { EntityPlayer var4 = (EntityPlayer)var3.next(); if (var4.func_175149_v()) { ++var1; } else if (var4.isPlayerSleeping()) { ++var2; } } this.allPlayersSleeping = var2 > 0 && var2 >= this.playerEntities.size() - var1; } } protected void wakeAllPlayers() { this.allPlayersSleeping = false; Iterator var1 = this.playerEntities.iterator(); while (var1.hasNext()) { EntityPlayer var2 = (EntityPlayer)var1.next(); if (var2.isPlayerSleeping()) { var2.wakeUpPlayer(false, false, true); } } this.resetRainAndThunder(); } private void resetRainAndThunder() { this.worldInfo.setRainTime(0); this.worldInfo.setRaining(false); this.worldInfo.setThunderTime(0); this.worldInfo.setThundering(false); } public boolean areAllPlayersAsleep() { if (this.allPlayersSleeping && !this.isRemote) { Iterator var1 = this.playerEntities.iterator(); EntityPlayer var2; do { if (!var1.hasNext()) { return true; } var2 = (EntityPlayer)var1.next(); } while (!var2.func_175149_v() && var2.isPlayerFullyAsleep()); return false; } else { return false; } } protected void func_147456_g() { super.func_147456_g(); if (this.worldInfo.getTerrainType() == WorldType.DEBUG_WORLD) { Iterator var21 = this.activeChunkSet.iterator(); while (var21.hasNext()) { ChunkCoordIntPair var22 = (ChunkCoordIntPair)var21.next(); this.getChunkFromChunkCoords(var22.chunkXPos, var22.chunkZPos).func_150804_b(false); } } else { int var1 = 0; int var2 = 0; for (Iterator var3 = this.activeChunkSet.iterator(); var3.hasNext(); this.theProfiler.endSection()) { ChunkCoordIntPair var4 = (ChunkCoordIntPair)var3.next(); int var5 = var4.chunkXPos * 16; int var6 = var4.chunkZPos * 16; this.theProfiler.startSection("getChunk"); Chunk var7 = this.getChunkFromChunkCoords(var4.chunkXPos, var4.chunkZPos); this.func_147467_a(var5, var6, var7); this.theProfiler.endStartSection("tickChunk"); var7.func_150804_b(false); this.theProfiler.endStartSection("thunder"); int var8; BlockPos var9; if (this.rand.nextInt(100000) == 0 && this.isRaining() && this.isThundering()) { this.updateLCG = this.updateLCG * 3 + 1013904223; var8 = this.updateLCG >> 2; var9 = this.func_175736_a(new BlockPos(var5 + (var8 & 15), 0, var6 + (var8 >> 8 & 15))); if (this.func_175727_C(var9)) { this.addWeatherEffect(new EntityLightningBolt(this, (double)var9.getX(), (double)var9.getY(), (double)var9.getZ())); } } this.theProfiler.endStartSection("iceandsnow"); if (this.rand.nextInt(16) == 0) { this.updateLCG = this.updateLCG * 3 + 1013904223; var8 = this.updateLCG >> 2; var9 = this.func_175725_q(new BlockPos(var5 + (var8 & 15), 0, var6 + (var8 >> 8 & 15))); BlockPos var10 = var9.offsetDown(); if (this.func_175662_w(var10)) { this.setBlockState(var10, Blocks.ice.getDefaultState()); } if (this.isRaining() && this.func_175708_f(var9, true)) { this.setBlockState(var9, Blocks.snow_layer.getDefaultState()); } if (this.isRaining() && this.getBiomeGenForCoords(var10).canSpawnLightningBolt()) { this.getBlockState(var10).getBlock().fillWithRain(this, var10); } } this.theProfiler.endStartSection("tickBlocks"); var8 = this.getGameRules().getInt("randomTickSpeed"); if (var8 > 0) { ExtendedBlockStorage[] var23 = var7.getBlockStorageArray(); int var24 = var23.length; for (int var11 = 0; var11 < var24; ++var11) { ExtendedBlockStorage var12 = var23[var11]; if (var12 != null && var12.getNeedsRandomTick()) { for (int var13 = 0; var13 < var8; ++var13) { this.updateLCG = this.updateLCG * 3 + 1013904223; int var14 = this.updateLCG >> 2; int var15 = var14 & 15; int var16 = var14 >> 8 & 15; int var17 = var14 >> 16 & 15; ++var2; BlockPos var18 = new BlockPos(var15 + var5, var17 + var12.getYLocation(), var16 + var6); IBlockState var19 = var12.get(var15, var17, var16); Block var20 = var19.getBlock(); if (var20.getTickRandomly()) { ++var1; var20.randomTick(this, var18, var19, this.rand); } } } } } } } } protected BlockPos func_175736_a(BlockPos p_175736_1_) { BlockPos var2 = this.func_175725_q(p_175736_1_); AxisAlignedBB var3 = (new AxisAlignedBB(var2, new BlockPos(var2.getX(), this.getHeight(), var2.getZ()))).expand(3.0D, 3.0D, 3.0D); List var4 = this.func_175647_a(EntityLivingBase.class, var3, new Predicate() { private static final String __OBFID = "CL_00001889"; public boolean func_180242_a(EntityLivingBase p_180242_1_) { return p_180242_1_ != null && p_180242_1_.isEntityAlive() && WorldServer.this.isAgainstSky(p_180242_1_.getPosition()); } public boolean apply(Object p_apply_1_) { return this.func_180242_a((EntityLivingBase)p_apply_1_); } }); return !var4.isEmpty() ? ((EntityLivingBase)var4.get(this.rand.nextInt(var4.size()))).getPosition() : var2; } public boolean isBlockTickPending(BlockPos pos, Block blockType) { NextTickListEntry var3 = new NextTickListEntry(pos, blockType); return this.pendingTickListEntriesThisTick.contains(var3); } public void scheduleUpdate(BlockPos pos, Block blockIn, int delay) { this.func_175654_a(pos, blockIn, delay, 0); } public void func_175654_a(BlockPos p_175654_1_, Block p_175654_2_, int p_175654_3_, int p_175654_4_) { NextTickListEntry var5 = new NextTickListEntry(p_175654_1_, p_175654_2_); byte var6 = 0; if (this.scheduledUpdatesAreImmediate && p_175654_2_.getMaterial() != Material.air) { if (p_175654_2_.requiresUpdates()) { var6 = 8; if (this.isAreaLoaded(var5.field_180282_a.add(-var6, -var6, -var6), var5.field_180282_a.add(var6, var6, var6))) { IBlockState var7 = this.getBlockState(var5.field_180282_a); if (var7.getBlock().getMaterial() != Material.air && var7.getBlock() == var5.func_151351_a()) { var7.getBlock().updateTick(this, var5.field_180282_a, var7, this.rand); } } return; } p_175654_3_ = 1; } if (this.isAreaLoaded(p_175654_1_.add(-var6, -var6, -var6), p_175654_1_.add(var6, var6, var6))) { if (p_175654_2_.getMaterial() != Material.air) { var5.setScheduledTime((long)p_175654_3_ + this.worldInfo.getWorldTotalTime()); var5.setPriority(p_175654_4_); } if (!this.pendingTickListEntriesHashSet.contains(var5)) { this.pendingTickListEntriesHashSet.add(var5); this.pendingTickListEntriesTreeSet.add(var5); } } } public void func_180497_b(BlockPos p_180497_1_, Block p_180497_2_, int p_180497_3_, int p_180497_4_) { NextTickListEntry var5 = new NextTickListEntry(p_180497_1_, p_180497_2_); var5.setPriority(p_180497_4_); if (p_180497_2_.getMaterial() != Material.air) { var5.setScheduledTime((long)p_180497_3_ + this.worldInfo.getWorldTotalTime()); } if (!this.pendingTickListEntriesHashSet.contains(var5)) { this.pendingTickListEntriesHashSet.add(var5); this.pendingTickListEntriesTreeSet.add(var5); } } /** * Updates (and cleans up) entities and tile entities */ public void updateEntities() { if (this.playerEntities.isEmpty()) { if (this.updateEntityTick++ >= 1200) { return; } } else { this.resetUpdateEntityTick(); } super.updateEntities(); } /** * Resets the updateEntityTick field to 0 */ public void resetUpdateEntityTick() { this.updateEntityTick = 0; } /** * Runs through the list of updates to run and ticks them */ public boolean tickUpdates(boolean p_72955_1_) { if (this.worldInfo.getTerrainType() == WorldType.DEBUG_WORLD) { return false; } else { int var2 = this.pendingTickListEntriesTreeSet.size(); if (var2 != this.pendingTickListEntriesHashSet.size()) { throw new IllegalStateException("TickNextTick list out of synch"); } else { if (var2 > 1000) { var2 = 1000; } this.theProfiler.startSection("cleaning"); NextTickListEntry var4; for (int var3 = 0; var3 < var2; ++var3) { var4 = (NextTickListEntry)this.pendingTickListEntriesTreeSet.first(); if (!p_72955_1_ && var4.scheduledTime > this.worldInfo.getWorldTotalTime()) { break; } this.pendingTickListEntriesTreeSet.remove(var4); this.pendingTickListEntriesHashSet.remove(var4); this.pendingTickListEntriesThisTick.add(var4); } this.theProfiler.endSection(); this.theProfiler.startSection("ticking"); Iterator var11 = this.pendingTickListEntriesThisTick.iterator(); while (var11.hasNext()) { var4 = (NextTickListEntry)var11.next(); var11.remove(); byte var5 = 0; if (this.isAreaLoaded(var4.field_180282_a.add(-var5, -var5, -var5), var4.field_180282_a.add(var5, var5, var5))) { IBlockState var6 = this.getBlockState(var4.field_180282_a); if (var6.getBlock().getMaterial() != Material.air && Block.isEqualTo(var6.getBlock(), var4.func_151351_a())) { try { var6.getBlock().updateTick(this, var4.field_180282_a, var6, this.rand); } catch (Throwable var10) { CrashReport var8 = CrashReport.makeCrashReport(var10, "Exception while ticking a block"); CrashReportCategory var9 = var8.makeCategory("Block being ticked"); CrashReportCategory.addBlockInfo(var9, var4.field_180282_a, var6); throw new ReportedException(var8); } } } else { this.scheduleUpdate(var4.field_180282_a, var4.func_151351_a(), 0); } } this.theProfiler.endSection(); this.pendingTickListEntriesThisTick.clear(); return !this.pendingTickListEntriesTreeSet.isEmpty(); } } } public List getPendingBlockUpdates(Chunk p_72920_1_, boolean p_72920_2_) { ChunkCoordIntPair var3 = p_72920_1_.getChunkCoordIntPair(); int var4 = (var3.chunkXPos << 4) - 2; int var5 = var4 + 16 + 2; int var6 = (var3.chunkZPos << 4) - 2; int var7 = var6 + 16 + 2; return this.func_175712_a(new StructureBoundingBox(var4, 0, var6, var5, 256, var7), p_72920_2_); } public List func_175712_a(StructureBoundingBox p_175712_1_, boolean p_175712_2_) { ArrayList var3 = null; for (int var4 = 0; var4 < 2; ++var4) { Iterator var5; if (var4 == 0) { var5 = this.pendingTickListEntriesTreeSet.iterator(); } else { var5 = this.pendingTickListEntriesThisTick.iterator(); if (!this.pendingTickListEntriesThisTick.isEmpty()) { logger.debug("toBeTicked = " + this.pendingTickListEntriesThisTick.size()); } } while (var5.hasNext()) { NextTickListEntry var6 = (NextTickListEntry)var5.next(); BlockPos var7 = var6.field_180282_a; if (var7.getX() >= p_175712_1_.minX && var7.getX() < p_175712_1_.maxX && var7.getZ() >= p_175712_1_.minZ && var7.getZ() < p_175712_1_.maxZ) { if (p_175712_2_) { this.pendingTickListEntriesHashSet.remove(var6); var5.remove(); } if (var3 == null) { var3 = Lists.newArrayList(); } var3.add(var6); } } } return var3; } /** * Will update the entity in the world if the chunk the entity is in is currently loaded or its forced to update. * Args: entity, forceUpdate */ public void updateEntityWithOptionalForce(Entity p_72866_1_, boolean p_72866_2_) { if (!this.func_175735_ai() && (p_72866_1_ instanceof EntityAnimal || p_72866_1_ instanceof EntityWaterMob)) { p_72866_1_.setDead(); } if (!this.func_175738_ah() && p_72866_1_ instanceof INpc) { p_72866_1_.setDead(); } super.updateEntityWithOptionalForce(p_72866_1_, p_72866_2_); } private boolean func_175738_ah() { return this.mcServer.getCanSpawnNPCs(); } private boolean func_175735_ai() { return this.mcServer.getCanSpawnAnimals(); } /** * Creates the chunk provider for this world. Called in the constructor. Retrieves provider from worldProvider? */ protected IChunkProvider createChunkProvider() { IChunkLoader var1 = this.saveHandler.getChunkLoader(this.provider); this.theChunkProviderServer = new ChunkProviderServer(this, var1, this.provider.createChunkGenerator()); return this.theChunkProviderServer; } public List func_147486_a(int p_147486_1_, int p_147486_2_, int p_147486_3_, int p_147486_4_, int p_147486_5_, int p_147486_6_) { ArrayList var7 = Lists.newArrayList(); for (int var8 = 0; var8 < this.loadedTileEntityList.size(); ++var8) { TileEntity var9 = (TileEntity)this.loadedTileEntityList.get(var8); BlockPos var10 = var9.getPos(); if (var10.getX() >= p_147486_1_ && var10.getY() >= p_147486_2_ && var10.getZ() >= p_147486_3_ && var10.getX() < p_147486_4_ && var10.getY() < p_147486_5_ && var10.getZ() < p_147486_6_) { var7.add(var9); } } return var7; } public boolean isBlockModifiable(EntityPlayer p_175660_1_, BlockPos p_175660_2_) { return !this.mcServer.isBlockProtected(this, p_175660_2_, p_175660_1_) && this.getWorldBorder().contains(p_175660_2_); } public void initialize(WorldSettings settings) { if (!this.worldInfo.isInitialized()) { try { this.createSpawnPosition(settings); if (this.worldInfo.getTerrainType() == WorldType.DEBUG_WORLD) { this.setDebugWorldSettings(); } super.initialize(settings); } catch (Throwable var6) { CrashReport var3 = CrashReport.makeCrashReport(var6, "Exception initializing level"); try { this.addWorldInfoToCrashReport(var3); } catch (Throwable var5) { ; } throw new ReportedException(var3); } this.worldInfo.setServerInitialized(true); } } private void setDebugWorldSettings() { this.worldInfo.setMapFeaturesEnabled(false); this.worldInfo.setAllowCommands(true); this.worldInfo.setRaining(false); this.worldInfo.setThundering(false); this.worldInfo.func_176142_i(1000000000); this.worldInfo.setWorldTime(6000L); this.worldInfo.setGameType(WorldSettings.GameType.SPECTATOR); this.worldInfo.setHardcore(false); this.worldInfo.setDifficulty(EnumDifficulty.PEACEFUL); this.worldInfo.setDifficultyLocked(true); this.getGameRules().setOrCreateGameRule("doDaylightCycle", "false"); } /** * creates a spawn position at random within 256 blocks of 0,0 */ private void createSpawnPosition(WorldSettings p_73052_1_) { if (!this.provider.canRespawnHere()) { this.worldInfo.setSpawn(BlockPos.ORIGIN.offsetUp(this.provider.getAverageGroundLevel())); } else if (this.worldInfo.getTerrainType() == WorldType.DEBUG_WORLD) { this.worldInfo.setSpawn(BlockPos.ORIGIN.offsetUp()); } else { this.findingSpawnPoint = true; WorldChunkManager var2 = this.provider.getWorldChunkManager(); List var3 = var2.getBiomesToSpawnIn(); Random var4 = new Random(this.getSeed()); BlockPos var5 = var2.findBiomePosition(0, 0, 256, var3, var4); int var6 = 0; int var7 = this.provider.getAverageGroundLevel(); int var8 = 0; if (var5 != null) { var6 = var5.getX(); var8 = var5.getZ(); } else { logger.warn("Unable to find spawn biome"); } int var9 = 0; while (!this.provider.canCoordinateBeSpawn(var6, var8)) { var6 += var4.nextInt(64) - var4.nextInt(64); var8 += var4.nextInt(64) - var4.nextInt(64); ++var9; if (var9 == 1000) { break; } } this.worldInfo.setSpawn(new BlockPos(var6, var7, var8)); this.findingSpawnPoint = false; if (p_73052_1_.isBonusChestEnabled()) { this.createBonusChest(); } } } /** * Creates the bonus chest in the world. */ protected void createBonusChest() { WorldGeneratorBonusChest var1 = new WorldGeneratorBonusChest(bonusChestContent, 10); for (int var2 = 0; var2 < 10; ++var2) { int var3 = this.worldInfo.getSpawnX() + this.rand.nextInt(6) - this.rand.nextInt(6); int var4 = this.worldInfo.getSpawnZ() + this.rand.nextInt(6) - this.rand.nextInt(6); BlockPos var5 = this.func_175672_r(new BlockPos(var3, 0, var4)).offsetUp(); if (var1.generate(this, this.rand, var5)) { break; } } } public BlockPos func_180504_m() { return this.provider.func_177496_h(); } /** * Saves all chunks to disk while updating progress bar. */ public void saveAllChunks(boolean p_73044_1_, IProgressUpdate p_73044_2_) throws MinecraftException { if (this.chunkProvider.canSave()) { if (p_73044_2_ != null) { p_73044_2_.displaySavingString("Saving level"); } this.saveLevel(); if (p_73044_2_ != null) { p_73044_2_.displayLoadingString("Saving chunks"); } this.chunkProvider.saveChunks(p_73044_1_, p_73044_2_); List var3 = this.theChunkProviderServer.func_152380_a(); Iterator var4 = var3.iterator(); while (var4.hasNext()) { Chunk var5 = (Chunk)var4.next(); if (!this.thePlayerManager.func_152621_a(var5.xPosition, var5.zPosition)) { this.theChunkProviderServer.dropChunk(var5.xPosition, var5.zPosition); } } } } /** * saves chunk data - currently only called during execution of the Save All command */ public void saveChunkData() { if (this.chunkProvider.canSave()) { this.chunkProvider.saveExtraData(); } } /** * Saves the chunks to disk. */ protected void saveLevel() throws MinecraftException { this.checkSessionLock(); this.worldInfo.func_176145_a(this.getWorldBorder().getDiameter()); this.worldInfo.func_176124_d(this.getWorldBorder().getCenterX()); this.worldInfo.func_176141_c(this.getWorldBorder().getCenterZ()); this.worldInfo.func_176129_e(this.getWorldBorder().getDamageBuffer()); this.worldInfo.func_176125_f(this.getWorldBorder().func_177727_n()); this.worldInfo.func_176122_j(this.getWorldBorder().getWarningDistance()); this.worldInfo.func_176136_k(this.getWorldBorder().getWarningTime()); this.worldInfo.func_176118_b(this.getWorldBorder().getTargetSize()); this.worldInfo.func_176135_e(this.getWorldBorder().getTimeUntilTarget()); this.saveHandler.saveWorldInfoWithPlayer(this.worldInfo, this.mcServer.getConfigurationManager().getHostPlayerData()); this.mapStorage.saveAllData(); } protected void onEntityAdded(Entity p_72923_1_) { super.onEntityAdded(p_72923_1_); this.entitiesById.addKey(p_72923_1_.getEntityId(), p_72923_1_); this.entitiesByUuid.put(p_72923_1_.getUniqueID(), p_72923_1_); Entity[] var2 = p_72923_1_.getParts(); if (var2 != null) { for (int var3 = 0; var3 < var2.length; ++var3) { this.entitiesById.addKey(var2[var3].getEntityId(), var2[var3]); } } } protected void onEntityRemoved(Entity p_72847_1_) { super.onEntityRemoved(p_72847_1_); this.entitiesById.removeObject(p_72847_1_.getEntityId()); this.entitiesByUuid.remove(p_72847_1_.getUniqueID()); Entity[] var2 = p_72847_1_.getParts(); if (var2 != null) { for (int var3 = 0; var3 < var2.length; ++var3) { this.entitiesById.removeObject(var2[var3].getEntityId()); } } } /** * adds a lightning bolt to the list of lightning bolts in this world. */ public boolean addWeatherEffect(Entity p_72942_1_) { if (super.addWeatherEffect(p_72942_1_)) { this.mcServer.getConfigurationManager().sendToAllNear(p_72942_1_.posX, p_72942_1_.posY, p_72942_1_.posZ, 512.0D, this.provider.getDimensionId(), new S2CPacketSpawnGlobalEntity(p_72942_1_)); return true; } else { return false; } } /** * sends a Packet 38 (Entity Status) to all tracked players of that entity */ public void setEntityState(Entity entityIn, byte p_72960_2_) { this.getEntityTracker().func_151248_b(entityIn, new S19PacketEntityStatus(entityIn, p_72960_2_)); } /** * returns a new explosion. Does initiation (at time of writing Explosion is not finished) */ public Explosion newExplosion(Entity p_72885_1_, double p_72885_2_, double p_72885_4_, double p_72885_6_, float p_72885_8_, boolean p_72885_9_, boolean p_72885_10_) { Explosion var11 = new Explosion(this, p_72885_1_, p_72885_2_, p_72885_4_, p_72885_6_, p_72885_8_, p_72885_9_, p_72885_10_); var11.doExplosionA(); var11.doExplosionB(false); if (!p_72885_10_) { var11.func_180342_d(); } Iterator var12 = this.playerEntities.iterator(); while (var12.hasNext()) { EntityPlayer var13 = (EntityPlayer)var12.next(); if (var13.getDistanceSq(p_72885_2_, p_72885_4_, p_72885_6_) < 4096.0D) { ((EntityPlayerMP)var13).playerNetServerHandler.sendPacket(new S27PacketExplosion(p_72885_2_, p_72885_4_, p_72885_6_, p_72885_8_, var11.func_180343_e(), (Vec3)var11.func_77277_b().get(var13))); } } return var11; } public void addBlockEvent(BlockPos pos, Block blockIn, int eventID, int eventParam) { BlockEventData var5 = new BlockEventData(pos, blockIn, eventID, eventParam); Iterator var6 = this.field_147490_S[this.blockEventCacheIndex].iterator(); BlockEventData var7; do { if (!var6.hasNext()) { this.field_147490_S[this.blockEventCacheIndex].add(var5); return; } var7 = (BlockEventData)var6.next(); } while (!var7.equals(var5)); } private void func_147488_Z() { while (!this.field_147490_S[this.blockEventCacheIndex].isEmpty()) { int var1 = this.blockEventCacheIndex; this.blockEventCacheIndex ^= 1; Iterator var2 = this.field_147490_S[var1].iterator(); while (var2.hasNext()) { BlockEventData var3 = (BlockEventData)var2.next(); if (this.func_147485_a(var3)) { this.mcServer.getConfigurationManager().sendToAllNear((double)var3.func_180328_a().getX(), (double)var3.func_180328_a().getY(), (double)var3.func_180328_a().getZ(), 64.0D, this.provider.getDimensionId(), new S24PacketBlockAction(var3.func_180328_a(), var3.getBlock(), var3.getEventID(), var3.getEventParameter())); } } this.field_147490_S[var1].clear(); } } private boolean func_147485_a(BlockEventData p_147485_1_) { IBlockState var2 = this.getBlockState(p_147485_1_.func_180328_a()); return var2.getBlock() == p_147485_1_.getBlock() ? var2.getBlock().onBlockEventReceived(this, p_147485_1_.func_180328_a(), var2, p_147485_1_.getEventID(), p_147485_1_.getEventParameter()) : false; } /** * Syncs all changes to disk and wait for completion. */ public void flush() { this.saveHandler.flush(); } /** * Updates all weather states. */ protected void updateWeather() { boolean var1 = this.isRaining(); super.updateWeather(); if (this.prevRainingStrength != this.rainingStrength) { this.mcServer.getConfigurationManager().sendPacketToAllPlayersInDimension(new S2BPacketChangeGameState(7, this.rainingStrength), this.provider.getDimensionId()); } if (this.prevThunderingStrength != this.thunderingStrength) { this.mcServer.getConfigurationManager().sendPacketToAllPlayersInDimension(new S2BPacketChangeGameState(8, this.thunderingStrength), this.provider.getDimensionId()); } if (var1 != this.isRaining()) { if (var1) { this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new S2BPacketChangeGameState(2, 0.0F)); } else { this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new S2BPacketChangeGameState(1, 0.0F)); } this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new S2BPacketChangeGameState(7, this.rainingStrength)); this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new S2BPacketChangeGameState(8, this.thunderingStrength)); } } protected int getRenderDistanceChunks() { return this.mcServer.getConfigurationManager().getViewDistance(); } public MinecraftServer func_73046_m() { return this.mcServer; } /** * Gets the EntityTracker */ public EntityTracker getEntityTracker() { return this.theEntityTracker; } public PlayerManager getPlayerManager() { return this.thePlayerManager; } public Teleporter getDefaultTeleporter() { return this.worldTeleporter; } public void func_175739_a(EnumParticleTypes p_175739_1_, double p_175739_2_, double p_175739_4_, double p_175739_6_, int p_175739_8_, double p_175739_9_, double p_175739_11_, double p_175739_13_, double p_175739_15_, int ... p_175739_17_) { this.func_180505_a(p_175739_1_, false, p_175739_2_, p_175739_4_, p_175739_6_, p_175739_8_, p_175739_9_, p_175739_11_, p_175739_13_, p_175739_15_, p_175739_17_); } public void func_180505_a(EnumParticleTypes p_180505_1_, boolean p_180505_2_, double p_180505_3_, double p_180505_5_, double p_180505_7_, int p_180505_9_, double p_180505_10_, double p_180505_12_, double p_180505_14_, double p_180505_16_, int ... p_180505_18_) { S2APacketParticles var19 = new S2APacketParticles(p_180505_1_, p_180505_2_, (float)p_180505_3_, (float)p_180505_5_, (float)p_180505_7_, (float)p_180505_10_, (float)p_180505_12_, (float)p_180505_14_, (float)p_180505_16_, p_180505_9_, p_180505_18_); for (int var20 = 0; var20 < this.playerEntities.size(); ++var20) { EntityPlayerMP var21 = (EntityPlayerMP)this.playerEntities.get(var20); BlockPos var22 = var21.getPosition(); double var23 = var22.distanceSq(p_180505_3_, p_180505_5_, p_180505_7_); if (var23 <= 256.0D || p_180505_2_ && var23 <= 65536.0D) { var21.playerNetServerHandler.sendPacket(var19); } } } public Entity getEntityFromUuid(UUID uuid) { return (Entity)this.entitiesByUuid.get(uuid); } public ListenableFuture addScheduledTask(Runnable runnableToSchedule) { return this.mcServer.addScheduledTask(runnableToSchedule); } public boolean isCallingFromMinecraftThread() { return this.mcServer.isCallingFromMinecraftThread(); } static class ServerBlockEventList extends ArrayList { private static final String __OBFID = "CL_00001439"; private ServerBlockEventList() {} ServerBlockEventList(Object p_i1521_1_) { this(); } } }