Advertisement
Guest User

Untitled

a guest
Jan 30th, 2015
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 43.33 KB | None | 0 0
  1. package net.minecraft.world;
  2.  
  3. import com.google.common.collect.Lists;
  4. import cpw.mods.fml.relauncher.Side;
  5. import cpw.mods.fml.relauncher.SideOnly;
  6. import java.io.File;
  7. import java.util.ArrayList;
  8. import java.util.HashSet;
  9. import java.util.Iterator;
  10. import java.util.List;
  11. import java.util.Random;
  12. import java.util.Set;
  13. import java.util.TreeSet;
  14. import net.minecraft.block.Block;
  15. import net.minecraft.block.BlockEventData;
  16. import net.minecraft.block.material.Material;
  17. import net.minecraft.crash.CrashReport;
  18. import net.minecraft.crash.CrashReportCategory;
  19. import net.minecraft.entity.Entity;
  20. import net.minecraft.entity.EntityTracker;
  21. import net.minecraft.entity.EnumCreatureType;
  22. import net.minecraft.entity.INpc;
  23. import net.minecraft.entity.effect.EntityLightningBolt;
  24. import net.minecraft.entity.passive.EntityAnimal;
  25. import net.minecraft.entity.passive.EntityWaterMob;
  26. import net.minecraft.entity.player.EntityPlayer;
  27. import net.minecraft.entity.player.EntityPlayerMP;
  28. import net.minecraft.init.Blocks;
  29. import net.minecraft.init.Items;
  30. import net.minecraft.item.Item;
  31. import net.minecraft.network.play.server.S19PacketEntityStatus;
  32. import net.minecraft.network.play.server.S24PacketBlockAction;
  33. import net.minecraft.network.play.server.S27PacketExplosion;
  34. import net.minecraft.network.play.server.S2APacketParticles;
  35. import net.minecraft.network.play.server.S2BPacketChangeGameState;
  36. import net.minecraft.network.play.server.S2CPacketSpawnGlobalEntity;
  37. import net.minecraft.profiler.Profiler;
  38. import net.minecraft.scoreboard.ScoreboardSaveData;
  39. import net.minecraft.scoreboard.ServerScoreboard;
  40. import net.minecraft.server.MinecraftServer;
  41. import net.minecraft.server.management.PlayerManager;
  42. import net.minecraft.tileentity.TileEntity;
  43. import net.minecraft.util.ChunkCoordinates;
  44. import net.minecraft.util.IProgressUpdate;
  45. import net.minecraft.util.IntHashMap;
  46. import net.minecraft.util.ReportedException;
  47. import net.minecraft.util.Vec3;
  48. import net.minecraft.util.WeightedRandom;
  49. import net.minecraft.util.WeightedRandomChestContent;
  50. import net.minecraft.world.biome.BiomeGenBase;
  51. import net.minecraft.world.biome.WorldChunkManager;
  52. import net.minecraft.world.chunk.Chunk;
  53. import net.minecraft.world.chunk.IChunkProvider;
  54. import net.minecraft.world.chunk.storage.AnvilChunkLoader;
  55. import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
  56. import net.minecraft.world.chunk.storage.IChunkLoader;
  57. import net.minecraft.world.gen.ChunkProviderServer;
  58. import net.minecraft.world.gen.feature.WorldGeneratorBonusChest;
  59. import net.minecraft.world.storage.ISaveHandler;
  60. import net.minecraftforge.common.ChestGenHooks;
  61. import static net.minecraftforge.common.ChestGenHooks.BONUS_CHEST;
  62. import net.minecraftforge.common.DimensionManager;
  63. import net.minecraftforge.common.MinecraftForge;
  64. import net.minecraftforge.event.ForgeEventFactory;
  65. import net.minecraftforge.event.world.WorldEvent;
  66.  
  67. import org.apache.logging.log4j.LogManager;
  68. import org.apache.logging.log4j.Logger;
  69.  
  70. public class WorldServer extends World
  71. {
  72. private static final Logger logger = LogManager.getLogger();
  73. private final MinecraftServer mcServer;
  74. private final EntityTracker theEntityTracker;
  75. private final PlayerManager thePlayerManager;
  76. private Set pendingTickListEntriesHashSet;
  77. /** All work to do in future ticks. */
  78. private TreeSet pendingTickListEntriesTreeSet;
  79. public ChunkProviderServer theChunkProviderServer;
  80. /** Whether or not level saving is enabled */
  81. public boolean levelSaving;
  82. /** is false if there are no players */
  83. private boolean allPlayersSleeping;
  84. private int updateEntityTick;
  85. /** the teleporter to use when the entity is being transferred into the dimension */
  86. private final Teleporter worldTeleporter;
  87. private final SpawnerAnimals animalSpawner = new SpawnerAnimals();
  88. private WorldServer.ServerBlockEventList[] field_147490_S = new WorldServer.ServerBlockEventList[] {new WorldServer.ServerBlockEventList(null), new WorldServer.ServerBlockEventList(null)};
  89. private int blockEventCacheIndex;
  90. public static final WeightedRandomChestContent[] bonusChestContent = 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)};
  91. private List pendingTickListEntriesThisTick = new ArrayList();
  92. /** An IntHashMap of entity IDs (integers) to their Entity objects. */
  93. private IntHashMap entityIdMap;
  94. private static final String __OBFID = "CL_00001437";
  95.  
  96. /** Stores the recently processed (lighting) chunks */
  97. protected Set<ChunkCoordIntPair> doneChunks = new HashSet<ChunkCoordIntPair>();
  98. public List<Teleporter> customTeleporters = new ArrayList<Teleporter>();
  99.  
  100. public WorldServer(MinecraftServer p_i45284_1_, ISaveHandler p_i45284_2_, String p_i45284_3_, int p_i45284_4_, WorldSettings p_i45284_5_, Profiler p_i45284_6_)
  101. {
  102. super(p_i45284_2_, p_i45284_3_, p_i45284_5_, WorldProvider.getProviderForDimension(p_i45284_4_), p_i45284_6_);
  103. this.mcServer = p_i45284_1_;
  104. this.theEntityTracker = new EntityTracker(this);
  105. this.thePlayerManager = new PlayerManager(this);
  106.  
  107. if (this.entityIdMap == null)
  108. {
  109. this.entityIdMap = new IntHashMap();
  110. }
  111.  
  112. if (this.pendingTickListEntriesHashSet == null)
  113. {
  114. this.pendingTickListEntriesHashSet = new HashSet();
  115. }
  116.  
  117. if (this.pendingTickListEntriesTreeSet == null)
  118. {
  119. this.pendingTickListEntriesTreeSet = new TreeSet();
  120. }
  121.  
  122. this.worldTeleporter = new Teleporter(this);
  123. this.worldScoreboard = new ServerScoreboard(p_i45284_1_);
  124. ScoreboardSaveData scoreboardsavedata = (ScoreboardSaveData)this.mapStorage.loadData(ScoreboardSaveData.class, "scoreboard");
  125.  
  126. if (scoreboardsavedata == null)
  127. {
  128. scoreboardsavedata = new ScoreboardSaveData();
  129. this.mapStorage.setData("scoreboard", scoreboardsavedata);
  130. }
  131.  
  132. if (!(this instanceof WorldServerMulti)) //Forge: We fix the global mapStorage, which causes us to share scoreboards early. So don't associate the save data with the temporary scoreboard
  133. {
  134. scoreboardsavedata.func_96499_a(this.worldScoreboard);
  135. }
  136. ((ServerScoreboard)this.worldScoreboard).func_96547_a(scoreboardsavedata);
  137. DimensionManager.setWorld(p_i45284_4_, this);
  138. }
  139.  
  140. /**
  141. * Runs a single tick for the world
  142. */
  143. public void tick()
  144. {
  145. super.tick();
  146.  
  147. if (this.getWorldInfo().isHardcoreModeEnabled() && this.difficultySetting != EnumDifficulty.HARD)
  148. {
  149. this.difficultySetting = EnumDifficulty.HARD;
  150. }
  151.  
  152. this.provider.worldChunkMgr.cleanupCache();
  153.  
  154. if (this.areAllPlayersAsleep())
  155. {
  156. if (this.getGameRules().getGameRuleBooleanValue("doDaylightCycle"))
  157. {
  158. long i = this.worldInfo.getWorldTime() + 24000L;
  159. this.worldInfo.setWorldTime(i - i % 24000L);
  160. }
  161.  
  162. this.wakeAllPlayers();
  163. }
  164.  
  165. this.theProfiler.startSection("mobSpawner");
  166.  
  167. if (this.getGameRules().getGameRuleBooleanValue("doMobSpawning"))
  168. {
  169. this.animalSpawner.findChunksForSpawning(this, this.spawnHostileMobs, this.spawnPeacefulMobs, this.worldInfo.getWorldTotalTime() % 400L == 0L);
  170. }
  171.  
  172. this.theProfiler.endStartSection("chunkSource");
  173. this.chunkProvider.unloadQueuedChunks();
  174. int j = this.calculateSkylightSubtracted(1.0F);
  175.  
  176. if (j != this.skylightSubtracted)
  177. {
  178. this.skylightSubtracted = j;
  179. }
  180.  
  181. this.worldInfo.incrementTotalWorldTime(this.worldInfo.getWorldTotalTime() + 1L);
  182.  
  183. if (this.getGameRules().getGameRuleBooleanValue("doDaylightCycle"))
  184. {
  185. this.worldInfo.setWorldTime(this.worldInfo.getWorldTime() + 1L);
  186. }
  187.  
  188. this.theProfiler.endStartSection("tickPending");
  189. this.tickUpdates(false);
  190. this.theProfiler.endStartSection("tickBlocks");
  191. this.func_147456_g();
  192. this.theProfiler.endStartSection("chunkMap");
  193. this.thePlayerManager.updatePlayerInstances();
  194. this.theProfiler.endStartSection("village");
  195. this.villageCollectionObj.tick();
  196. this.villageSiegeObj.tick();
  197. this.theProfiler.endStartSection("portalForcer");
  198. this.worldTeleporter.removeStalePortalLocations(this.getTotalWorldTime());
  199. for (Teleporter tele : customTeleporters)
  200. {
  201. tele.removeStalePortalLocations(getTotalWorldTime());
  202. }
  203. this.theProfiler.endSection();
  204. this.func_147488_Z();
  205. }
  206.  
  207. /**
  208. * only spawns creatures allowed by the chunkProvider
  209. */
  210. public BiomeGenBase.SpawnListEntry spawnRandomCreature(EnumCreatureType p_73057_1_, int p_73057_2_, int p_73057_3_, int p_73057_4_)
  211. {
  212. List list = this.getChunkProvider().getPossibleCreatures(p_73057_1_, p_73057_2_, p_73057_3_, p_73057_4_);
  213. list = ForgeEventFactory.getPotentialSpawns(this, p_73057_1_, p_73057_2_, p_73057_3_, p_73057_4_, list);
  214. return list != null && !list.isEmpty() ? (BiomeGenBase.SpawnListEntry)WeightedRandom.getRandomItem(this.rand, list) : null;
  215. }
  216.  
  217. /**
  218. * Updates the flag that indicates whether or not all players in the world are sleeping.
  219. */
  220. public void updateAllPlayersSleepingFlag()
  221. {
  222. this.allPlayersSleeping = !this.playerEntities.isEmpty();
  223. Iterator iterator = this.playerEntities.iterator();
  224.  
  225. while (iterator.hasNext())
  226. {
  227. EntityPlayer entityplayer = (EntityPlayer)iterator.next();
  228.  
  229. if (!entityplayer.isPlayerSleeping())
  230. {
  231. this.allPlayersSleeping = false;
  232. break;
  233. }
  234. }
  235. }
  236.  
  237. protected void wakeAllPlayers()
  238. {
  239. this.allPlayersSleeping = false;
  240. Iterator iterator = this.playerEntities.iterator();
  241.  
  242. while (iterator.hasNext())
  243. {
  244. EntityPlayer entityplayer = (EntityPlayer)iterator.next();
  245.  
  246. if (entityplayer.isPlayerSleeping())
  247. {
  248. entityplayer.wakeUpPlayer(false, false, true);
  249. }
  250. }
  251.  
  252. this.resetRainAndThunder();
  253. }
  254.  
  255. private void resetRainAndThunder()
  256. {
  257. provider.resetRainAndThunder();
  258. }
  259.  
  260. public boolean areAllPlayersAsleep()
  261. {
  262. if (this.allPlayersSleeping && !this.isRemote)
  263. {
  264. Iterator iterator = this.playerEntities.iterator();
  265. EntityPlayer entityplayer;
  266.  
  267. do
  268. {
  269. if (!iterator.hasNext())
  270. {
  271. return true;
  272. }
  273.  
  274. entityplayer = (EntityPlayer)iterator.next();
  275. }
  276. while (entityplayer.isPlayerFullyAsleep());
  277.  
  278. return false;
  279. }
  280. else
  281. {
  282. return false;
  283. }
  284. }
  285.  
  286. /**
  287. * Sets a new spawn location by finding an uncovered block at a random (x,z) location in the chunk.
  288. */
  289. @SideOnly(Side.CLIENT)
  290. public void setSpawnLocation()
  291. {
  292. if (this.worldInfo.getSpawnY() <= 0)
  293. {
  294. this.worldInfo.setSpawnY(64);
  295. }
  296.  
  297. int i = this.worldInfo.getSpawnX();
  298. int j = this.worldInfo.getSpawnZ();
  299. int k = 0;
  300.  
  301. while (this.getTopBlock(i, j).getMaterial() == Material.air)
  302. {
  303. i += this.rand.nextInt(8) - this.rand.nextInt(8);
  304. j += this.rand.nextInt(8) - this.rand.nextInt(8);
  305. ++k;
  306.  
  307. if (k == 10000)
  308. {
  309. break;
  310. }
  311. }
  312.  
  313. this.worldInfo.setSpawnX(i);
  314. this.worldInfo.setSpawnZ(j);
  315. }
  316.  
  317. protected void func_147456_g()
  318. {
  319. super.func_147456_g();
  320. int i = 0;
  321. int j = 0;
  322. Iterator iterator = this.activeChunkSet.iterator();
  323.  
  324. while (iterator.hasNext())
  325. {
  326. ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair)iterator.next();
  327. int k = chunkcoordintpair.chunkXPos * 16;
  328. int l = chunkcoordintpair.chunkZPos * 16;
  329. this.theProfiler.startSection("getChunk");
  330. Chunk chunk = this.getChunkFromChunkCoords(chunkcoordintpair.chunkXPos, chunkcoordintpair.chunkZPos);
  331. this.func_147467_a(k, l, chunk);
  332. this.theProfiler.endStartSection("tickChunk");
  333. chunk.func_150804_b(false);
  334. this.theProfiler.endStartSection("thunder");
  335. int i1;
  336. int j1;
  337. int k1;
  338. int l1;
  339.  
  340. if (provider.canDoLightning(chunk) && this.rand.nextInt(100000) == 0 && this.isRaining() && this.isThundering())
  341. {
  342. this.updateLCG = this.updateLCG * 3 + 1013904223;
  343. i1 = this.updateLCG >> 2;
  344. j1 = k + (i1 & 15);
  345. k1 = l + (i1 >> 8 & 15);
  346. l1 = this.getPrecipitationHeight(j1, k1);
  347.  
  348. if (this.canLightningStrikeAt(j1, l1, k1))
  349. {
  350. this.addWeatherEffect(new EntityLightningBolt(this, (double)j1, (double)l1, (double)k1));
  351. }
  352. }
  353.  
  354. this.theProfiler.endStartSection("iceandsnow");
  355.  
  356. if (provider.canDoRainSnowIce(chunk) && this.rand.nextInt(16) == 0)
  357. {
  358. this.updateLCG = this.updateLCG * 3 + 1013904223;
  359. i1 = this.updateLCG >> 2;
  360. j1 = i1 & 15;
  361. k1 = i1 >> 8 & 15;
  362. l1 = this.getPrecipitationHeight(j1 + k, k1 + l);
  363.  
  364. if (this.isBlockFreezableNaturally(j1 + k, l1 - 1, k1 + l))
  365. {
  366. this.setBlock(j1 + k, l1 - 1, k1 + l, Blocks.ice);
  367. }
  368.  
  369. if (this.isRaining() && this.func_147478_e(j1 + k, l1, k1 + l, true))
  370. {
  371. this.setBlock(j1 + k, l1, k1 + l, Blocks.snow_layer);
  372. }
  373.  
  374. if (this.isRaining())
  375. {
  376. BiomeGenBase biomegenbase = this.getBiomeGenForCoords(j1 + k, k1 + l);
  377.  
  378. if (biomegenbase.canSpawnLightningBolt())
  379. {
  380. this.getBlock(j1 + k, l1 - 1, k1 + l).fillWithRain(this, j1 + k, l1 - 1, k1 + l);
  381. }
  382. }
  383. }
  384.  
  385. this.theProfiler.endStartSection("tickBlocks");
  386. ExtendedBlockStorage[] aextendedblockstorage = chunk.getBlockStorageArray();
  387. j1 = aextendedblockstorage.length;
  388.  
  389. for (k1 = 0; k1 < j1; ++k1)
  390. {
  391. ExtendedBlockStorage extendedblockstorage = aextendedblockstorage[k1];
  392.  
  393. if (extendedblockstorage != null && extendedblockstorage.getNeedsRandomTick())
  394. {
  395. for (int i3 = 0; i3 < 3; ++i3)
  396. {
  397. this.updateLCG = this.updateLCG * 3 + 1013904223;
  398. int i2 = this.updateLCG >> 2;
  399. int j2 = i2 & 15;
  400. int k2 = i2 >> 8 & 15;
  401. int l2 = i2 >> 16 & 15;
  402. ++j;
  403. Block block = extendedblockstorage.getBlockByExtId(j2, l2, k2);
  404.  
  405. if (block.getTickRandomly())
  406. {
  407. ++i;
  408. block.updateTick(this, j2 + k, l2 + extendedblockstorage.getYLocation(), k2 + l, this.rand);
  409. }
  410. }
  411. }
  412. }
  413.  
  414. this.theProfiler.endSection();
  415. }
  416. }
  417.  
  418. /**
  419. * Returns true if the given block will receive a scheduled tick in this tick. Args: X, Y, Z, Block
  420. */
  421. public boolean isBlockTickScheduledThisTick(int p_147477_1_, int p_147477_2_, int p_147477_3_, Block p_147477_4_)
  422. {
  423. NextTickListEntry nextticklistentry = new NextTickListEntry(p_147477_1_, p_147477_2_, p_147477_3_, p_147477_4_);
  424. return this.pendingTickListEntriesThisTick.contains(nextticklistentry);
  425. }
  426.  
  427. /**
  428. * Schedules a tick to a block with a delay (Most commonly the tick rate)
  429. */
  430. public void scheduleBlockUpdate(int p_147464_1_, int p_147464_2_, int p_147464_3_, Block p_147464_4_, int p_147464_5_)
  431. {
  432. this.scheduleBlockUpdateWithPriority(p_147464_1_, p_147464_2_, p_147464_3_, p_147464_4_, p_147464_5_, 0);
  433. }
  434.  
  435. public void scheduleBlockUpdateWithPriority(int p_147454_1_, int p_147454_2_, int p_147454_3_, Block p_147454_4_, int p_147454_5_, int p_147454_6_)
  436. {
  437. NextTickListEntry nextticklistentry = new NextTickListEntry(p_147454_1_, p_147454_2_, p_147454_3_, p_147454_4_);
  438. //Keeping here as a note for future when it may be restored.
  439. //boolean isForced = getPersistentChunks().containsKey(new ChunkCoordIntPair(nextticklistentry.xCoord >> 4, nextticklistentry.zCoord >> 4));
  440. //byte b0 = isForced ? 0 : 8;
  441. byte b0 = 0;
  442.  
  443. if (this.scheduledUpdatesAreImmediate && p_147454_4_.getMaterial() != Material.air)
  444. {
  445. if (p_147454_4_.func_149698_L())
  446. {
  447. b0 = 8;
  448.  
  449. if (this.checkChunksExist(nextticklistentry.xCoord - b0, nextticklistentry.yCoord - b0, nextticklistentry.zCoord - b0, nextticklistentry.xCoord + b0, nextticklistentry.yCoord + b0, nextticklistentry.zCoord + b0))
  450. {
  451. Block block1 = this.getBlock(nextticklistentry.xCoord, nextticklistentry.yCoord, nextticklistentry.zCoord);
  452.  
  453. if (block1.getMaterial() != Material.air && block1 == nextticklistentry.func_151351_a())
  454. {
  455. block1.updateTick(this, nextticklistentry.xCoord, nextticklistentry.yCoord, nextticklistentry.zCoord, this.rand);
  456. }
  457. }
  458.  
  459. return;
  460. }
  461.  
  462. p_147454_5_ = 1;
  463. }
  464.  
  465. if (this.checkChunksExist(p_147454_1_ - b0, p_147454_2_ - b0, p_147454_3_ - b0, p_147454_1_ + b0, p_147454_2_ + b0, p_147454_3_ + b0))
  466. {
  467. if (p_147454_4_.getMaterial() != Material.air)
  468. {
  469. nextticklistentry.setScheduledTime((long)p_147454_5_ + this.worldInfo.getWorldTotalTime());
  470. nextticklistentry.setPriority(p_147454_6_);
  471. }
  472.  
  473. if (!this.pendingTickListEntriesHashSet.contains(nextticklistentry))
  474. {
  475. this.pendingTickListEntriesHashSet.add(nextticklistentry);
  476. this.pendingTickListEntriesTreeSet.add(nextticklistentry);
  477. }
  478. }
  479. }
  480.  
  481. public void func_147446_b(int p_147446_1_, int p_147446_2_, int p_147446_3_, Block p_147446_4_, int p_147446_5_, int p_147446_6_)
  482. {
  483. NextTickListEntry nextticklistentry = new NextTickListEntry(p_147446_1_, p_147446_2_, p_147446_3_, p_147446_4_);
  484. nextticklistentry.setPriority(p_147446_6_);
  485.  
  486. if (p_147446_4_.getMaterial() != Material.air)
  487. {
  488. nextticklistentry.setScheduledTime((long)p_147446_5_ + this.worldInfo.getWorldTotalTime());
  489. }
  490.  
  491. if (!this.pendingTickListEntriesHashSet.contains(nextticklistentry))
  492. {
  493. this.pendingTickListEntriesHashSet.add(nextticklistentry);
  494. this.pendingTickListEntriesTreeSet.add(nextticklistentry);
  495. }
  496. }
  497.  
  498. /**
  499. * Updates (and cleans up) entities and tile entities
  500. */
  501. public void updateEntities()
  502. {
  503. if (this.playerEntities.isEmpty() && getPersistentChunks().isEmpty())
  504. {
  505. if (this.updateEntityTick++ >= 1200)
  506. {
  507. return;
  508. }
  509. }
  510. else
  511. {
  512. this.resetUpdateEntityTick();
  513. }
  514.  
  515. super.updateEntities();
  516. }
  517.  
  518. /**
  519. * Resets the updateEntityTick field to 0
  520. */
  521. public void resetUpdateEntityTick()
  522. {
  523. this.updateEntityTick = 0;
  524. }
  525.  
  526. /**
  527. * Runs through the list of updates to run and ticks them
  528. */
  529. public boolean tickUpdates(boolean p_72955_1_)
  530. {
  531. int i = this.pendingTickListEntriesTreeSet.size();
  532.  
  533. if (i != this.pendingTickListEntriesHashSet.size())
  534. {
  535. throw new IllegalStateException("TickNextTick list out of synch");
  536. }
  537. else
  538. {
  539. if (i > 1000)
  540. {
  541. i = 1000;
  542. }
  543.  
  544. this.theProfiler.startSection("cleaning");
  545. NextTickListEntry nextticklistentry;
  546.  
  547. for (int j = 0; j < i; ++j)
  548. {
  549. nextticklistentry = (NextTickListEntry)this.pendingTickListEntriesTreeSet.first();
  550.  
  551. if (!p_72955_1_ && nextticklistentry.scheduledTime > this.worldInfo.getWorldTotalTime())
  552. {
  553. break;
  554. }
  555.  
  556. this.pendingTickListEntriesTreeSet.remove(nextticklistentry);
  557. this.pendingTickListEntriesHashSet.remove(nextticklistentry);
  558. this.pendingTickListEntriesThisTick.add(nextticklistentry);
  559. }
  560.  
  561. this.theProfiler.endSection();
  562. this.theProfiler.startSection("ticking");
  563. Iterator iterator = this.pendingTickListEntriesThisTick.iterator();
  564.  
  565. while (iterator.hasNext())
  566. {
  567. nextticklistentry = (NextTickListEntry)iterator.next();
  568. iterator.remove();
  569. //Keeping here as a note for future when it may be restored.
  570. //boolean isForced = getPersistentChunks().containsKey(new ChunkCoordIntPair(nextticklistentry.xCoord >> 4, nextticklistentry.zCoord >> 4));
  571. //byte b0 = isForced ? 0 : 8;
  572. byte b0 = 0;
  573.  
  574. if (this.checkChunksExist(nextticklistentry.xCoord - b0, nextticklistentry.yCoord - b0, nextticklistentry.zCoord - b0, nextticklistentry.xCoord + b0, nextticklistentry.yCoord + b0, nextticklistentry.zCoord + b0))
  575. {
  576. Block block = this.getBlock(nextticklistentry.xCoord, nextticklistentry.yCoord, nextticklistentry.zCoord);
  577.  
  578. if (block.getMaterial() != Material.air && Block.isEqualTo(block, nextticklistentry.func_151351_a()))
  579. {
  580. try
  581. {
  582. block.updateTick(this, nextticklistentry.xCoord, nextticklistentry.yCoord, nextticklistentry.zCoord, this.rand);
  583. }
  584. catch (Throwable throwable1)
  585. {
  586. CrashReport crashreport = CrashReport.makeCrashReport(throwable1, "Exception while ticking a block");
  587. CrashReportCategory crashreportcategory = crashreport.makeCategory("Block being ticked");
  588. int k;
  589.  
  590. try
  591. {
  592. k = this.getBlockMetadata(nextticklistentry.xCoord, nextticklistentry.yCoord, nextticklistentry.zCoord);
  593. }
  594. catch (Throwable throwable)
  595. {
  596. k = -1;
  597. }
  598.  
  599. CrashReportCategory.func_147153_a(crashreportcategory, nextticklistentry.xCoord, nextticklistentry.yCoord, nextticklistentry.zCoord, block, k);
  600. throw new ReportedException(crashreport);
  601. }
  602. }
  603. }
  604. else
  605. {
  606. this.scheduleBlockUpdate(nextticklistentry.xCoord, nextticklistentry.yCoord, nextticklistentry.zCoord, nextticklistentry.func_151351_a(), 0);
  607. }
  608. }
  609.  
  610. this.theProfiler.endSection();
  611. this.pendingTickListEntriesThisTick.clear();
  612. return !this.pendingTickListEntriesTreeSet.isEmpty();
  613. }
  614. }
  615.  
  616. public List getPendingBlockUpdates(Chunk p_72920_1_, boolean p_72920_2_)
  617. {
  618. ArrayList arraylist = null;
  619. ChunkCoordIntPair chunkcoordintpair = p_72920_1_.getChunkCoordIntPair();
  620. int i = (chunkcoordintpair.chunkXPos << 4) - 2;
  621. int j = i + 16 + 2;
  622. int k = (chunkcoordintpair.chunkZPos << 4) - 2;
  623. int l = k + 16 + 2;
  624.  
  625. for (int i1 = 0; i1 < 2; ++i1)
  626. {
  627. Iterator iterator;
  628.  
  629. if (i1 == 0)
  630. {
  631. iterator = this.pendingTickListEntriesTreeSet.iterator();
  632. }
  633. else
  634. {
  635. iterator = this.pendingTickListEntriesThisTick.iterator();
  636.  
  637. if (!this.pendingTickListEntriesThisTick.isEmpty())
  638. {
  639. logger.debug("toBeTicked = " + this.pendingTickListEntriesThisTick.size());
  640. }
  641. }
  642.  
  643. while (iterator.hasNext())
  644. {
  645. NextTickListEntry nextticklistentry = (NextTickListEntry)iterator.next();
  646.  
  647. if (nextticklistentry.xCoord >= i && nextticklistentry.xCoord < j && nextticklistentry.zCoord >= k && nextticklistentry.zCoord < l)
  648. {
  649. if (p_72920_2_)
  650. {
  651. this.pendingTickListEntriesHashSet.remove(nextticklistentry);
  652. iterator.remove();
  653. }
  654.  
  655. if (arraylist == null)
  656. {
  657. arraylist = new ArrayList();
  658. }
  659.  
  660. arraylist.add(nextticklistentry);
  661. }
  662. }
  663. }
  664.  
  665. return arraylist;
  666. }
  667.  
  668. /**
  669. * Will update the entity in the world if the chunk the entity is in is currently loaded or its forced to update.
  670. * Args: entity, forceUpdate
  671. */
  672. public void updateEntityWithOptionalForce(Entity p_72866_1_, boolean p_72866_2_)
  673. {
  674. if (!this.mcServer.getCanSpawnAnimals() && (p_72866_1_ instanceof EntityAnimal || p_72866_1_ instanceof EntityWaterMob))
  675. {
  676. p_72866_1_.setDead();
  677. }
  678.  
  679. if (!this.mcServer.getCanSpawnNPCs() && p_72866_1_ instanceof INpc)
  680. {
  681. p_72866_1_.setDead();
  682. }
  683.  
  684. super.updateEntityWithOptionalForce(p_72866_1_, p_72866_2_);
  685. }
  686.  
  687. /**
  688. * Creates the chunk provider for this world. Called in the constructor. Retrieves provider from worldProvider?
  689. */
  690. protected IChunkProvider createChunkProvider()
  691. {
  692. IChunkLoader ichunkloader = this.saveHandler.getChunkLoader(this.provider);
  693. this.theChunkProviderServer = new ChunkProviderServer(this, ichunkloader, this.provider.createChunkGenerator());
  694. return this.theChunkProviderServer;
  695. }
  696.  
  697. 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_)
  698. {
  699. ArrayList arraylist = new ArrayList();
  700.  
  701. for(int x = (p_147486_1_ >> 4); x <= (p_147486_4_ >> 4); x++)
  702. {
  703. for(int z = (p_147486_3_ >> 4); z <= (p_147486_6_ >> 4); z++)
  704. {
  705. Chunk chunk = getChunkFromChunkCoords(x, z);
  706. if (chunk != null)
  707. {
  708. for(Object obj : chunk.chunkTileEntityMap.values())
  709. {
  710. TileEntity entity = (TileEntity)obj;
  711. if (!entity.isInvalid())
  712. {
  713. if (entity.xCoord >= p_147486_1_ && entity.yCoord >= p_147486_2_ && entity.zCoord >= p_147486_3_ &&
  714. entity.xCoord <= p_147486_4_ && entity.yCoord <= p_147486_5_ && entity.zCoord <= p_147486_6_)
  715. {
  716. arraylist.add(entity);
  717. }
  718. }
  719. }
  720. }
  721. }
  722. }
  723.  
  724. return arraylist;
  725. }
  726.  
  727. /**
  728. * Called when checking if a certain block can be mined or not. The 'spawn safe zone' check is located here.
  729. */
  730. public boolean canMineBlock(EntityPlayer p_72962_1_, int p_72962_2_, int p_72962_3_, int p_72962_4_)
  731. {
  732. return super.canMineBlock(p_72962_1_, p_72962_2_, p_72962_3_, p_72962_4_);
  733. }
  734.  
  735. public boolean canMineBlockBody(EntityPlayer par1EntityPlayer, int par2, int par3, int par4)
  736. {
  737. return !this.mcServer.isBlockProtected(this, par2, par3, par4, par1EntityPlayer);
  738. }
  739.  
  740. protected void initialize(WorldSettings p_72963_1_)
  741. {
  742. if (this.entityIdMap == null)
  743. {
  744. this.entityIdMap = new IntHashMap();
  745. }
  746.  
  747. if (this.pendingTickListEntriesHashSet == null)
  748. {
  749. this.pendingTickListEntriesHashSet = new HashSet();
  750. }
  751.  
  752. if (this.pendingTickListEntriesTreeSet == null)
  753. {
  754. this.pendingTickListEntriesTreeSet = new TreeSet();
  755. }
  756.  
  757. this.createSpawnPosition(p_72963_1_);
  758. super.initialize(p_72963_1_);
  759. }
  760.  
  761. /**
  762. * creates a spawn position at random within 256 blocks of 0,0
  763. */
  764. protected void createSpawnPosition(WorldSettings p_73052_1_)
  765. {
  766. if (!this.provider.canRespawnHere())
  767. {
  768. this.worldInfo.setSpawnPosition(0, this.provider.getAverageGroundLevel(), 0);
  769. }
  770. else
  771. {
  772. this.findingSpawnPoint = true;
  773. WorldChunkManager worldchunkmanager = this.provider.worldChunkMgr;
  774. List list = worldchunkmanager.getBiomesToSpawnIn();
  775. Random random = new Random(this.getSeed());
  776. ChunkPosition chunkposition = worldchunkmanager.findBiomePosition(0, 0, 256, list, random);
  777. int i = 0;
  778. int j = this.provider.getAverageGroundLevel();
  779. int k = 0;
  780.  
  781. if (chunkposition != null)
  782. {
  783. i = chunkposition.chunkPosX;
  784. k = chunkposition.chunkPosZ;
  785. }
  786. else
  787. {
  788. logger.warn("Unable to find spawn biome");
  789. }
  790.  
  791. int l = 0;
  792.  
  793. while (!this.provider.canCoordinateBeSpawn(i, k))
  794. {
  795. i += random.nextInt(64) - random.nextInt(64);
  796. k += random.nextInt(64) - random.nextInt(64);
  797. ++l;
  798.  
  799. if (l == 1000)
  800. {
  801. break;
  802. }
  803. }
  804.  
  805. this.worldInfo.setSpawnPosition(i, j, k);
  806. this.findingSpawnPoint = false;
  807.  
  808. if (p_73052_1_.isBonusChestEnabled())
  809. {
  810. this.createBonusChest();
  811. }
  812. }
  813. }
  814.  
  815. /**
  816. * Creates the bonus chest in the world.
  817. */
  818. protected void createBonusChest()
  819. {
  820. WorldGeneratorBonusChest worldgeneratorbonuschest = new WorldGeneratorBonusChest(ChestGenHooks.getItems(BONUS_CHEST, rand), ChestGenHooks.getCount(BONUS_CHEST, rand));
  821.  
  822. for (int i = 0; i < 10; ++i)
  823. {
  824. int j = this.worldInfo.getSpawnX() + this.rand.nextInt(6) - this.rand.nextInt(6);
  825. int k = this.worldInfo.getSpawnZ() + this.rand.nextInt(6) - this.rand.nextInt(6);
  826. int l = this.getTopSolidOrLiquidBlock(j, k) + 1;
  827.  
  828. if (worldgeneratorbonuschest.generate(this, this.rand, j, l, k))
  829. {
  830. break;
  831. }
  832. }
  833. }
  834.  
  835. /**
  836. * Gets the hard-coded portal location to use when entering this dimension.
  837. */
  838. public ChunkCoordinates getEntrancePortalLocation()
  839. {
  840. return this.provider.getEntrancePortalLocation();
  841. }
  842.  
  843. /**
  844. * Saves all chunks to disk while updating progress bar.
  845. */
  846. public void saveAllChunks(boolean p_73044_1_, IProgressUpdate p_73044_2_) throws MinecraftException
  847. {
  848. if (this.chunkProvider.canSave())
  849. {
  850. if (p_73044_2_ != null)
  851. {
  852. p_73044_2_.displayProgressMessage("Saving level");
  853. }
  854.  
  855. this.saveLevel();
  856.  
  857. if (p_73044_2_ != null)
  858. {
  859. p_73044_2_.resetProgresAndWorkingMessage("Saving chunks");
  860. }
  861.  
  862. this.chunkProvider.saveChunks(p_73044_1_, p_73044_2_);
  863. MinecraftForge.EVENT_BUS.post(new WorldEvent.Save(this));
  864. ArrayList arraylist = Lists.newArrayList(this.theChunkProviderServer.func_152380_a());
  865. Iterator iterator = arraylist.iterator();
  866.  
  867. while (iterator.hasNext())
  868. {
  869. Chunk chunk = (Chunk)iterator.next();
  870.  
  871. if (chunk != null && !this.thePlayerManager.func_152621_a(chunk.xPosition, chunk.zPosition))
  872. {
  873. this.theChunkProviderServer.unloadChunksIfNotNearSpawn(chunk.xPosition, chunk.zPosition);
  874. }
  875. }
  876. }
  877. }
  878.  
  879. /**
  880. * saves chunk data - currently only called during execution of the Save All command
  881. */
  882. public void saveChunkData()
  883. {
  884. if (this.chunkProvider.canSave())
  885. {
  886. this.chunkProvider.saveExtraData();
  887. }
  888. }
  889.  
  890. /**
  891. * Saves the chunks to disk.
  892. */
  893. protected void saveLevel() throws MinecraftException
  894. {
  895. this.checkSessionLock();
  896. this.saveHandler.saveWorldInfoWithPlayer(this.worldInfo, this.mcServer.getConfigurationManager().getHostPlayerData());
  897. this.mapStorage.saveAllData();
  898. this.perWorldStorage.saveAllData();
  899. }
  900.  
  901. public void onEntityAdded(Entity p_72923_1_)
  902. {
  903. super.onEntityAdded(p_72923_1_);
  904. this.entityIdMap.addKey(p_72923_1_.getEntityId(), p_72923_1_);
  905. Entity[] aentity = p_72923_1_.getParts();
  906.  
  907. if (aentity != null)
  908. {
  909. for (int i = 0; i < aentity.length; ++i)
  910. {
  911. this.entityIdMap.addKey(aentity[i].getEntityId(), aentity[i]);
  912. }
  913. }
  914. }
  915.  
  916. public void onEntityRemoved(Entity p_72847_1_)
  917. {
  918. super.onEntityRemoved(p_72847_1_);
  919. this.entityIdMap.removeObject(p_72847_1_.getEntityId());
  920. Entity[] aentity = p_72847_1_.getParts();
  921.  
  922. if (aentity != null)
  923. {
  924. for (int i = 0; i < aentity.length; ++i)
  925. {
  926. this.entityIdMap.removeObject(aentity[i].getEntityId());
  927. }
  928. }
  929. }
  930.  
  931. /**
  932. * Returns the Entity with the given ID, or null if it doesn't exist in this World.
  933. */
  934. public Entity getEntityByID(int p_73045_1_)
  935. {
  936. return (Entity)this.entityIdMap.lookup(p_73045_1_);
  937. }
  938.  
  939. /**
  940. * adds a lightning bolt to the list of lightning bolts in this world.
  941. */
  942. public boolean addWeatherEffect(Entity p_72942_1_)
  943. {
  944. if (super.addWeatherEffect(p_72942_1_))
  945. {
  946. this.mcServer.getConfigurationManager().sendToAllNear(p_72942_1_.posX, p_72942_1_.posY, p_72942_1_.posZ, 512.0D, this.provider.dimensionId, new S2CPacketSpawnGlobalEntity(p_72942_1_));
  947. return true;
  948. }
  949. else
  950. {
  951. return false;
  952. }
  953. }
  954.  
  955. /**
  956. * sends a Packet 38 (Entity Status) to all tracked players of that entity
  957. */
  958. public void setEntityState(Entity p_72960_1_, byte p_72960_2_)
  959. {
  960. this.getEntityTracker().func_151248_b(p_72960_1_, new S19PacketEntityStatus(p_72960_1_, p_72960_2_));
  961. }
  962.  
  963. /**
  964. * returns a new explosion. Does initiation (at time of writing Explosion is not finished)
  965. */
  966. 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_)
  967. {
  968. Explosion explosion = new Explosion(this, p_72885_1_, p_72885_2_, p_72885_4_, p_72885_6_, p_72885_8_);
  969. explosion.isFlaming = p_72885_9_;
  970. explosion.isSmoking = p_72885_10_;
  971. explosion.doExplosionA();
  972. explosion.doExplosionB(false);
  973.  
  974. if (!p_72885_10_)
  975. {
  976. explosion.affectedBlockPositions.clear();
  977. }
  978.  
  979. Iterator iterator = this.playerEntities.iterator();
  980.  
  981. while (iterator.hasNext())
  982. {
  983. EntityPlayer entityplayer = (EntityPlayer)iterator.next();
  984.  
  985. if (entityplayer.getDistanceSq(p_72885_2_, p_72885_4_, p_72885_6_) < 4096.0D)
  986. {
  987. ((EntityPlayerMP)entityplayer).playerNetServerHandler.sendPacket(new S27PacketExplosion(p_72885_2_, p_72885_4_, p_72885_6_, p_72885_8_, explosion.affectedBlockPositions, (Vec3)explosion.func_77277_b().get(entityplayer)));
  988. }
  989. }
  990.  
  991. return explosion;
  992. }
  993.  
  994. /**
  995. * Adds a block event with the given Args to the blockEventCache. During the next tick(), the block specified will
  996. * have its onBlockEvent handler called with the given parameters. Args: X,Y,Z, Block, EventID, EventParameter
  997. */
  998. public void addBlockEvent(int p_147452_1_, int p_147452_2_, int p_147452_3_, Block p_147452_4_, int p_147452_5_, int p_147452_6_)
  999. {
  1000. BlockEventData blockeventdata = new BlockEventData(p_147452_1_, p_147452_2_, p_147452_3_, p_147452_4_, p_147452_5_, p_147452_6_);
  1001. Iterator iterator = this.field_147490_S[this.blockEventCacheIndex].iterator();
  1002. BlockEventData blockeventdata1;
  1003.  
  1004. do
  1005. {
  1006. if (!iterator.hasNext())
  1007. {
  1008. this.field_147490_S[this.blockEventCacheIndex].add(blockeventdata);
  1009. return;
  1010. }
  1011.  
  1012. blockeventdata1 = (BlockEventData)iterator.next();
  1013. }
  1014. while (!blockeventdata1.equals(blockeventdata));
  1015. }
  1016.  
  1017. private void func_147488_Z()
  1018. {
  1019. while (!this.field_147490_S[this.blockEventCacheIndex].isEmpty())
  1020. {
  1021. int i = this.blockEventCacheIndex;
  1022. this.blockEventCacheIndex ^= 1;
  1023. Iterator iterator = this.field_147490_S[i].iterator();
  1024.  
  1025. while (iterator.hasNext())
  1026. {
  1027. BlockEventData blockeventdata = (BlockEventData)iterator.next();
  1028.  
  1029. if (this.func_147485_a(blockeventdata))
  1030. {
  1031. this.mcServer.getConfigurationManager().sendToAllNear((double)blockeventdata.func_151340_a(), (double)blockeventdata.func_151342_b(), (double)blockeventdata.func_151341_c(), 64.0D, this.provider.dimensionId, new S24PacketBlockAction(blockeventdata.func_151340_a(), blockeventdata.func_151342_b(), blockeventdata.func_151341_c(), blockeventdata.getBlock(), blockeventdata.getEventID(), blockeventdata.getEventParameter()));
  1032. }
  1033. }
  1034.  
  1035. this.field_147490_S[i].clear();
  1036. }
  1037. }
  1038.  
  1039. private boolean func_147485_a(BlockEventData p_147485_1_)
  1040. {
  1041. Block block = this.getBlock(p_147485_1_.func_151340_a(), p_147485_1_.func_151342_b(), p_147485_1_.func_151341_c());
  1042. return block == p_147485_1_.getBlock() ? block.onBlockEventReceived(this, p_147485_1_.func_151340_a(), p_147485_1_.func_151342_b(), p_147485_1_.func_151341_c(), p_147485_1_.getEventID(), p_147485_1_.getEventParameter()) : false;
  1043. }
  1044.  
  1045. /**
  1046. * Syncs all changes to disk and wait for completion.
  1047. */
  1048. public void flush()
  1049. {
  1050. this.saveHandler.flush();
  1051. }
  1052.  
  1053. /**
  1054. * Updates all weather states.
  1055. */
  1056. protected void updateWeather()
  1057. {
  1058. boolean flag = this.isRaining();
  1059. super.updateWeather();
  1060.  
  1061. if (this.prevRainingStrength != this.rainingStrength)
  1062. {
  1063. this.mcServer.getConfigurationManager().sendPacketToAllPlayersInDimension(new S2BPacketChangeGameState(7, this.rainingStrength), this.provider.dimensionId);
  1064. }
  1065.  
  1066. if (this.prevThunderingStrength != this.thunderingStrength)
  1067. {
  1068. this.mcServer.getConfigurationManager().sendPacketToAllPlayersInDimension(new S2BPacketChangeGameState(8, this.thunderingStrength), this.provider.dimensionId);
  1069. }
  1070.  
  1071. if (flag != this.isRaining())
  1072. {
  1073. if (flag)
  1074. {
  1075. this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new S2BPacketChangeGameState(2, 0.0F));
  1076. }
  1077. else
  1078. {
  1079. this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new S2BPacketChangeGameState(1, 0.0F));
  1080. }
  1081.  
  1082. this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new S2BPacketChangeGameState(7, this.rainingStrength));
  1083. this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new S2BPacketChangeGameState(8, this.thunderingStrength));
  1084. }
  1085. }
  1086.  
  1087. protected int func_152379_p()
  1088. {
  1089. return this.mcServer.getConfigurationManager().getViewDistance();
  1090. }
  1091.  
  1092. public MinecraftServer func_73046_m()
  1093. {
  1094. return this.mcServer;
  1095. }
  1096.  
  1097. /**
  1098. * Gets the EntityTracker
  1099. */
  1100. public EntityTracker getEntityTracker()
  1101. {
  1102. return this.theEntityTracker;
  1103. }
  1104.  
  1105. public PlayerManager getPlayerManager()
  1106. {
  1107. return this.thePlayerManager;
  1108. }
  1109.  
  1110. public Teleporter getDefaultTeleporter()
  1111. {
  1112. return this.worldTeleporter;
  1113. }
  1114.  
  1115. public void func_147487_a(String p_147487_1_, double p_147487_2_, double p_147487_4_, double p_147487_6_, int p_147487_8_, double p_147487_9_, double p_147487_11_, double p_147487_13_, double p_147487_15_)
  1116. {
  1117. S2APacketParticles s2apacketparticles = new S2APacketParticles(p_147487_1_, (float)p_147487_2_, (float)p_147487_4_, (float)p_147487_6_, (float)p_147487_9_, (float)p_147487_11_, (float)p_147487_13_, (float)p_147487_15_, p_147487_8_);
  1118.  
  1119. for (int j = 0; j < this.playerEntities.size(); ++j)
  1120. {
  1121. EntityPlayerMP entityplayermp = (EntityPlayerMP)this.playerEntities.get(j);
  1122. ChunkCoordinates chunkcoordinates = entityplayermp.getPlayerCoordinates();
  1123. double d7 = p_147487_2_ - (double)chunkcoordinates.posX;
  1124. double d8 = p_147487_4_ - (double)chunkcoordinates.posY;
  1125. double d9 = p_147487_6_ - (double)chunkcoordinates.posZ;
  1126. double d10 = d7 * d7 + d8 * d8 + d9 * d9;
  1127.  
  1128. if (d10 <= 256.0D)
  1129. {
  1130. entityplayermp.playerNetServerHandler.sendPacket(s2apacketparticles);
  1131. }
  1132. }
  1133. }
  1134.  
  1135. public File getChunkSaveLocation()
  1136. {
  1137. return ((AnvilChunkLoader)theChunkProviderServer.currentChunkLoader).chunkSaveLocation;
  1138. }
  1139.  
  1140. static class ServerBlockEventList extends ArrayList
  1141. {
  1142. private static final String __OBFID = "CL_00001439";
  1143.  
  1144. private ServerBlockEventList() {}
  1145.  
  1146. ServerBlockEventList(Object p_i1521_1_)
  1147. {
  1148. this();
  1149. }
  1150. }
  1151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement