diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..82b6551
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1b9efa5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+jars/*
+reobf/*
+bin/*
+game/*
+.settings/*
+source/*
\ No newline at end of file
diff --git a/.project b/.project
new file mode 100644
index 0000000..080e841
--- /dev/null
+++ b/.project
@@ -0,0 +1,53 @@
+
+
+ Minecraft Server
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
+
+ libraries
+ 2
+ $%7BPARENT-1-PROJECT_LOC%7D/libraries
+
+
+
+
+ 4987547523683486455
+
+ 9
+
+ org.eclipse.ui.ide.multiFilter
+ 1.0-name-matches-false-false-src
+
+
+
+ 4987547523683486456
+
+ 9
+
+ org.eclipse.ui.ide.multiFilter
+ 1.0-name-matches-false-false-jars
+
+
+
+ 4987547523683486457
+
+ 9
+
+ org.eclipse.ui.ide.multiFilter
+ 1.0-name-matches-false-false-source
+
+
+
+
diff --git a/Server.launch b/Server.launch
new file mode 100644
index 0000000..bc4572e
--- /dev/null
+++ b/Server.launch
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/md5/original.md5 b/md5/original.md5
new file mode 100644
index 0000000..ac1288e
--- /dev/null
+++ b/md5/original.md5
@@ -0,0 +1,444 @@
+net/minecraft/server/MinecraftServer 74d80014ab5a052578e5f6d80f8b5308
+net/minecraft/src/NetHandler 40ed615a01ab0e2f8c0944f34219a9cb
+net/minecraft/src/EntityTrackerEntry 04ffe08c42926c1707d00b6fc50c3e52
+net/minecraft/src/NBTTagCompound e918846624599a4d37c22a1d45913866
+net/minecraft/src/MapInfo add57ad3c2b025989cb698e59191a43a
+net/minecraft/src/Packet51MapChunk 5dd881c5f2b874b748ef0648f6ee9911
+net/minecraft/src/Packet50PreChunk 1ac386d28f2d78060f5639644f166af4
+net/minecraft/src/ItemSeeds e4dc0b1d079a687de085c52836fdcdc3
+net/minecraft/src/BlockSnowBlock 06b388fcb0195f0e9f815c228667587e
+net/minecraft/src/RecipesIngots a12d26dc067f8b14a05228628d3c5a9e
+net/minecraft/src/ItemRecord 9cd0675abadb70fdaab1b8193e3b22b0
+net/minecraft/src/StatTypeTime 6c4f3d1691ce7522c719d895943875b7
+net/minecraft/src/EntityItem 1f7126bca069dddc5d5f602321202fae
+net/minecraft/src/WorldGenDungeons 48a97b5cb4fbdb0d5b59eed4cf4179a3
+net/minecraft/src/BlockButton f8695ddca3df7e61139f101f29ea7771
+net/minecraft/src/Item 34f6f24f7b9d41a89e86c6d6403924db
+net/minecraft/src/BlockSand f6a1537a6d9c5d922311f56e6c36b9fa
+net/minecraft/src/EntityFish 8808422c2a25ff3af810116dddaa34a6
+net/minecraft/src/ItemCookie ec08c7375242b8e2f660e057dc457313
+net/minecraft/src/WorldGenDeadBush 99066f99a33f0e845c97896ede9b0912
+net/minecraft/src/BlockGlass 4843b9ed50cdf01bbe284a7dda30a84f
+net/minecraft/src/BlockFence 4f8de463fcfa90c46cf002fa3feb86fb
+net/minecraft/src/Packet52MultiBlockChange a41b64bb4f97c204a7e45cb87d1a11ba
+net/minecraft/src/BlockNetherrack 37299eccabe4fa07a862418a595051b9
+net/minecraft/src/IStatType 0ea308d781b70a297eb4bb7d0371041f
+net/minecraft/src/InventoryCraftResult c6d993864aab72abe39592f6ffa95721
+net/minecraft/src/Packet38EntityStatus 5522616380c08ed5017fdd3ba2546596
+net/minecraft/src/IPlayerFileData bffe74a5386691e7a52d2bebd5254564
+net/minecraft/src/EntityWeatherEffect 095e4777d4c0cded805b53d88588517b
+net/minecraft/src/ItemRedstone 73d2244bc693df8b423a89540f042dcc
+net/minecraft/src/NoiseGenerator2 7eaa2d716964a6a94cfc37b1d5d6deb3
+net/minecraft/src/ItemBoat fa8002cabbeff36aee0ba72cf8e8c852
+net/minecraft/src/ItemMapBase ba088d195b640fbc7b7f7298a7a1e345
+net/minecraft/src/BlockFlower 6deab3e879c239a136724d53371a8d65
+net/minecraft/src/ItemStack 972fd49a1897a9da26de7db67e69db42
+net/minecraft/src/Packet71Weather d04a6b9463b0b2f4849721b600fefb8e
+net/minecraft/src/ConsoleCommandHandler 9c4dfb448a029713fa8d8cb30f18f546
+net/minecraft/src/Packet29DestroyEntity 9fe9cbb9f9a4d2ddc25cfe3bdcb0e84c
+net/minecraft/src/BlockLadder 7b00bd86fa5ec990daab2a4eb27c1997
+net/minecraft/src/EntityArrow e97ffbc2867fec32055511c4e3bfca22
+net/minecraft/src/BlockWorkbench e5fea63aef7d1726dd65d33928936ad5
+net/minecraft/src/BlockGravel 0937b3ca08c59bdbd46ae7fd26a393b1
+net/minecraft/src/BlockDeadBush 2962d4b119cec6c57f632618492a4f5c
+net/minecraft/src/WorldServerMulti 42de682bcb18e4c400d540d122e6e064
+net/minecraft/src/NoiseGenerator 6d2bf3399aaf20f9ffa2882f610bc474
+net/minecraft/src/WorldGenMinable ff31f3f811086edaa2920b9ec7458d17
+net/minecraft/src/PlayerNBTManager b42ec05be53eb5a3864f968c3b565d74
+net/minecraft/src/ItemTool 111e283c23893009d07698e45276dcb4
+net/minecraft/src/BlockSponge ec94d9a11488651f6068345ffded7bff
+net/minecraft/src/WorldGenHellLava 32cbeaceab4b29179fec5cdae6c26d21
+net/minecraft/src/TileEntityRecordPlayer be3cd0e2fdafcb4c3d33b956f2d94bc0
+net/minecraft/src/WorldGenReed d0cce2600754e1f9484039d8e5c4465f
+net/minecraft/src/BlockCrops 37fe69604dab253c8498ed387edd484b
+net/minecraft/src/EntitySkeleton 7655ed48ed34c4616d0ae5e0327ec621
+net/minecraft/src/ItemEgg 7acce4bcd7fbf73fd605fa042747668d
+net/minecraft/src/Packet60Explosion eb63e95101288453c2e568cfe3bf2652
+net/minecraft/src/BlockObsidian 944f6cf0005ba3bb6891d038e088527c
+net/minecraft/src/BlockSoulSand bfa4b1fbc3f32db4b58c810da5ce4654
+net/minecraft/src/BlockFire f0a2034d3bf8e47a67316a8cca0e5865
+net/minecraft/src/ContainerChest 2c24753e7e835ea51cc476f927ad1935
+net/minecraft/src/Packet24MobSpawn 5033400ef95b57c820e7f3913b8dfe21
+net/minecraft/src/ItemSaddle bf5929a67b8343421cdccc9d48eb2d82
+net/minecraft/src/EntityChicken a9269347c7a79fc43becd7dd33d20a49
+net/minecraft/src/StatCollector d11a606be8bc79eb58635519af74d174
+net/minecraft/src/ShapedRecipes 534000120ceadbcaa79dbba7a9ba8b33
+net/minecraft/src/ChunkProvider b346f69e17bc2a4f136a947a1f1f5d5c
+net/minecraft/src/ItemFlintAndSteel ddee391aedcd9a9410f9b0e0498163a9
+net/minecraft/src/SlotArmor 6e93c56afdc0492b67c57760e10851de
+net/minecraft/src/ItemPickaxe 2d06effc07255282ec5ea803c63cfc64
+net/minecraft/src/StringTranslate a6538cfe5a6eca8f9d521f81288b19f5
+net/minecraft/src/BlockStationary d1b77f31fb9c8a8e1be5e6cb6b57686b
+net/minecraft/src/ItemAxe c5118d998081a55fd662168725a1f42c
+net/minecraft/src/BlockSapling 3ae5a6a11e63ee9308dd10ebaa8d2d83
+net/minecraft/src/Packet18Animation 57da88f529ffae6ae24ef0c627857e48
+net/minecraft/src/WorldGenCactus 4a1ba44a035a99cccca3e94e20cc3c26
+net/minecraft/src/EntityGhast 101f6b9ff5e5ebef85409653548a5b3e
+net/minecraft/src/ItemSword e01eeab2bb830f4d53d1353ff54eab66
+net/minecraft/src/EntityList 1c38585f970bab76bba7cb9ce0f9f66a
+net/minecraft/src/EntitySlime 1a7c3b9981b9e17c5b8894d98ca18ae9
+net/minecraft/src/SaveOldDir 7953cd67fffd4117e3f6a5a0d4703d2e
+net/minecraft/src/Packet25EntityPainting 5a031244e0c41bc94b3f22b25721a0ad
+net/minecraft/src/RegionFileCache e8158eb715dd0a9c557845ea8d230e92
+net/minecraft/src/Packet28EntityVelocity 39209513acf4f4a5953870625a8a5da1
+net/minecraft/src/EntityGiantZombie 140abdc2cb03550b3db55c441ca9db44
+net/minecraft/src/TileEntityPiston 677f07988250b10949f7e256edf591be
+net/minecraft/src/EntityLightningBolt 3ae8527b8aada92a8337dc76ed97498f
+net/minecraft/src/WorldProviderSky 81dfe2b5f969f6aaa52139af139dc3e2
+net/minecraft/src/EntitySquid f62844986cdf2d45d59d3f940d9b389a
+net/minecraft/src/StatList 34e513f0d25b0a2c4e732debbbca448e
+net/minecraft/src/DataWatcher 97b8e045ba3270b520ccb62499861a70
+net/minecraft/src/ISaveHandler d9fa202f71549aa69586b92e1fc58031
+net/minecraft/src/Packet19EntityAction 044c22fa918576e7b175fdebf474cc1a
+net/minecraft/src/MapColor a46e6ee19a079e947ce091006a3a9cb5
+net/minecraft/src/NetLoginHandler 91793e4ccde755281d7cf0d376c6ac4a
+net/minecraft/src/NBTTagLong 8078672f86016518857a83da24aad04b
+net/minecraft/src/ChatAllowedCharacters 2e9a20d13e7625d46fe217ff02aceb04
+net/minecraft/src/RecipesTools 8a194856553330361595c00bc543fcb9
+net/minecraft/src/WorldManager 5b0966bb5a96b209f141741ba59a2a6f
+net/minecraft/src/NetServerHandler 9923832a9a608970cbe31e9e59db9927
+net/minecraft/src/Packet9Respawn 2ded295830357b3b4f5178140d133cd6
+net/minecraft/src/Packet8UpdateHealth e86226c3d8493751921f54039e2701c8
+net/minecraft/src/BlockGlowStone 2125eaf93a3d1ea980d3c0da108daf99
+net/minecraft/src/Packet14BlockDig ab6dedaced50a24ac7ed857458706458
+net/minecraft/src/RecipesFood 3312935c257073b73fb45d37f37aca3d
+net/minecraft/src/Packet11PlayerPosition 68ca78add786707e5f307e6407c476d5
+net/minecraft/src/EnumArt 037b750b9755b52869968a6a96070cf4
+net/minecraft/src/StatCrafting 79728305e54b5618a47dbec57ca03dcf
+net/minecraft/src/Packet10Flying 93a54ab2f0ac8b3d0bef816056add9c7
+net/minecraft/src/BiomeGenForest 815d03e409886e1ad2f32c30ce6946e4
+net/minecraft/src/WorldGenTaiga2 c020322429552fd059bab47238771222
+net/minecraft/src/StepSoundStone d92f03abbb75382c50fecdbcd2e2027f
+net/minecraft/src/ThreadSleepForever 56004aa8f7c49d024b09f9dff934f7f5
+net/minecraft/src/NoiseGeneratorPerlin 3d9f20020de8bb5b8cdc3c6266c74e28
+net/minecraft/src/EnumSkyBlock 38634316fbc69daba023b08e5199fd0e
+net/minecraft/src/BlockLeaves 21ec3e5a42eef1e7e736379a254246a5
+net/minecraft/src/GuiLogOutputHandler d3e9d0be10752acfdf714a0dadc39566
+net/minecraft/src/EnumMobType 67f79e9368e7d1c55409aafcc9e53afb
+net/minecraft/src/SpawnerAnimals b4ddaa9311ff8bbdf85c384e0fff9656
+net/minecraft/src/BlockRedstoneRepeater 558caaf7dc6748dd8b457b6ea586d82a
+net/minecraft/src/EntityCreature 83fadfd2ebae5459bff33519fe23d273
+net/minecraft/src/Teleporter 1121cd37016d7009d4b01d2119a47783
+net/minecraft/src/ServerGuiFocusAdapter 9edf201469d6e68b413e7aa7ce99d469
+net/minecraft/src/ChunkProviderHell 8d53d7fe8b5301643f9ee699d46f51f4
+net/minecraft/src/ItemArmor 8c2f832af3ecff2e1d96897f3ae93a65
+net/minecraft/src/BlockPortal 96106bdc169ee09a86e1a336a1cd228d
+net/minecraft/src/EntityMob eb2c35873a3424ba9014d88ad8d0908f
+net/minecraft/src/EntitySnowball 6ce92f55455c6e3ddb631bfb543fcf8f
+net/minecraft/src/ContainerWorkbench 4b675b49107f05c6d3004cf000f79718
+net/minecraft/src/Packet30Entity 353f6a40277eba3ecf48231fc8588a93
+net/minecraft/src/Packet100OpenWindow 7abdf4fc0c92c2c7d7d6c9aa86859e73
+net/minecraft/src/BlockLeavesBase f889a97ca1d1ca7abb0d99bd1a0ac200
+net/minecraft/src/ServerConfigurationManager 1b49b9d22ef96a1632c4e3792f63d9a6
+net/minecraft/src/BiomeGenRainforest 5c89f828263f90a9358db8d9c2e5b261
+net/minecraft/src/ChunkCoordinates 09d1ca071d80b8b3f74991c497cff1af
+net/minecraft/src/EntityPlayerMP 6341d4d408922277e9ce5564bf1e29ed
+net/minecraft/src/WorldGenGlowStone1 e43a197df4a789854d7c177c4180c1ec
+net/minecraft/src/BlockIce c28a30b5c038bf3458fef24fcc64c605
+net/minecraft/src/ConvertProgressUpdater 488043ac1fe80e79a5ebf2c805b7b943
+net/minecraft/src/WorldGenTaiga1 340a5746875839fd4d4ced5897258d36
+net/minecraft/src/ItemBucket bff304e62d3406a30af7c5f806f241de
+net/minecraft/src/BiomeGenSky ada8820a5c638acc9349bc17a6903789
+net/minecraft/src/WorldProviderHell d657e0112b3f6c5806407f21d1f34228
+net/minecraft/src/BlockJukeBox 90fe966d582e1ce17027ffe47296d8ca
+net/minecraft/src/BlockTorch ce6b4d1bca2b306a29896844fcf6eca4
+net/minecraft/src/Packet5PlayerInventory 7effe05dff280b8b79db267bf9ee4024
+net/minecraft/src/NBTTagByte 21e1b9ffee3aa3df48250cca489d74e3
+net/minecraft/src/TileEntity dbb58e958772f7dd203ebde1c6469026
+net/minecraft/src/ItemReed f7f021e111b08c51eb1f2d94a3c1cfb8
+net/minecraft/src/BlockCactus 67aff0b4b543d5b0a5f8e73e0d03f588
+net/minecraft/src/BlockCloth 240d281fc0a45b85e1559360df0a4a43
+net/minecraft/src/BlockChest fa2b96ea6fe0182b589e2a615598bae7
+net/minecraft/src/Packet40EntityMetadata 68d1250f7bd5a4d362dbffeb06c1fbbe
+net/minecraft/src/Pathfinder 70c8f03c50c9c29b4d486b2556b97c55
+net/minecraft/src/Material 2710c2823f32225484953518ff2bf746
+net/minecraft/src/ItemBlock 4de88ff9452ce1cd8d2378da7d5d265d
+net/minecraft/src/EmptyChunk 1d204abb85c9b2a73a40ba1c65980af1
+net/minecraft/src/BlockClay eed57fa621e9ef9a020a1a4e65494917
+net/minecraft/src/Packet0KeepAlive e1b8b926088f54d3ded322be2c13057f
+net/minecraft/src/SpawnListEntry 6023402ef474458a6c8ecc6af9eef3fb
+net/minecraft/src/BiomeGenTaiga f72c6701356378cdde7d395f564ed36b
+net/minecraft/src/TileEntityMobSpawner 178cde41c442b64c790f7bf7ae21d791
+net/minecraft/src/EntityPlayer a7e5c213dbf34db6c1def63b66edf668
+net/minecraft/src/Packet105UpdateProgressbar 09d78ca137346cce8ec7ee8d0e0335a4
+net/minecraft/src/EntityPainting 522f940790cd4e8f72b44570edd155b4
+net/minecraft/src/ChunkBlockMap 10dabba68497413b2efb0150a32bf97c
+net/minecraft/src/Packet53BlockChange 76cb4d8c902486df2d7dc7e83aa8ae8d
+net/minecraft/src/MaterialTransparent d4f7d25305ae17163e3580d4caca2741
+net/minecraft/src/WorldChunkManagerHell 6c8ee8367420537c610886e67b6516fb
+net/minecraft/src/BlockRedstoneTorch 0eb30fc521315655b888d8b965a37bf9
+net/minecraft/src/NibbleArray 6f2dabe0967d3b3c0dd9bceacfdf7612
+net/minecraft/src/BlockPumpkin 603d485235729ff409c6cb2e7b47fe97
+net/minecraft/src/Packet2Handshake 34b693e16f7a73b8637205b9a4506ff2
+net/minecraft/src/ItemSapling 55687c81a656b9527da46d1d599d1328
+net/minecraft/src/NBTTagShort dee6dc2f08cc9cd72fc4c929e91dd0af
+net/minecraft/src/WorldProvider 049b829c14d1c26abc9d751ab89a38e4
+net/minecraft/src/StepSoundSand 044559e1a5f7e7ec6e28a752e93bfbcc
+net/minecraft/src/RegionFileChunkBuffer d1355a851f5663dea8085db0259818f4
+net/minecraft/src/Packet54PlayNoteBlock 7c0e75026cd5cb4dc20e3a7353267d85
+net/minecraft/src/BlockFlowing 793b4325414dd0304d9179c40fcc0033
+net/minecraft/src/MetadataChunkBlock 563ca3860667fc29601e4267192d0642
+net/minecraft/src/BlockRedstoneOre 64492866bf9dfbaec25537896616c20d
+net/minecraft/src/WorldGenLakes cfe858af9b96029c9bc2b7e99030bc46
+net/minecraft/src/RecipesArmor 8e9119537a30f343ab3b441f87529bf4
+net/minecraft/src/Packet13PlayerLookMove 300dbca74a54f2e881d67bd844328903
+net/minecraft/src/ThreadMonitorConnection 8b5e8c33e78ca88b93c6498b1077833c
+net/minecraft/src/BlockStairs 45507d2d4ed009751355a1bbc0b9a6d8
+net/minecraft/src/InventoryLargeChest 508ae717f17a20585fc665b8368140ab
+net/minecraft/src/BlockPistonMoving d19249fe7ac4edf68f4618fb9460183b
+net/minecraft/src/ItemBow b6ff84d0ef91604ec3186876b8be28e3
+net/minecraft/src/BlockLever 47549d48f2d7a91f17cee0baa2e5518c
+net/minecraft/src/IChunkProvider 462d28bab39e9234cd76e04ed3b128c1
+net/minecraft/src/ChunkFolderPattern 299abd70eb724e34184547b32b68647a
+net/minecraft/src/ModelBed 7c156e69a91fee263dcf3e45f11ed511
+net/minecraft/src/BlockSnow 4ea1c73b2cf9ff9cdeda546aeac1d813
+net/minecraft/src/WorldProviderSurface 80194b9126f3ab0e33665f0f63595bcd
+net/minecraft/src/BlockNote 77572b9e6147c1687cf898a732daf583
+net/minecraft/src/ItemBed 21336562b2b5eff990ba325ccd9e5182
+net/minecraft/src/BlockFurnace 2b13cf62393cb190f128c121e0f96ecb
+net/minecraft/src/EntityEgg 17f531f2eadc58907c7308e64588af97
+net/minecraft/src/EntityZombie e1cd8500b318d2b01061fa4db5e1361f
+net/minecraft/src/BlockFluid ac3e55269adb44604f6131ba5ef974ac
+net/minecraft/src/RecipesCrafting c55919f59490d4000433effdb5ef7b43
+net/minecraft/src/ItemCloth 10b9f89ae364c11b8937c272de34d843
+net/minecraft/src/MapData ec966b779a8573a5ebdb713448c295e3
+net/minecraft/src/PlayerHash 398e7ac8afaf68ac34f93b4470cf69fa
+net/minecraft/src/StatTypeDistance aab37c1ba1979564e958bd5957bb1765
+net/minecraft/src/NetworkManager 6bb2fbc659ce72fde0288c6ca49c261f
+net/minecraft/src/Packet104WindowItems bf067ec272825ced18f6be5dc8cc037b
+net/minecraft/src/EntityCow 7645ca02bdd2d37e41823c566b38b7e5
+net/minecraft/src/NetworkListenThread 6336425f1d33f26b491df954d86e4c90
+net/minecraft/src/StepSound 92828411ad72a09b4fc1eadb230d8cef
+net/minecraft/src/EntityWaterMob c555b29c25d4620e2abbb6e75c6ed9fe
+net/minecraft/src/FurnaceRecipes 0e833ddad4a31c268487ac5bbdc62ac2
+net/minecraft/src/Packet31RelEntityMove c25167d6d754cdbf101fbcbb4cfd9c1a
+net/minecraft/src/EnumStatus 94370329d0deb03f8f512fb69fa0b33e
+net/minecraft/src/BlockRail cdefd0b80fce2cfbe90c305e6e73513e
+net/minecraft/src/ItemHoe 7f73dd0f1f6f1a0d87388cfbe1a1a7db
+net/minecraft/src/MinecraftException c3e6d9e46c9f44513f74c73f08961284
+net/minecraft/src/IBlockAccess 28daf83a499aeb4adad9e78333297a68
+net/minecraft/src/BlockOre a95ade73582cba9443ec56bc7f4d0f88
+net/minecraft/src/ItemSpade 5d085a457b974f352a8682c0fa5e9937
+net/minecraft/src/EntityPigZombie aa5fed719ab96f1a0c98d61a45708d70
+net/minecraft/src/WorldGenTallGrass cd05c015fdbc936b6caa0196a1f5dee8
+net/minecraft/src/Empty1 db272f9d7f397ac3b23513dbb8763491
+net/minecraft/src/Packet101CloseWindow c3b4af884ebfe55a25153b3efc048e6b
+net/minecraft/src/NBTTagList 400f104153da8eef33c3d00c42e99279
+net/minecraft/src/World 9826745c1468b3d79fa0c7595fb0bea9
+net/minecraft/src/SlotCrafting be2df3111d32960936f0d6bebdca2468
+net/minecraft/src/SaveFormatOld 9c5255d695d46793c11f258f4db92ae5
+net/minecraft/src/BiomeGenDesert 4241a980c3580942acb25134db7c903e
+net/minecraft/src/RecipeSorter 0668121810e8aaffe64ff73d6feb029b
+net/minecraft/src/BlockGrass 8d3d37bdf51a7d181313907e91fe921d
+net/minecraft/src/ItemCoal 981354d07accf82862c56b859b2b820c
+net/minecraft/src/MapStorage 2cb9c00fd470b949565e3825e2c66cb7
+net/minecraft/src/BlockReed cf86304f38e8c7af264f7a15f3a2378c
+net/minecraft/src/Slot 4bc198e06fc4a19d716d618f22b3c5f8
+net/minecraft/src/Packet23VehicleSpawn 3dae4e8c0e2cee2505f3b7a4062f9231
+net/minecraft/src/CraftingManager 8d2a8f20756020d436a5ef0c6f8408a3
+net/minecraft/src/StatBasic 7aab3c9669a2d16349e48f9ba376ceef
+net/minecraft/src/ItemSign d4cb636b555f7b5489a7ab2fc77cb91a
+net/minecraft/src/AchievementMap 5872a831675da4bcf041a75b60e2316d
+net/minecraft/src/EnumMovingObjectType 8d4b48ef2246e76010a49e1c0911a41a
+net/minecraft/src/InventoryPlayer 7e0661c279a77a453e1da2bf872ce829
+net/minecraft/src/ConsoleLogManager 0874e8602f114ed8125c8d3be5c98499
+net/minecraft/src/MaterialPortal e70116cba3a54a9089bd1d12e9c52d8f
+net/minecraft/src/IMob c225c3ab684ad2f3484ca3f15620e442
+net/minecraft/src/ServerCommand 5de584163da0f9488503ff36c2ae329f
+net/minecraft/src/Explosion e5b228475147d138125b27dd2528d841
+net/minecraft/src/NetworkAcceptThread f8f34049eccaf2f625c97743757c358d
+net/minecraft/src/EntityWolf 57e5e6a065282221981970dbda32bb90
+net/minecraft/src/Chunk e497278caba268dfec6b42ba378648af
+net/minecraft/src/MapCoord 48bb4b751e3db510893d0e2c09019556
+net/minecraft/src/PistonBlockTextures fa3af94ecf05879b6e467c2491cd4c10
+net/minecraft/src/GuiLogFormatter 153109dbcec984de82a5e4362c5e4bab
+net/minecraft/src/Packet6SpawnPosition c76cb0b9440bd58e0a2789df068612fc
+net/minecraft/src/ItemFishingRod 6447ccd58214f1b61873a6c4ac216d8c
+net/minecraft/src/NBTTagEnd 0a6903b0dc523806101334c8ec3f2e5e
+net/minecraft/src/IChunkLoader 95d9df8b2ef39c475216e9fb62a7f7e2
+net/minecraft/src/EntityFlying b45f45fe8db8f7a57a27718f910099a6
+net/minecraft/src/BlockSandStone 19a023f50ee3e52583279a9c33f87175
+net/minecraft/src/MapGenBase 03d771ba78f385bdb29b5dd1fe09ea89
+net/minecraft/src/WatchableObject 3add3b1d3bbb4178de0d1a577204903b
+net/minecraft/src/Packet22Collect 522462598127b3f236799b4fa81c2656
+net/minecraft/src/BlockBreakable 7e43d81fe89e3245bfb2036097e8e65c
+net/minecraft/src/Packet103SetSlot 698c72b9237a904a0032fd26db8723ab
+net/minecraft/src/Packet70Bed 78bcc3f8b7e286d0ca41bcd19df29410
+net/minecraft/src/BiomeGenHell 60a84555157cd641f1960119f5e01f72
+net/minecraft/src/WorldGenBigTree c2bd9a46e1d339bd93c69effc90df832
+net/minecraft/src/ItemInWorldManager 9091affa1aa51151e860534b7456e8de
+net/minecraft/src/EntityMinecart 20bd1f6e4e07f76552813f0e3f05312a
+net/minecraft/src/Block 38231734438b754b2f8553be6354bc91
+net/minecraft/src/WorldGenPumpkin 85b094f999be367c167302951bf1c0c7
+net/minecraft/src/PlayerListBox 0d4b98438a5f4e7c381163b84369b609
+net/minecraft/src/ThreadServerApplication 73e63656103a6784ac5662a41b9520f7
+net/minecraft/src/IAnimals 2c2c661355a508a7eb33e651aaddada9
+net/minecraft/src/BlockTrapDoor cb291f23b4d6caa909b1b9239e0eb445
+net/minecraft/src/BlockBed c441687b9924c0dc8370f9bde289bfe5
+net/minecraft/src/TileEntityDispenser d015335823005d56b7e5d87e4940e3ff
+net/minecraft/src/BlockFarmland 09f465c90034630e169a935948eccda0
+net/minecraft/src/ItemSlab f8a9d42b4cc27176a84ed267d3d595ee
+net/minecraft/src/BlockWeb 28c55d9919a7e0de491c5178323c7e45
+net/minecraft/src/ChunkCache 981c611c9afa78c0d62dc979e866d018
+net/minecraft/src/Packet131MapData dca0968cdc7a242d27897555f54816aa
+net/minecraft/src/ThreadLoginVerifier 12379ab25fdb7734b5fd9e346454eb94
+net/minecraft/src/MCHash 95d97b2755a6871fde2231ac84adc1d8
+net/minecraft/src/WorldGenTrees 8ce58d3f194e3be8a847a8ec55cf84de
+net/minecraft/src/ChunkFilePattern 77a1c67d2b6d281d75d70f5997f9aaf3
+net/minecraft/src/RecipesDyes 941a8a4e61c35de7235373adbaa1fea8
+net/minecraft/src/Packet12PlayerLook b01b8e9b5aab27b7ec728b7e57065f87
+net/minecraft/src/Path 09baca2dca3abaa3d1a9342b3c0793c1
+net/minecraft/src/EnumCreatureType d1593b3e0e7f135829828630519c746d
+net/minecraft/src/ServerGUI 047d76510293c582f445396ea9cd9235
+net/minecraft/src/PropertyManager 3c78d9f9ef15b3f853f8e30cb32ab820
+net/minecraft/src/NBTTagInt 01704968601ac82acdf618b8a6c6714d
+net/minecraft/src/ItemShears 14d4dd76774cf239cd92f56a3a502ae4
+net/minecraft/src/WorldGenGlowStone2 33d652bb8716136e558633b4f42efd10
+net/minecraft/src/ItemDye 64664e748b9ed8624b1a5830e6dc2ee8
+net/minecraft/src/EntityBoat 31d16a1ff30588fb16327d803f788025
+net/minecraft/src/AxisAlignedBB df75da4bbadad4ac48d8e18df54bcdd1
+net/minecraft/src/ISaveFormat 53a328e3679205cb3ab1300b7c1fa590
+net/minecraft/src/IRecipe 1f61e06883db800d6314a2646a2bbb85
+net/minecraft/src/BlockLockedChest d67713d98657ff9ccb19b060f798d380
+net/minecraft/src/ChunkFile 1d4047b231a9d31adf349710171ddf6b
+net/minecraft/src/MCHashEntry 2519f16eb3d418b58555f9b9d99a9171
+net/minecraft/src/TileEntitySign 6dee393edf9aadd9073d59d5ecfa3b89
+net/minecraft/src/WorldGenClay edce6c9d407a6c58925b55849c856990
+net/minecraft/src/WorldGenLiquids 51499a363668be332e218df573b7163a
+net/minecraft/src/MaterialLogic c1920129f2fc4baca9e95b1619b8a58f
+net/minecraft/src/StatTypeSimple 345fc14c020c2e4a49d916303ed717cb
+net/minecraft/src/ICrafting 9dc61bef961fb0f21bdc0953d277487a
+net/minecraft/src/Packet3Chat 62615b832ec23d280db210786a06c0c4
+net/minecraft/src/EnumToolMaterial 3e3aca86258b899d9bad6c6b2e61a6da
+net/minecraft/src/ServerGuiCommandListener 6c29a50e9b3c1c9ca9151e8225cb7049
+net/minecraft/src/BlockDispenser 2823176f60ccb0f27a37f0b45764f64a
+net/minecraft/src/ItemFood bbd6bed981b03483ce2a736daaf789a4
+net/minecraft/src/BlockTNT 169d6e0817ba84ba43b6c1e597924dca
+net/minecraft/src/IInventory d641e7d430cbd2f0861d4a984a74d3dc
+net/minecraft/src/Packet102WindowClick c7cd2e130d17599ef4e38d9adceba0aa
+net/minecraft/src/MapDataBase c4a7cf88bf92e07806814a27b5dbffca
+net/minecraft/src/NetworkMasterThread 4a4c0ff68bc41647effe3a5914f77f39
+net/minecraft/src/ItemMinecart 5cff6c774a09b7d02ae32d84953e266c
+net/minecraft/src/EntityFallingSand a6294392b134ec37af045ce29552cb42
+net/minecraft/src/PathEntity 19df165f53b4282f2328b1f2fe1c86d3
+net/minecraft/src/MaterialLiquid 3a205dc59fbf293e7452b335d04d0e34
+net/minecraft/src/ContainerDispenser 03d4362c1cfc412b126a51f98c8adf6e
+net/minecraft/src/NBTTagByteArray 8004b8fb3badc6979c10bec186f61877
+net/minecraft/src/EntitySheep 1553247ae611a045dcd4f8200e6aa500
+net/minecraft/src/Packet21PickupSpawn 24b184d27d724eb89d3db0f5b745a352
+net/minecraft/src/WorldChunkManager ab646383d78122d6b88dc882fcd1467a
+net/minecraft/src/BlockDoor ef2758f28508a93de9b5a033d1851e34
+net/minecraft/src/ChunkPosition d5a550d6183ffae16008fa8c0d07b1ab
+net/minecraft/src/Packet106Transaction 8e4acd0aca89302767c7a25674cf6900
+net/minecraft/src/Empty2 a1329471bacf0c7a0653682ae3fd876a
+net/minecraft/src/EntityLiving b6f39b279f2b95ca373c8f590e169154
+net/minecraft/src/NetworkReaderThread eeab9a4bae737a213d20393e0a453d62
+net/minecraft/src/Packet39AttachEntity 95d6b6f7b16df6265c0f1e30ab79118d
+net/minecraft/src/RailLogic 47d69aec44f95a1c0ab8e7e5deaa9155
+net/minecraft/src/BlockTallGrass b51886f6a356f4cbc69f50ec05cadc93
+net/minecraft/src/Packet20NamedEntitySpawn 2d37bffd5dd11d965d397078cbe6875e
+net/minecraft/src/BlockContainer 13327f8853cf5ccd8798000c943853ad
+net/minecraft/src/Packet200Statistic af1abae5b8a8976bb96acbd73afde586
+net/minecraft/src/CompressedStreamTools 45a47def53c36248dd1f4c830406f5b5
+net/minecraft/src/Packet61DoorChange 41eeb3273931015b7417ca3542fc0320
+net/minecraft/src/IWorldAccess 2551bcf3c20341d23a59b24c3b083323
+net/minecraft/src/PacketCounter f45a6ef5a39cf58951daaa9770591b86
+net/minecraft/src/ShapelessRecipes 440501a4b894ce39fe97b884b29341b0
+net/minecraft/src/StatBase cd806f9f715b2475a5cd08fa3983ba21
+net/minecraft/src/MapGenCaves 8f5f36c1d9f0857c0f3e4b5a4929e48b
+net/minecraft/src/BlockSign 8e93f40fda9de3d180c53e4aaeb24059
+net/minecraft/src/ItemPainting 048eab0de1f0d7012f3126e622ee59ea
+net/minecraft/src/EntityCreeper 6e31bbd5f3372e5d71b98e5325eb2400
+net/minecraft/src/ChunkLoader 5cd60c89e049dda1884b2ec8380a30a5
+net/minecraft/src/ChunkProviderSky f972ceb78827746600092cd3426ec4f1
+net/minecraft/src/EntityTracker 1d3c29154d1cb53c5ea15e48e597d49d
+net/minecraft/src/WorldGenFire d91859ead03dc64f3133fc25c945b878
+net/minecraft/src/ItemLeaves bd944e2ba03ac918e5fd7253da963125
+net/minecraft/src/BlockMushroom 5d11502c16452b8afc0a8e44de213bc9
+net/minecraft/src/Packet32EntityLook 04194a7867f5ec93ccce840eed49990d
+net/minecraft/src/IProgressUpdate 7b1a8934f746a23e1d06a7ecf09dc9af
+net/minecraft/src/MapGenCavesHell 9529a054c1c82bce779ae2db83962bac
+net/minecraft/src/BlockStep 534705b35dc20faca032deddbe42670f
+net/minecraft/src/EntityFireball a2be2e18678e65c958f2dcfd149b65bc
+net/minecraft/src/BlockPistonExtension 30c2dbb27e06a0520896572044ac7720
+net/minecraft/src/BiomeGenBase 539f66eec1b4036b1bc907a5682a6c4d
+net/minecraft/src/ItemPiston 81972e71ac79be58fa455e398297d6e6
+net/minecraft/src/BlockMobSpawner 43e2c03b1519f8597ee09a12d1d4e2a6
+net/minecraft/src/Packet17Sleep 67a5efd300629bc661d388161cc188af
+net/minecraft/src/WorldInfo f9fd7bcb79f549b8167e0b25a2135795
+net/minecraft/src/AchievementList d30045fe7ded1a2b3eef79cfc4989943
+net/minecraft/src/BlockDetectorRail 53188f6ed41ad518c89405fb452c9953
+net/minecraft/src/ItemSnowball 4dc9f8865790f9deb6602cf9917fd4bd
+net/minecraft/src/Entity 628454604c7c5b6d73ffcfc81cfeb11a
+net/minecraft/src/NoiseGeneratorOctaves2 25fbfbca85cfadcfc9294aac2a14fa2f
+net/minecraft/src/Packet b066a816f409c9120135ada192020c89
+net/minecraft/src/ItemMap 0e93611394e65fc6a0ae216fc52063ec
+net/minecraft/src/EntityTNTPrimed 58d3f8f768d3ae73f99e33d119d8081d
+net/minecraft/src/Packet7UseEntity 2dde217178141ec4a02b24ce25ded1d4
+net/minecraft/src/BlockPressurePlate 5c331a3deb97b1399ecb95192198b8e3
+net/minecraft/src/PlayerInstance 36a875cc4f0813a7db6513d82c630845
+net/minecraft/src/Packet15Place c7a3ecf7aa3b71a7549ee300651bb1c9
+net/minecraft/src/GuiStatsComponent b34730e63af1265f9d6b62c49aba4ce3
+net/minecraft/src/ChunkProviderServer c526c5fff1d78388387f22683409323f
+net/minecraft/src/EntityPig 13212973f2448e4ce7b5453e70efc7d1
+net/minecraft/src/RecipesWeapons 09fd9927d705a543265dd9cdbdff9838
+net/minecraft/src/PlayerHashEntry 6592d6d96bdf481704c93ae98af8c469
+net/minecraft/src/NBTTagDouble bf77bf257cedd9751f16bf57ea503c47
+net/minecraft/src/McRegionChunkLoader 222b3081036653931e380e61286af752
+net/minecraft/src/Packet130UpdateSign f2f4a25042c6d68c8d03302ead2b5e75
+net/minecraft/src/Packet1Login dc46a4003f429bfa9bd389094d8764e9
+net/minecraft/src/WorldServer f1d47d3e22b772ba423dc1e918f06610
+net/minecraft/src/EntitySpider 7dccd3779c2d57ebc5b421a6a4caaa31
+net/minecraft/src/PathPoint 079bf47a409d52c21a331854aaba72b9
+net/minecraft/src/MathHelper 79c45f59b6b99baf7b4188c8d609c43a
+net/minecraft/src/PlayerManager bf7e36e37f1eb53434701a4b8df1126a
+net/minecraft/src/ThreadCommandReader fe54ec84c54651451ef70de98fd0154d
+net/minecraft/src/NextTickListEntry 6ac1f01c2b37d67070efeb0dd0bcbcf3
+net/minecraft/src/TileEntityFurnace 85c36f15ffafc27d6a5240d90777aff6
+net/minecraft/src/RedstoneUpdateInfo 4c19faa3c89e83989071313f60beeace
+net/minecraft/src/BlockDirt 7306c0210187b89ad56e1204e1cf4a20
+net/minecraft/src/Packet4UpdateTime 7feefb9c4c02991dfd0dd1b8ae96b094
+net/minecraft/src/ItemDoor 0c3a0b9aba1eb3fff598933fe1483de1
+net/minecraft/src/RegionFile 8912536e07b3b24db0d6cf0e2e48f613
+net/minecraft/src/Achievement 742b820d3d75169f5761607839dbe807
+net/minecraft/src/Packet255KickDisconnect 716a99fc626f81bc64f852ae5c2bde80
+net/minecraft/src/ContainerFurnace 6e36639c318e728894cf42a7e804e450
+net/minecraft/src/Packet16BlockItemSwitch 88fb7b1df8fa6993598f44ac4d45059b
+net/minecraft/src/TileEntityChest 8639e44edd5e069e91c64af595b1360d
+net/minecraft/src/SaveConverterMcRegion 32d3d6661c42424114c9eee842e1e0f3
+net/minecraft/src/BlockRedstoneWire 8e34b7c987b9d9ff47922598f043e0b1
+net/minecraft/src/WorldGenerator 4a639f3f6bb27b7b6d4bd1516c010a36
+net/minecraft/src/NBTTagFloat 9ea39302525393a03ddb739f8cc9ca17
+net/minecraft/src/ItemLog 63dee1236da777be7195cf8953acf1c9
+net/minecraft/src/ICommandListener 638af8fe506e5ec4198c70290e6b3d2c
+net/minecraft/src/NBTBase 06858536273e1e8a6fabe856fb0760cb
+net/minecraft/src/WorldGenFlowers 1de1752a98db6c28d33ce20514628753
+net/minecraft/src/ChunkCoordIntPair cfeb3f37797149413a71e87e030b0bb8
+net/minecraft/src/BlockBookshelf b51f595f6269ed6b0364ae67b9483ec4
+net/minecraft/src/ChunkProviderGenerate 9baa6e0dced9f33c8164a4bbf1951614
+net/minecraft/src/BlockLog e5d275c18f1cb7b1e6f50c66067fb8b4
+net/minecraft/src/MovingObjectPosition bf0f281fa299f65f842efc9305804ce3
+net/minecraft/src/Packet27Position 54b31b2a4b8edc85449da5af3b6316a7
+net/minecraft/src/NBTTagString 9c4f18cf4ab51377ef477412af18692b
+net/minecraft/src/BlockPistonBase 9ac4f3a839e6ff3cc80b3fe8f7870487
+net/minecraft/src/BiomeGenSwamp 354cf963c49bbda9630f35b0ed174516
+net/minecraft/src/ContainerPlayer 170a694c57a702760f30f352d26c2a18
+net/minecraft/src/Vec3D 46064be3594c7254be51b9b190e8176c
+net/minecraft/src/TileEntityNote babfc0ab8646b03a1f1672b8c2dc7f76
+net/minecraft/src/ConsoleLogFormatter 9b81dc2c36fc1f0322424b41ca07cb4d
+net/minecraft/src/IUpdatePlayerListBox 7c68acfd7547db77ef7ea7b8343b4816
+net/minecraft/src/BlockOreStorage aaefb6370b8c8666c135ab789fb0c270
+net/minecraft/src/WorldGenForest 93b07730e8bdd9a89f53de49c8521779
+net/minecraft/src/BlockCake ad5f6f31792d6a01054c3d0e4a23742b
+net/minecraft/src/ServerWindowAdapter f95e6667e6f8eb14626f51232effebf6
+net/minecraft/src/EntityAnimal 10d92d5116c053070ddadac83ebee034
+net/minecraft/src/Packet33RelEntityMoveLook 901f3f64322a8bee06fb668851445660
+net/minecraft/src/Container 69acf4986614dc13d33ea2ed89ef1b43
+net/minecraft/src/BlockStone 543d6587b9f5f29087027a2eb98a37a1
+net/minecraft/src/NoiseGeneratorOctaves b02ca36e1e0e51c26120a2a163bea4d3
+net/minecraft/src/GuiStatsListener 52ecd04ca3688253bd14e8ea0e695d69
+net/minecraft/src/InventoryCrafting 496d9ba13440e14054ab41e6f4356770
+net/minecraft/src/SlotFurnace 65b1ab78e55a0f7538d39426c99fd89f
+net/minecraft/src/Packet34EntityTeleport 2347f1d19adf5a5a962b115323efecbf
+net/minecraft/src/NetworkWriterThread 0743942da009f5434d3db73bd801e9e1
+net/minecraft/src/ItemSoup acedbfab3457afe2d3ee36f02944a586
diff --git a/src/net/minecraft/server/MinecraftServer.java b/src/net/minecraft/server/MinecraftServer.java
new file mode 100644
index 0000000..3233f65
--- /dev/null
+++ b/src/net/minecraft/server/MinecraftServer.java
@@ -0,0 +1,415 @@
+package net.minecraft.server;
+
+import java.awt.GraphicsEnvironment;
+import java.io.File;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.src.AxisAlignedBB;
+import net.minecraft.src.ChunkCoordinates;
+import net.minecraft.src.ConsoleCommandHandler;
+import net.minecraft.src.ConsoleLogManager;
+import net.minecraft.src.ConvertProgressUpdater;
+import net.minecraft.src.EntityTracker;
+import net.minecraft.src.ICommandListener;
+import net.minecraft.src.IProgressUpdate;
+import net.minecraft.src.ISaveFormat;
+import net.minecraft.src.IUpdatePlayerListBox;
+import net.minecraft.src.NetworkListenThread;
+import net.minecraft.src.Packet4UpdateTime;
+import net.minecraft.src.PropertyManager;
+import net.minecraft.src.SaveConverterMcRegion;
+import net.minecraft.src.SaveOldDir;
+import net.minecraft.src.ServerCommand;
+import net.minecraft.src.ServerConfigurationManager;
+import net.minecraft.src.ServerGUI;
+import net.minecraft.src.StatList;
+import net.minecraft.src.ThreadCommandReader;
+import net.minecraft.src.ThreadServerApplication;
+import net.minecraft.src.ThreadSleepForever;
+import net.minecraft.src.Vec3D;
+import net.minecraft.src.WorldManager;
+import net.minecraft.src.WorldServer;
+import net.minecraft.src.WorldServerMulti;
+
+public class MinecraftServer implements Runnable, ICommandListener {
+ public static Logger logger = Logger.getLogger("Minecraft");
+ public static HashMap field_6037_b = new HashMap();
+ public NetworkListenThread networkServer;
+ public PropertyManager propertyManagerObj;
+ public WorldServer[] worldMngr;
+ public ServerConfigurationManager configManager;
+ private ConsoleCommandHandler commandHandler;
+ private boolean serverRunning = true;
+ public boolean serverStopped = false;
+ int deathTime = 0;
+ public String currentTask;
+ public int percentDone;
+ private List field_9010_p = new ArrayList();
+ private List commands = Collections.synchronizedList(new ArrayList());
+ public EntityTracker[] entityTracker = new EntityTracker[2];
+ public boolean onlineMode;
+ public boolean spawnPeacefulMobs;
+ public boolean pvpOn;
+ public boolean allowFlight;
+
+ public MinecraftServer() {
+ new ThreadSleepForever(this);
+ }
+
+ private boolean startServer() throws UnknownHostException {
+ this.commandHandler = new ConsoleCommandHandler(this);
+ ThreadCommandReader var1 = new ThreadCommandReader(this);
+ var1.setDaemon(true);
+ var1.start();
+ ConsoleLogManager.init();
+ logger.info("Starting minecraft server version Beta 1.7.3");
+ if(Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) {
+ logger.warning("**** NOT ENOUGH RAM!");
+ logger.warning("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\"");
+ }
+
+ logger.info("Loading properties");
+ this.propertyManagerObj = new PropertyManager(new File("server.properties"));
+ String var2 = this.propertyManagerObj.getStringProperty("server-ip", "");
+ this.onlineMode = this.propertyManagerObj.getBooleanProperty("online-mode", true);
+ this.spawnPeacefulMobs = this.propertyManagerObj.getBooleanProperty("spawn-animals", true);
+ this.pvpOn = this.propertyManagerObj.getBooleanProperty("pvp", true);
+ this.allowFlight = this.propertyManagerObj.getBooleanProperty("allow-flight", false);
+ InetAddress var3 = null;
+ if(var2.length() > 0) {
+ var3 = InetAddress.getByName(var2);
+ }
+
+ int var4 = this.propertyManagerObj.getIntProperty("server-port", 25565);
+ logger.info("Starting Minecraft server on " + (var2.length() == 0 ? "*" : var2) + ":" + var4);
+
+ try {
+ this.networkServer = new NetworkListenThread(this, var3, var4);
+ } catch (IOException var13) {
+ logger.warning("**** FAILED TO BIND TO PORT!");
+ logger.log(Level.WARNING, "The exception was: " + var13.toString());
+ logger.warning("Perhaps a server is already running on that port?");
+ return false;
+ }
+
+ if(!this.onlineMode) {
+ logger.warning("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!");
+ logger.warning("The server will make no attempt to authenticate usernames. Beware.");
+ logger.warning("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose.");
+ logger.warning("To change this, set \"online-mode\" to \"true\" in the server.settings file.");
+ }
+
+ this.configManager = new ServerConfigurationManager(this);
+ this.entityTracker[0] = new EntityTracker(this, 0);
+ this.entityTracker[1] = new EntityTracker(this, -1);
+ long var5 = System.nanoTime();
+ String var7 = this.propertyManagerObj.getStringProperty("level-name", "world");
+ String var8 = this.propertyManagerObj.getStringProperty("level-seed", "");
+ long var9 = (new Random()).nextLong();
+ if(var8.length() > 0) {
+ try {
+ var9 = Long.parseLong(var8);
+ } catch (NumberFormatException var12) {
+ var9 = (long)var8.hashCode();
+ }
+ }
+
+ logger.info("Preparing level \"" + var7 + "\"");
+ this.initWorld(new SaveConverterMcRegion(new File(".")), var7, var9);
+ logger.info("Done (" + (System.nanoTime() - var5) + "ns)! For help, type \"help\" or \"?\"");
+ return true;
+ }
+
+ private void initWorld(ISaveFormat var1, String var2, long var3) {
+ if(var1.isOldSaveType(var2)) {
+ logger.info("Converting map!");
+ var1.converMapToMCRegion(var2, new ConvertProgressUpdater(this));
+ }
+
+ this.worldMngr = new WorldServer[2];
+ SaveOldDir var5 = new SaveOldDir(new File("."), var2, true);
+
+ for(int var6 = 0; var6 < this.worldMngr.length; ++var6) {
+ if(var6 == 0) {
+ this.worldMngr[var6] = new WorldServer(this, var5, var2, var6 == 0 ? 0 : -1, var3);
+ } else {
+ this.worldMngr[var6] = new WorldServerMulti(this, var5, var2, var6 == 0 ? 0 : -1, var3, this.worldMngr[0]);
+ }
+
+ this.worldMngr[var6].addWorldAccess(new WorldManager(this, this.worldMngr[var6]));
+ this.worldMngr[var6].difficultySetting = this.propertyManagerObj.getBooleanProperty("spawn-monsters", true) ? 1 : 0;
+ this.worldMngr[var6].setAllowedSpawnTypes(this.propertyManagerObj.getBooleanProperty("spawn-monsters", true), this.spawnPeacefulMobs);
+ this.configManager.setPlayerManager(this.worldMngr);
+ }
+
+ short var18 = 196;
+ long var7 = System.currentTimeMillis();
+
+ for(int var9 = 0; var9 < this.worldMngr.length; ++var9) {
+ logger.info("Preparing start region for level " + var9);
+ if(var9 == 0 || this.propertyManagerObj.getBooleanProperty("allow-nether", true)) {
+ WorldServer var10 = this.worldMngr[var9];
+ ChunkCoordinates var11 = var10.getSpawnPoint();
+
+ for(int var12 = -var18; var12 <= var18 && this.serverRunning; var12 += 16) {
+ for(int var13 = -var18; var13 <= var18 && this.serverRunning; var13 += 16) {
+ long var14 = System.currentTimeMillis();
+ if(var14 < var7) {
+ var7 = var14;
+ }
+
+ if(var14 > var7 + 1000L) {
+ int var16 = (var18 * 2 + 1) * (var18 * 2 + 1);
+ int var17 = (var12 + var18) * (var18 * 2 + 1) + var13 + 1;
+ this.outputPercentRemaining("Preparing spawn area", var17 * 100 / var16);
+ var7 = var14;
+ }
+
+ var10.chunkProviderServer.loadChunk(var11.posX + var12 >> 4, var11.posZ + var13 >> 4);
+
+ while(var10.func_6156_d() && this.serverRunning) {
+ }
+ }
+ }
+ }
+ }
+
+ this.clearCurrentTask();
+ }
+
+ private void outputPercentRemaining(String var1, int var2) {
+ this.currentTask = var1;
+ this.percentDone = var2;
+ logger.info(var1 + ": " + var2 + "%");
+ }
+
+ private void clearCurrentTask() {
+ this.currentTask = null;
+ this.percentDone = 0;
+ }
+
+ private void saveServerWorld() {
+ logger.info("Saving chunks");
+
+ for(int var1 = 0; var1 < this.worldMngr.length; ++var1) {
+ WorldServer var2 = this.worldMngr[var1];
+ var2.saveWorld(true, (IProgressUpdate)null);
+ var2.func_30006_w();
+ }
+
+ }
+
+ private void stopServer() {
+ logger.info("Stopping server");
+ if(this.configManager != null) {
+ this.configManager.savePlayerStates();
+ }
+
+ for(int var1 = 0; var1 < this.worldMngr.length; ++var1) {
+ WorldServer var2 = this.worldMngr[var1];
+ if(var2 != null) {
+ this.saveServerWorld();
+ }
+ }
+
+ }
+
+ public void initiateShutdown() {
+ this.serverRunning = false;
+ }
+
+ public void run() {
+ try {
+ if(this.startServer()) {
+ long var1 = System.currentTimeMillis();
+
+ for(long var3 = 0L; this.serverRunning; Thread.sleep(1L)) {
+ long var5 = System.currentTimeMillis();
+ long var7 = var5 - var1;
+ if(var7 > 2000L) {
+ logger.warning("Can\'t keep up! Did the system time change, or is the server overloaded?");
+ var7 = 2000L;
+ }
+
+ if(var7 < 0L) {
+ logger.warning("Time ran backwards! Did the system time change?");
+ var7 = 0L;
+ }
+
+ var3 += var7;
+ var1 = var5;
+ if(this.worldMngr[0].isAllPlayersFullyAsleep()) {
+ this.doTick();
+ var3 = 0L;
+ } else {
+ while(var3 > 50L) {
+ var3 -= 50L;
+ this.doTick();
+ }
+ }
+ }
+ } else {
+ while(this.serverRunning) {
+ this.commandLineParser();
+
+ try {
+ Thread.sleep(10L);
+ } catch (InterruptedException var57) {
+ var57.printStackTrace();
+ }
+ }
+ }
+ } catch (Throwable var58) {
+ var58.printStackTrace();
+ logger.log(Level.SEVERE, "Unexpected exception", var58);
+
+ while(this.serverRunning) {
+ this.commandLineParser();
+
+ try {
+ Thread.sleep(10L);
+ } catch (InterruptedException var56) {
+ var56.printStackTrace();
+ }
+ }
+ } finally {
+ try {
+ this.stopServer();
+ this.serverStopped = true;
+ } catch (Throwable var54) {
+ var54.printStackTrace();
+ } finally {
+ System.exit(0);
+ }
+
+ }
+
+ }
+
+ private void doTick() {
+ ArrayList var1 = new ArrayList();
+ Iterator var2 = field_6037_b.keySet().iterator();
+
+ while(var2.hasNext()) {
+ String var3 = (String)var2.next();
+ int var4 = ((Integer)field_6037_b.get(var3)).intValue();
+ if(var4 > 0) {
+ field_6037_b.put(var3, Integer.valueOf(var4 - 1));
+ } else {
+ var1.add(var3);
+ }
+ }
+
+ int var6;
+ for(var6 = 0; var6 < var1.size(); ++var6) {
+ field_6037_b.remove(var1.get(var6));
+ }
+
+ AxisAlignedBB.clearBoundingBoxPool();
+ Vec3D.initialize();
+ ++this.deathTime;
+
+ for(var6 = 0; var6 < this.worldMngr.length; ++var6) {
+ if(var6 == 0 || this.propertyManagerObj.getBooleanProperty("allow-nether", true)) {
+ WorldServer var7 = this.worldMngr[var6];
+ if(this.deathTime % 20 == 0) {
+ this.configManager.sendPacketToAllPlayersInDimension(new Packet4UpdateTime(var7.getWorldTime()), var7.worldProvider.worldType);
+ }
+
+ var7.tick();
+
+ while(var7.func_6156_d()) {
+ }
+
+ var7.updateEntities();
+ }
+ }
+
+ this.networkServer.handleNetworkListenThread();
+ this.configManager.onTick();
+
+ for(var6 = 0; var6 < this.entityTracker.length; ++var6) {
+ this.entityTracker[var6].updateTrackedEntities();
+ }
+
+ for(var6 = 0; var6 < this.field_9010_p.size(); ++var6) {
+ ((IUpdatePlayerListBox)this.field_9010_p.get(var6)).update();
+ }
+
+ try {
+ this.commandLineParser();
+ } catch (Exception var5) {
+ logger.log(Level.WARNING, "Unexpected exception while parsing console command", var5);
+ }
+
+ }
+
+ public void addCommand(String var1, ICommandListener var2) {
+ this.commands.add(new ServerCommand(var1, var2));
+ }
+
+ public void commandLineParser() {
+ while(this.commands.size() > 0) {
+ ServerCommand var1 = (ServerCommand)this.commands.remove(0);
+ this.commandHandler.handleCommand(var1);
+ }
+
+ }
+
+ public void func_6022_a(IUpdatePlayerListBox var1) {
+ this.field_9010_p.add(var1);
+ }
+
+ public static void main(String[] var0) {
+ StatList.func_27092_a();
+
+ try {
+ MinecraftServer var1 = new MinecraftServer();
+ if(!GraphicsEnvironment.isHeadless() && (var0.length <= 0 || !var0[0].equals("nogui"))) {
+ ServerGUI.initGui(var1);
+ }
+
+ (new ThreadServerApplication("Server thread", var1)).start();
+ } catch (Exception var2) {
+ logger.log(Level.SEVERE, "Failed to start the minecraft server", var2);
+ }
+
+ }
+
+ public File getFile(String var1) {
+ return new File(var1);
+ }
+
+ public void log(String var1) {
+ logger.info(var1);
+ }
+
+ public void logWarning(String var1) {
+ logger.warning(var1);
+ }
+
+ public String getUsername() {
+ return "CONSOLE";
+ }
+
+ public WorldServer getWorldManager(int var1) {
+ return var1 == -1 ? this.worldMngr[1] : this.worldMngr[0];
+ }
+
+ public EntityTracker getEntityTracker(int var1) {
+ return var1 == -1 ? this.entityTracker[1] : this.entityTracker[0];
+ }
+
+ public static boolean isServerRunning(MinecraftServer var0) {
+ return var0.serverRunning;
+ }
+}
diff --git a/src/net/minecraft/src/Achievement.java b/src/net/minecraft/src/Achievement.java
new file mode 100644
index 0000000..ade9f94
--- /dev/null
+++ b/src/net/minecraft/src/Achievement.java
@@ -0,0 +1,67 @@
+package net.minecraft.src;
+
+public class Achievement extends StatBase {
+ public final int field_25067_a;
+ public final int field_27991_b;
+ public final Achievement field_27992_c;
+ private final String field_27063_l;
+ public final ItemStack theItemStack;
+ private boolean field_27062_m;
+
+ public Achievement(int var1, String var2, int var3, int var4, Item var5, Achievement var6) {
+ this(var1, var2, var3, var4, new ItemStack(var5), var6);
+ }
+
+ public Achievement(int var1, String var2, int var3, int var4, Block var5, Achievement var6) {
+ this(var1, var2, var3, var4, new ItemStack(var5), var6);
+ }
+
+ public Achievement(int var1, String var2, int var3, int var4, ItemStack var5, Achievement var6) {
+ super(5242880 + var1, StatCollector.translateToLocal("achievement." + var2));
+ this.theItemStack = var5;
+ this.field_27063_l = StatCollector.translateToLocal("achievement." + var2 + ".desc");
+ this.field_25067_a = var3;
+ this.field_27991_b = var4;
+ if(var3 < AchievementList.field_27114_a) {
+ AchievementList.field_27114_a = var3;
+ }
+
+ if(var4 < AchievementList.field_27113_b) {
+ AchievementList.field_27113_b = var4;
+ }
+
+ if(var3 > AchievementList.field_27112_c) {
+ AchievementList.field_27112_c = var3;
+ }
+
+ if(var4 > AchievementList.field_27111_d) {
+ AchievementList.field_27111_d = var4;
+ }
+
+ this.field_27992_c = var6;
+ }
+
+ public Achievement func_27059_a() {
+ this.field_27058_g = true;
+ return this;
+ }
+
+ public Achievement func_27060_b() {
+ this.field_27062_m = true;
+ return this;
+ }
+
+ public Achievement func_27061_c() {
+ super.func_27053_d();
+ AchievementList.field_25129_a.add(this);
+ return this;
+ }
+
+ public StatBase func_27053_d() {
+ return this.func_27061_c();
+ }
+
+ public StatBase func_27052_e() {
+ return this.func_27059_a();
+ }
+}
diff --git a/src/net/minecraft/src/AchievementList.java b/src/net/minecraft/src/AchievementList.java
new file mode 100644
index 0000000..9206baf
--- /dev/null
+++ b/src/net/minecraft/src/AchievementList.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AchievementList {
+ public static int field_27114_a;
+ public static int field_27113_b;
+ public static int field_27112_c;
+ public static int field_27111_d;
+ public static List field_25129_a = new ArrayList();
+ public static Achievement field_25128_b = (new Achievement(0, "openInventory", 0, 0, Item.book, (Achievement)null)).func_27059_a().func_27061_c();
+ public static Achievement field_25131_c = (new Achievement(1, "mineWood", 2, 1, Block.wood, field_25128_b)).func_27061_c();
+ public static Achievement field_25130_d = (new Achievement(2, "buildWorkBench", 4, -1, Block.workbench, field_25131_c)).func_27061_c();
+ public static Achievement field_27110_i = (new Achievement(3, "buildPickaxe", 4, 2, Item.pickaxeWood, field_25130_d)).func_27061_c();
+ public static Achievement field_27109_j = (new Achievement(4, "buildFurnace", 3, 4, Block.stoneOvenActive, field_27110_i)).func_27061_c();
+ public static Achievement field_27108_k = (new Achievement(5, "acquireIron", 1, 4, Item.ingotIron, field_27109_j)).func_27061_c();
+ public static Achievement field_27107_l = (new Achievement(6, "buildHoe", 2, -3, Item.hoeWood, field_25130_d)).func_27061_c();
+ public static Achievement field_27106_m = (new Achievement(7, "makeBread", -1, -3, Item.bread, field_27107_l)).func_27061_c();
+ public static Achievement field_27105_n = (new Achievement(8, "bakeCake", 0, -5, Item.cake, field_27107_l)).func_27061_c();
+ public static Achievement field_27104_o = (new Achievement(9, "buildBetterPickaxe", 6, 2, Item.pickaxeStone, field_27110_i)).func_27061_c();
+ public static Achievement field_27103_p = (new Achievement(10, "cookFish", 2, 6, Item.fishCooked, field_27109_j)).func_27061_c();
+ public static Achievement field_27102_q = (new Achievement(11, "onARail", 2, 3, Block.minecartTrack, field_27108_k)).func_27060_b().func_27061_c();
+ public static Achievement field_27101_r = (new Achievement(12, "buildSword", 6, -1, Item.swordWood, field_25130_d)).func_27061_c();
+ public static Achievement field_27100_s = (new Achievement(13, "killEnemy", 8, -1, Item.bone, field_27101_r)).func_27061_c();
+ public static Achievement field_27099_t = (new Achievement(14, "killCow", 7, -3, Item.leather, field_27101_r)).func_27061_c();
+ public static Achievement field_27098_u = (new Achievement(15, "flyPig", 8, -4, Item.saddle, field_27099_t)).func_27060_b().func_27061_c();
+
+ public static void func_27097_a() {
+ }
+
+ static {
+ System.out.println(field_25129_a.size() + " achievements");
+ }
+}
diff --git a/src/net/minecraft/src/AchievementMap.java b/src/net/minecraft/src/AchievementMap.java
new file mode 100644
index 0000000..d951c22
--- /dev/null
+++ b/src/net/minecraft/src/AchievementMap.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+
+public class AchievementMap {
+ public static AchievementMap field_25134_a = new AchievementMap();
+ private Map field_25133_b = new HashMap();
+
+ private AchievementMap() {
+ try {
+ BufferedReader var1 = new BufferedReader(new InputStreamReader(AchievementMap.class.getResourceAsStream("/achievement/map.txt")));
+
+ while(true) {
+ String var2 = var1.readLine();
+ if(var2 == null) {
+ var1.close();
+ break;
+ }
+
+ String[] var3 = var2.split(",");
+ int var4 = Integer.parseInt(var3[0]);
+ this.field_25133_b.put(Integer.valueOf(var4), var3[1]);
+ }
+ } catch (Exception var5) {
+ var5.printStackTrace();
+ }
+
+ }
+
+ public static String func_25132_a(int var0) {
+ return (String)field_25134_a.field_25133_b.get(Integer.valueOf(var0));
+ }
+}
diff --git a/src/net/minecraft/src/AxisAlignedBB.java b/src/net/minecraft/src/AxisAlignedBB.java
new file mode 100644
index 0000000..ff4d5f9
--- /dev/null
+++ b/src/net/minecraft/src/AxisAlignedBB.java
@@ -0,0 +1,324 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AxisAlignedBB {
+ private static List boundingBoxes = new ArrayList();
+ private static int numBoundingBoxesInUse = 0;
+ public double minX;
+ public double minY;
+ public double minZ;
+ public double maxX;
+ public double maxY;
+ public double maxZ;
+
+ public static AxisAlignedBB getBoundingBox(double var0, double var2, double var4, double var6, double var8, double var10) {
+ return new AxisAlignedBB(var0, var2, var4, var6, var8, var10);
+ }
+
+ public static void clearBoundingBoxPool() {
+ numBoundingBoxesInUse = 0;
+ }
+
+ public static AxisAlignedBB getBoundingBoxFromPool(double var0, double var2, double var4, double var6, double var8, double var10) {
+ if(numBoundingBoxesInUse >= boundingBoxes.size()) {
+ boundingBoxes.add(getBoundingBox(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D));
+ }
+
+ return ((AxisAlignedBB)boundingBoxes.get(numBoundingBoxesInUse++)).setBounds(var0, var2, var4, var6, var8, var10);
+ }
+
+ private AxisAlignedBB(double var1, double var3, double var5, double var7, double var9, double var11) {
+ this.minX = var1;
+ this.minY = var3;
+ this.minZ = var5;
+ this.maxX = var7;
+ this.maxY = var9;
+ this.maxZ = var11;
+ }
+
+ public AxisAlignedBB setBounds(double var1, double var3, double var5, double var7, double var9, double var11) {
+ this.minX = var1;
+ this.minY = var3;
+ this.minZ = var5;
+ this.maxX = var7;
+ this.maxY = var9;
+ this.maxZ = var11;
+ return this;
+ }
+
+ public AxisAlignedBB addCoord(double var1, double var3, double var5) {
+ double var7 = this.minX;
+ double var9 = this.minY;
+ double var11 = this.minZ;
+ double var13 = this.maxX;
+ double var15 = this.maxY;
+ double var17 = this.maxZ;
+ if(var1 < 0.0D) {
+ var7 += var1;
+ }
+
+ if(var1 > 0.0D) {
+ var13 += var1;
+ }
+
+ if(var3 < 0.0D) {
+ var9 += var3;
+ }
+
+ if(var3 > 0.0D) {
+ var15 += var3;
+ }
+
+ if(var5 < 0.0D) {
+ var11 += var5;
+ }
+
+ if(var5 > 0.0D) {
+ var17 += var5;
+ }
+
+ return getBoundingBoxFromPool(var7, var9, var11, var13, var15, var17);
+ }
+
+ public AxisAlignedBB expand(double var1, double var3, double var5) {
+ double var7 = this.minX - var1;
+ double var9 = this.minY - var3;
+ double var11 = this.minZ - var5;
+ double var13 = this.maxX + var1;
+ double var15 = this.maxY + var3;
+ double var17 = this.maxZ + var5;
+ return getBoundingBoxFromPool(var7, var9, var11, var13, var15, var17);
+ }
+
+ public AxisAlignedBB getOffsetBoundingBox(double var1, double var3, double var5) {
+ return getBoundingBoxFromPool(this.minX + var1, this.minY + var3, this.minZ + var5, this.maxX + var1, this.maxY + var3, this.maxZ + var5);
+ }
+
+ public double calculateXOffset(AxisAlignedBB var1, double var2) {
+ if(var1.maxY > this.minY && var1.minY < this.maxY) {
+ if(var1.maxZ > this.minZ && var1.minZ < this.maxZ) {
+ double var4;
+ if(var2 > 0.0D && var1.maxX <= this.minX) {
+ var4 = this.minX - var1.maxX;
+ if(var4 < var2) {
+ var2 = var4;
+ }
+ }
+
+ if(var2 < 0.0D && var1.minX >= this.maxX) {
+ var4 = this.maxX - var1.minX;
+ if(var4 > var2) {
+ var2 = var4;
+ }
+ }
+
+ return var2;
+ } else {
+ return var2;
+ }
+ } else {
+ return var2;
+ }
+ }
+
+ public double calculateYOffset(AxisAlignedBB var1, double var2) {
+ if(var1.maxX > this.minX && var1.minX < this.maxX) {
+ if(var1.maxZ > this.minZ && var1.minZ < this.maxZ) {
+ double var4;
+ if(var2 > 0.0D && var1.maxY <= this.minY) {
+ var4 = this.minY - var1.maxY;
+ if(var4 < var2) {
+ var2 = var4;
+ }
+ }
+
+ if(var2 < 0.0D && var1.minY >= this.maxY) {
+ var4 = this.maxY - var1.minY;
+ if(var4 > var2) {
+ var2 = var4;
+ }
+ }
+
+ return var2;
+ } else {
+ return var2;
+ }
+ } else {
+ return var2;
+ }
+ }
+
+ public double calculateZOffset(AxisAlignedBB var1, double var2) {
+ if(var1.maxX > this.minX && var1.minX < this.maxX) {
+ if(var1.maxY > this.minY && var1.minY < this.maxY) {
+ double var4;
+ if(var2 > 0.0D && var1.maxZ <= this.minZ) {
+ var4 = this.minZ - var1.maxZ;
+ if(var4 < var2) {
+ var2 = var4;
+ }
+ }
+
+ if(var2 < 0.0D && var1.minZ >= this.maxZ) {
+ var4 = this.maxZ - var1.minZ;
+ if(var4 > var2) {
+ var2 = var4;
+ }
+ }
+
+ return var2;
+ } else {
+ return var2;
+ }
+ } else {
+ return var2;
+ }
+ }
+
+ public boolean intersectsWith(AxisAlignedBB var1) {
+ return var1.maxX > this.minX && var1.minX < this.maxX ? (var1.maxY > this.minY && var1.minY < this.maxY ? var1.maxZ > this.minZ && var1.minZ < this.maxZ : false) : false;
+ }
+
+ public AxisAlignedBB offset(double var1, double var3, double var5) {
+ this.minX += var1;
+ this.minY += var3;
+ this.minZ += var5;
+ this.maxX += var1;
+ this.maxY += var3;
+ this.maxZ += var5;
+ return this;
+ }
+
+ public boolean isVecInXYZ(Vec3D var1) {
+ return var1.xCoord > this.minX && var1.xCoord < this.maxX ? (var1.yCoord > this.minY && var1.yCoord < this.maxY ? var1.zCoord > this.minZ && var1.zCoord < this.maxZ : false) : false;
+ }
+
+ public AxisAlignedBB getInsetBoundingBox(double var1, double var3, double var5) {
+ double var7 = this.minX + var1;
+ double var9 = this.minY + var3;
+ double var11 = this.minZ + var5;
+ double var13 = this.maxX - var1;
+ double var15 = this.maxY - var3;
+ double var17 = this.maxZ - var5;
+ return getBoundingBoxFromPool(var7, var9, var11, var13, var15, var17);
+ }
+
+ public AxisAlignedBB copy() {
+ return getBoundingBoxFromPool(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ);
+ }
+
+ public MovingObjectPosition func_706_a(Vec3D var1, Vec3D var2) {
+ Vec3D var3 = var1.getIntermediateWithXValue(var2, this.minX);
+ Vec3D var4 = var1.getIntermediateWithXValue(var2, this.maxX);
+ Vec3D var5 = var1.getIntermediateWithYValue(var2, this.minY);
+ Vec3D var6 = var1.getIntermediateWithYValue(var2, this.maxY);
+ Vec3D var7 = var1.getIntermediateWithZValue(var2, this.minZ);
+ Vec3D var8 = var1.getIntermediateWithZValue(var2, this.maxZ);
+ if(!this.isVecInYZ(var3)) {
+ var3 = null;
+ }
+
+ if(!this.isVecInYZ(var4)) {
+ var4 = null;
+ }
+
+ if(!this.isVecInXZ(var5)) {
+ var5 = null;
+ }
+
+ if(!this.isVecInXZ(var6)) {
+ var6 = null;
+ }
+
+ if(!this.isVecInXY(var7)) {
+ var7 = null;
+ }
+
+ if(!this.isVecInXY(var8)) {
+ var8 = null;
+ }
+
+ Vec3D var9 = null;
+ if(var3 != null && (var9 == null || var1.squareDistanceTo(var3) < var1.squareDistanceTo(var9))) {
+ var9 = var3;
+ }
+
+ if(var4 != null && (var9 == null || var1.squareDistanceTo(var4) < var1.squareDistanceTo(var9))) {
+ var9 = var4;
+ }
+
+ if(var5 != null && (var9 == null || var1.squareDistanceTo(var5) < var1.squareDistanceTo(var9))) {
+ var9 = var5;
+ }
+
+ if(var6 != null && (var9 == null || var1.squareDistanceTo(var6) < var1.squareDistanceTo(var9))) {
+ var9 = var6;
+ }
+
+ if(var7 != null && (var9 == null || var1.squareDistanceTo(var7) < var1.squareDistanceTo(var9))) {
+ var9 = var7;
+ }
+
+ if(var8 != null && (var9 == null || var1.squareDistanceTo(var8) < var1.squareDistanceTo(var9))) {
+ var9 = var8;
+ }
+
+ if(var9 == null) {
+ return null;
+ } else {
+ byte var10 = -1;
+ if(var9 == var3) {
+ var10 = 4;
+ }
+
+ if(var9 == var4) {
+ var10 = 5;
+ }
+
+ if(var9 == var5) {
+ var10 = 0;
+ }
+
+ if(var9 == var6) {
+ var10 = 1;
+ }
+
+ if(var9 == var7) {
+ var10 = 2;
+ }
+
+ if(var9 == var8) {
+ var10 = 3;
+ }
+
+ return new MovingObjectPosition(0, 0, 0, var10, var9);
+ }
+ }
+
+ private boolean isVecInYZ(Vec3D var1) {
+ return var1 == null ? false : var1.yCoord >= this.minY && var1.yCoord <= this.maxY && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ;
+ }
+
+ private boolean isVecInXZ(Vec3D var1) {
+ return var1 == null ? false : var1.xCoord >= this.minX && var1.xCoord <= this.maxX && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ;
+ }
+
+ private boolean isVecInXY(Vec3D var1) {
+ return var1 == null ? false : var1.xCoord >= this.minX && var1.xCoord <= this.maxX && var1.yCoord >= this.minY && var1.yCoord <= this.maxY;
+ }
+
+ public void setBB(AxisAlignedBB var1) {
+ this.minX = var1.minX;
+ this.minY = var1.minY;
+ this.minZ = var1.minZ;
+ this.maxX = var1.maxX;
+ this.maxY = var1.maxY;
+ this.maxZ = var1.maxZ;
+ }
+
+ public String toString() {
+ return "box[" + this.minX + ", " + this.minY + ", " + this.minZ + " -> " + this.maxX + ", " + this.maxY + ", " + this.maxZ + "]";
+ }
+}
diff --git a/src/net/minecraft/src/BiomeGenBase.java b/src/net/minecraft/src/BiomeGenBase.java
new file mode 100644
index 0000000..44dc67f
--- /dev/null
+++ b/src/net/minecraft/src/BiomeGenBase.java
@@ -0,0 +1,112 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class BiomeGenBase {
+ public static final BiomeGenBase rainforest = (new BiomeGenRainforest()).setColor(588342).setBiomeName("Rainforest").func_4080_a(2094168);
+ public static final BiomeGenBase swampland = (new BiomeGenSwamp()).setColor(522674).setBiomeName("Swampland").func_4080_a(9154376);
+ public static final BiomeGenBase seasonalForest = (new BiomeGenBase()).setColor(10215459).setBiomeName("Seasonal Forest");
+ public static final BiomeGenBase forest = (new BiomeGenForest()).setColor(353825).setBiomeName("Forest").func_4080_a(5159473);
+ public static final BiomeGenBase savanna = (new BiomeGenDesert()).setColor(14278691).setBiomeName("Savanna");
+ public static final BiomeGenBase shrubland = (new BiomeGenBase()).setColor(10595616).setBiomeName("Shrubland");
+ public static final BiomeGenBase taiga = (new BiomeGenTaiga()).setColor(3060051).setBiomeName("Taiga").setEnableSnow().func_4080_a(8107825);
+ public static final BiomeGenBase desert = (new BiomeGenDesert()).setColor(16421912).setBiomeName("Desert").setDisableRain();
+ public static final BiomeGenBase plains = (new BiomeGenDesert()).setColor(16767248).setBiomeName("Plains");
+ public static final BiomeGenBase iceDesert = (new BiomeGenDesert()).setColor(16772499).setBiomeName("Ice Desert").setEnableSnow().setDisableRain().func_4080_a(12899129);
+ public static final BiomeGenBase tundra = (new BiomeGenBase()).setColor(5762041).setBiomeName("Tundra").setEnableSnow().func_4080_a(12899129);
+ public static final BiomeGenBase hell = (new BiomeGenHell()).setColor(16711680).setBiomeName("Hell").setDisableRain();
+ public static final BiomeGenBase field_28054_m = (new BiomeGenSky()).setColor(8421631).setBiomeName("Sky").setDisableRain();
+ public String biomeName;
+ public int color;
+ public byte topBlock = (byte)Block.grass.blockID;
+ public byte fillerBlock = (byte)Block.dirt.blockID;
+ public int field_6161_q = 5169201;
+ protected List spawnableMonsterList = new ArrayList();
+ protected List spawnableCreatureList = new ArrayList();
+ protected List spawnableWaterCreatureList = new ArrayList();
+ private boolean enableSnow;
+ private boolean enableRain = true;
+ private static BiomeGenBase[] biomeLookupTable = new BiomeGenBase[4096];
+
+ protected BiomeGenBase() {
+ this.spawnableMonsterList.add(new SpawnListEntry(EntitySpider.class, 10));
+ this.spawnableMonsterList.add(new SpawnListEntry(EntityZombie.class, 10));
+ this.spawnableMonsterList.add(new SpawnListEntry(EntitySkeleton.class, 10));
+ this.spawnableMonsterList.add(new SpawnListEntry(EntityCreeper.class, 10));
+ this.spawnableMonsterList.add(new SpawnListEntry(EntitySlime.class, 10));
+ this.spawnableCreatureList.add(new SpawnListEntry(EntitySheep.class, 12));
+ this.spawnableCreatureList.add(new SpawnListEntry(EntityPig.class, 10));
+ this.spawnableCreatureList.add(new SpawnListEntry(EntityChicken.class, 10));
+ this.spawnableCreatureList.add(new SpawnListEntry(EntityCow.class, 8));
+ this.spawnableWaterCreatureList.add(new SpawnListEntry(EntitySquid.class, 10));
+ }
+
+ private BiomeGenBase setDisableRain() {
+ this.enableRain = false;
+ return this;
+ }
+
+ public static void generateBiomeLookup() {
+ for(int var0 = 0; var0 < 64; ++var0) {
+ for(int var1 = 0; var1 < 64; ++var1) {
+ biomeLookupTable[var0 + var1 * 64] = getBiome((float)var0 / 63.0F, (float)var1 / 63.0F);
+ }
+ }
+
+ desert.topBlock = desert.fillerBlock = (byte)Block.sand.blockID;
+ iceDesert.topBlock = iceDesert.fillerBlock = (byte)Block.sand.blockID;
+ }
+
+ public WorldGenerator getRandomWorldGenForTrees(Random var1) {
+ return (WorldGenerator)(var1.nextInt(10) == 0 ? new WorldGenBigTree() : new WorldGenTrees());
+ }
+
+ protected BiomeGenBase setEnableSnow() {
+ this.enableSnow = true;
+ return this;
+ }
+
+ protected BiomeGenBase setBiomeName(String var1) {
+ this.biomeName = var1;
+ return this;
+ }
+
+ protected BiomeGenBase func_4080_a(int var1) {
+ this.field_6161_q = var1;
+ return this;
+ }
+
+ protected BiomeGenBase setColor(int var1) {
+ this.color = var1;
+ return this;
+ }
+
+ public static BiomeGenBase getBiomeFromLookup(double var0, double var2) {
+ int var4 = (int)(var0 * 63.0D);
+ int var5 = (int)(var2 * 63.0D);
+ return biomeLookupTable[var4 + var5 * 64];
+ }
+
+ public static BiomeGenBase getBiome(float var0, float var1) {
+ var1 *= var0;
+ return var0 < 0.1F ? tundra : (var1 < 0.2F ? (var0 < 0.5F ? tundra : (var0 < 0.95F ? savanna : desert)) : (var1 > 0.5F && var0 < 0.7F ? swampland : (var0 < 0.5F ? taiga : (var0 < 0.97F ? (var1 < 0.35F ? shrubland : forest) : (var1 < 0.45F ? plains : (var1 < 0.9F ? seasonalForest : rainforest))))));
+ }
+
+ public List getSpawnableList(EnumCreatureType var1) {
+ return var1 == EnumCreatureType.monster ? this.spawnableMonsterList : (var1 == EnumCreatureType.creature ? this.spawnableCreatureList : (var1 == EnumCreatureType.waterCreature ? this.spawnableWaterCreatureList : null));
+ }
+
+ public boolean getEnableSnow() {
+ return this.enableSnow;
+ }
+
+ public boolean canSpawnLightningBolt() {
+ return this.enableSnow ? false : this.enableRain;
+ }
+
+ static {
+ generateBiomeLookup();
+ }
+}
diff --git a/src/net/minecraft/src/BiomeGenDesert.java b/src/net/minecraft/src/BiomeGenDesert.java
new file mode 100644
index 0000000..2d4b40b
--- /dev/null
+++ b/src/net/minecraft/src/BiomeGenDesert.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public class BiomeGenDesert extends BiomeGenBase {
+}
diff --git a/src/net/minecraft/src/BiomeGenForest.java b/src/net/minecraft/src/BiomeGenForest.java
new file mode 100644
index 0000000..6243aaa
--- /dev/null
+++ b/src/net/minecraft/src/BiomeGenForest.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BiomeGenForest extends BiomeGenBase {
+ public BiomeGenForest() {
+ this.spawnableCreatureList.add(new SpawnListEntry(EntityWolf.class, 2));
+ }
+
+ public WorldGenerator getRandomWorldGenForTrees(Random var1) {
+ return (WorldGenerator)(var1.nextInt(5) == 0 ? new WorldGenForest() : (var1.nextInt(3) == 0 ? new WorldGenBigTree() : new WorldGenTrees()));
+ }
+}
diff --git a/src/net/minecraft/src/BiomeGenHell.java b/src/net/minecraft/src/BiomeGenHell.java
new file mode 100644
index 0000000..aefedfc
--- /dev/null
+++ b/src/net/minecraft/src/BiomeGenHell.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public class BiomeGenHell extends BiomeGenBase {
+ public BiomeGenHell() {
+ this.spawnableMonsterList.clear();
+ this.spawnableCreatureList.clear();
+ this.spawnableWaterCreatureList.clear();
+ this.spawnableMonsterList.add(new SpawnListEntry(EntityGhast.class, 10));
+ this.spawnableMonsterList.add(new SpawnListEntry(EntityPigZombie.class, 10));
+ }
+}
diff --git a/src/net/minecraft/src/BiomeGenRainforest.java b/src/net/minecraft/src/BiomeGenRainforest.java
new file mode 100644
index 0000000..e21a0f3
--- /dev/null
+++ b/src/net/minecraft/src/BiomeGenRainforest.java
@@ -0,0 +1,9 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BiomeGenRainforest extends BiomeGenBase {
+ public WorldGenerator getRandomWorldGenForTrees(Random var1) {
+ return (WorldGenerator)(var1.nextInt(3) == 0 ? new WorldGenBigTree() : new WorldGenTrees());
+ }
+}
diff --git a/src/net/minecraft/src/BiomeGenSky.java b/src/net/minecraft/src/BiomeGenSky.java
new file mode 100644
index 0000000..4960eef
--- /dev/null
+++ b/src/net/minecraft/src/BiomeGenSky.java
@@ -0,0 +1,10 @@
+package net.minecraft.src;
+
+public class BiomeGenSky extends BiomeGenBase {
+ public BiomeGenSky() {
+ this.spawnableMonsterList.clear();
+ this.spawnableCreatureList.clear();
+ this.spawnableWaterCreatureList.clear();
+ this.spawnableCreatureList.add(new SpawnListEntry(EntityChicken.class, 10));
+ }
+}
diff --git a/src/net/minecraft/src/BiomeGenSwamp.java b/src/net/minecraft/src/BiomeGenSwamp.java
new file mode 100644
index 0000000..a3e8b27
--- /dev/null
+++ b/src/net/minecraft/src/BiomeGenSwamp.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public class BiomeGenSwamp extends BiomeGenBase {
+}
diff --git a/src/net/minecraft/src/BiomeGenTaiga.java b/src/net/minecraft/src/BiomeGenTaiga.java
new file mode 100644
index 0000000..090c41c
--- /dev/null
+++ b/src/net/minecraft/src/BiomeGenTaiga.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BiomeGenTaiga extends BiomeGenBase {
+ public BiomeGenTaiga() {
+ this.spawnableCreatureList.add(new SpawnListEntry(EntityWolf.class, 2));
+ }
+
+ public WorldGenerator getRandomWorldGenForTrees(Random var1) {
+ return (WorldGenerator)(var1.nextInt(3) == 0 ? new WorldGenTaiga1() : new WorldGenTaiga2());
+ }
+}
diff --git a/src/net/minecraft/src/Block.java b/src/net/minecraft/src/Block.java
new file mode 100644
index 0000000..f0cd654
--- /dev/null
+++ b/src/net/minecraft/src/Block.java
@@ -0,0 +1,543 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+public class Block {
+ public static final StepSound soundPowderFootstep = new StepSound("stone", 1.0F, 1.0F);
+ public static final StepSound soundWoodFootstep = new StepSound("wood", 1.0F, 1.0F);
+ public static final StepSound soundGravelFootstep = new StepSound("gravel", 1.0F, 1.0F);
+ public static final StepSound soundGrassFootstep = new StepSound("grass", 1.0F, 1.0F);
+ public static final StepSound soundStoneFootstep = new StepSound("stone", 1.0F, 1.0F);
+ public static final StepSound soundMetalFootstep = new StepSound("stone", 1.0F, 1.5F);
+ public static final StepSound soundGlassFootstep = new StepSoundStone("stone", 1.0F, 1.0F);
+ public static final StepSound soundClothFootstep = new StepSound("cloth", 1.0F, 1.0F);
+ public static final StepSound soundSandFootstep = new StepSoundSand("sand", 1.0F, 1.0F);
+ public static final Block[] blocksList = new Block[256];
+ public static final boolean[] tickOnLoad = new boolean[256];
+ public static final boolean[] opaqueCubeLookup = new boolean[256];
+ public static final boolean[] isBlockContainer = new boolean[256];
+ public static final int[] lightOpacity = new int[256];
+ public static final boolean[] canBlockGrass = new boolean[256];
+ public static final int[] lightValue = new int[256];
+ public static final boolean[] requiresSelfNotify = new boolean[256];
+ public static final Block stone = (new BlockStone(1, 1)).setHardness(1.5F).setResistance(10.0F).setStepSound(soundStoneFootstep).setBlockName("stone");
+ public static final BlockGrass grass = (BlockGrass)(new BlockGrass(2)).setHardness(0.6F).setStepSound(soundGrassFootstep).setBlockName("grass");
+ public static final Block dirt = (new BlockDirt(3, 2)).setHardness(0.5F).setStepSound(soundGravelFootstep).setBlockName("dirt");
+ public static final Block cobblestone = (new Block(4, 16, Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep).setBlockName("stonebrick");
+ public static final Block planks = (new Block(5, 4, Material.wood)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundWoodFootstep).setBlockName("wood").setRequiresSelfNotify();
+ public static final Block sapling = (new BlockSapling(6, 15)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("sapling").setRequiresSelfNotify();
+ public static final Block bedrock = (new Block(7, 17, Material.rock)).setBlockUnbreakable().setResistance(6000000.0F).setStepSound(soundStoneFootstep).setBlockName("bedrock").disableStats();
+ public static final Block waterMoving = (new BlockFlowing(8, Material.water)).setHardness(100.0F).setLightOpacity(3).setBlockName("water").disableStats().setRequiresSelfNotify();
+ public static final Block waterStill = (new BlockStationary(9, Material.water)).setHardness(100.0F).setLightOpacity(3).setBlockName("water").disableStats().setRequiresSelfNotify();
+ public static final Block lavaMoving = (new BlockFlowing(10, Material.lava)).setHardness(0.0F).setLightValue(1.0F).setLightOpacity(255).setBlockName("lava").disableStats().setRequiresSelfNotify();
+ public static final Block lavaStill = (new BlockStationary(11, Material.lava)).setHardness(100.0F).setLightValue(1.0F).setLightOpacity(255).setBlockName("lava").disableStats().setRequiresSelfNotify();
+ public static final Block sand = (new BlockSand(12, 18)).setHardness(0.5F).setStepSound(soundSandFootstep).setBlockName("sand");
+ public static final Block gravel = (new BlockGravel(13, 19)).setHardness(0.6F).setStepSound(soundGravelFootstep).setBlockName("gravel");
+ public static final Block oreGold = (new BlockOre(14, 32)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep).setBlockName("oreGold");
+ public static final Block oreIron = (new BlockOre(15, 33)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep).setBlockName("oreIron");
+ public static final Block oreCoal = (new BlockOre(16, 34)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep).setBlockName("oreCoal");
+ public static final Block wood = (new BlockLog(17)).setHardness(2.0F).setStepSound(soundWoodFootstep).setBlockName("log").setRequiresSelfNotify();
+ public static final BlockLeaves leaves = (BlockLeaves)(new BlockLeaves(18, 52)).setHardness(0.2F).setLightOpacity(1).setStepSound(soundGrassFootstep).setBlockName("leaves").disableStats().setRequiresSelfNotify();
+ public static final Block sponge = (new BlockSponge(19)).setHardness(0.6F).setStepSound(soundGrassFootstep).setBlockName("sponge");
+ public static final Block glass = (new BlockGlass(20, 49, Material.glass, false)).setHardness(0.3F).setStepSound(soundGlassFootstep).setBlockName("glass");
+ public static final Block oreLapis = (new BlockOre(21, 160)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep).setBlockName("oreLapis");
+ public static final Block blockLapis = (new Block(22, 144, Material.rock)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep).setBlockName("blockLapis");
+ public static final Block dispenser = (new BlockDispenser(23)).setHardness(3.5F).setStepSound(soundStoneFootstep).setBlockName("dispenser").setRequiresSelfNotify();
+ public static final Block sandStone = (new BlockSandStone(24)).setStepSound(soundStoneFootstep).setHardness(0.8F).setBlockName("sandStone");
+ public static final Block musicBlock = (new BlockNote(25)).setHardness(0.8F).setBlockName("musicBlock").setRequiresSelfNotify();
+ public static final Block bed = (new BlockBed(26)).setHardness(0.2F).setBlockName("bed").disableStats().setRequiresSelfNotify();
+ public static final Block railPowered = (new BlockRail(27, 179, true)).setHardness(0.7F).setStepSound(soundMetalFootstep).setBlockName("goldenRail").setRequiresSelfNotify();
+ public static final Block railDetector = (new BlockDetectorRail(28, 195)).setHardness(0.7F).setStepSound(soundMetalFootstep).setBlockName("detectorRail").setRequiresSelfNotify();
+ public static final Block pistonStickyBase = (new BlockPistonBase(29, 106, true)).setBlockName("pistonStickyBase").setRequiresSelfNotify();
+ public static final Block web = (new BlockWeb(30, 11)).setLightOpacity(1).setHardness(4.0F).setBlockName("web");
+ public static final BlockTallGrass tallGrass = (BlockTallGrass)(new BlockTallGrass(31, 39)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("tallgrass");
+ public static final BlockDeadBush deadBush = (BlockDeadBush)(new BlockDeadBush(32, 55)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("deadbush");
+ public static final Block pistonBase = (new BlockPistonBase(33, 107, false)).setBlockName("pistonBase").setRequiresSelfNotify();
+ public static final BlockPistonExtension pistonExtension = (BlockPistonExtension)(new BlockPistonExtension(34, 107)).setRequiresSelfNotify();
+ public static final Block cloth = (new BlockCloth()).setHardness(0.8F).setStepSound(soundClothFootstep).setBlockName("cloth").setRequiresSelfNotify();
+ public static final BlockPistonMoving pistonMoving = new BlockPistonMoving(36);
+ public static final BlockFlower plantYellow = (BlockFlower)(new BlockFlower(37, 13)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("flower");
+ public static final BlockFlower plantRed = (BlockFlower)(new BlockFlower(38, 12)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("rose");
+ public static final BlockFlower mushroomBrown = (BlockFlower)(new BlockMushroom(39, 29)).setHardness(0.0F).setStepSound(soundGrassFootstep).setLightValue(2.0F / 16.0F).setBlockName("mushroom");
+ public static final BlockFlower mushroomRed = (BlockFlower)(new BlockMushroom(40, 28)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("mushroom");
+ public static final Block blockGold = (new BlockOreStorage(41, 23)).setHardness(3.0F).setResistance(10.0F).setStepSound(soundMetalFootstep).setBlockName("blockGold");
+ public static final Block blockSteel = (new BlockOreStorage(42, 22)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundMetalFootstep).setBlockName("blockIron");
+ public static final Block stairDouble = (new BlockStep(43, true)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep).setBlockName("stoneSlab");
+ public static final Block stairSingle = (new BlockStep(44, false)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep).setBlockName("stoneSlab");
+ public static final Block brick = (new Block(45, 7, Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep).setBlockName("brick");
+ public static final Block tnt = (new BlockTNT(46, 8)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("tnt");
+ public static final Block bookShelf = (new BlockBookshelf(47, 35)).setHardness(1.5F).setStepSound(soundWoodFootstep).setBlockName("bookshelf");
+ public static final Block cobblestoneMossy = (new Block(48, 36, Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep).setBlockName("stoneMoss");
+ public static final Block obsidian = (new BlockObsidian(49, 37)).setHardness(10.0F).setResistance(2000.0F).setStepSound(soundStoneFootstep).setBlockName("obsidian");
+ public static final Block torchWood = (new BlockTorch(50, 80)).setHardness(0.0F).setLightValue(15.0F / 16.0F).setStepSound(soundWoodFootstep).setBlockName("torch").setRequiresSelfNotify();
+ public static final BlockFire fire = (BlockFire)(new BlockFire(51, 31)).setHardness(0.0F).setLightValue(1.0F).setStepSound(soundWoodFootstep).setBlockName("fire").disableStats().setRequiresSelfNotify();
+ public static final Block mobSpawner = (new BlockMobSpawner(52, 65)).setHardness(5.0F).setStepSound(soundMetalFootstep).setBlockName("mobSpawner").disableStats();
+ public static final Block stairCompactPlanks = (new BlockStairs(53, planks)).setBlockName("stairsWood").setRequiresSelfNotify();
+ public static final Block chest = (new BlockChest(54)).setHardness(2.5F).setStepSound(soundWoodFootstep).setBlockName("chest").setRequiresSelfNotify();
+ public static final Block redstoneWire = (new BlockRedstoneWire(55, 164)).setHardness(0.0F).setStepSound(soundPowderFootstep).setBlockName("redstoneDust").disableStats().setRequiresSelfNotify();
+ public static final Block oreDiamond = (new BlockOre(56, 50)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep).setBlockName("oreDiamond");
+ public static final Block blockDiamond = (new BlockOreStorage(57, 24)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundMetalFootstep).setBlockName("blockDiamond");
+ public static final Block workbench = (new BlockWorkbench(58)).setHardness(2.5F).setStepSound(soundWoodFootstep).setBlockName("workbench");
+ public static final Block crops = (new BlockCrops(59, 88)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("crops").disableStats().setRequiresSelfNotify();
+ public static final Block tilledField = (new BlockFarmland(60)).setHardness(0.6F).setStepSound(soundGravelFootstep).setBlockName("farmland");
+ public static final Block stoneOvenIdle = (new BlockFurnace(61, false)).setHardness(3.5F).setStepSound(soundStoneFootstep).setBlockName("furnace").setRequiresSelfNotify();
+ public static final Block stoneOvenActive = (new BlockFurnace(62, true)).setHardness(3.5F).setStepSound(soundStoneFootstep).setLightValue(14.0F / 16.0F).setBlockName("furnace").setRequiresSelfNotify();
+ public static final Block signPost = (new BlockSign(63, TileEntitySign.class, true)).setHardness(1.0F).setStepSound(soundWoodFootstep).setBlockName("sign").disableStats().setRequiresSelfNotify();
+ public static final Block doorWood = (new BlockDoor(64, Material.wood)).setHardness(3.0F).setStepSound(soundWoodFootstep).setBlockName("doorWood").disableStats().setRequiresSelfNotify();
+ public static final Block ladder = (new BlockLadder(65, 83)).setHardness(0.4F).setStepSound(soundWoodFootstep).setBlockName("ladder").setRequiresSelfNotify();
+ public static final Block minecartTrack = (new BlockRail(66, 128, false)).setHardness(0.7F).setStepSound(soundMetalFootstep).setBlockName("rail").setRequiresSelfNotify();
+ public static final Block stairCompactCobblestone = (new BlockStairs(67, cobblestone)).setBlockName("stairsStone").setRequiresSelfNotify();
+ public static final Block signWall = (new BlockSign(68, TileEntitySign.class, false)).setHardness(1.0F).setStepSound(soundWoodFootstep).setBlockName("sign").disableStats().setRequiresSelfNotify();
+ public static final Block lever = (new BlockLever(69, 96)).setHardness(0.5F).setStepSound(soundWoodFootstep).setBlockName("lever").setRequiresSelfNotify();
+ public static final Block pressurePlateStone = (new BlockPressurePlate(70, stone.blockIndexInTexture, EnumMobType.mobs, Material.rock)).setHardness(0.5F).setStepSound(soundStoneFootstep).setBlockName("pressurePlate").setRequiresSelfNotify();
+ public static final Block doorSteel = (new BlockDoor(71, Material.iron)).setHardness(5.0F).setStepSound(soundMetalFootstep).setBlockName("doorIron").disableStats().setRequiresSelfNotify();
+ public static final Block pressurePlatePlanks = (new BlockPressurePlate(72, planks.blockIndexInTexture, EnumMobType.everything, Material.wood)).setHardness(0.5F).setStepSound(soundWoodFootstep).setBlockName("pressurePlate").setRequiresSelfNotify();
+ public static final Block oreRedstone = (new BlockRedstoneOre(73, 51, false)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep).setBlockName("oreRedstone").setRequiresSelfNotify();
+ public static final Block oreRedstoneGlowing = (new BlockRedstoneOre(74, 51, true)).setLightValue(10.0F / 16.0F).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep).setBlockName("oreRedstone").setRequiresSelfNotify();
+ public static final Block torchRedstoneIdle = (new BlockRedstoneTorch(75, 115, false)).setHardness(0.0F).setStepSound(soundWoodFootstep).setBlockName("notGate").setRequiresSelfNotify();
+ public static final Block torchRedstoneActive = (new BlockRedstoneTorch(76, 99, true)).setHardness(0.0F).setLightValue(0.5F).setStepSound(soundWoodFootstep).setBlockName("notGate").setRequiresSelfNotify();
+ public static final Block button = (new BlockButton(77, stone.blockIndexInTexture)).setHardness(0.5F).setStepSound(soundStoneFootstep).setBlockName("button").setRequiresSelfNotify();
+ public static final Block snow = (new BlockSnow(78, 66)).setHardness(0.1F).setStepSound(soundClothFootstep).setBlockName("snow");
+ public static final Block ice = (new BlockIce(79, 67)).setHardness(0.5F).setLightOpacity(3).setStepSound(soundGlassFootstep).setBlockName("ice");
+ public static final Block blockSnow = (new BlockSnowBlock(80, 66)).setHardness(0.2F).setStepSound(soundClothFootstep).setBlockName("snow");
+ public static final Block cactus = (new BlockCactus(81, 70)).setHardness(0.4F).setStepSound(soundClothFootstep).setBlockName("cactus");
+ public static final Block blockClay = (new BlockClay(82, 72)).setHardness(0.6F).setStepSound(soundGravelFootstep).setBlockName("clay");
+ public static final Block reed = (new BlockReed(83, 73)).setHardness(0.0F).setStepSound(soundGrassFootstep).setBlockName("reeds").disableStats();
+ public static final Block jukebox = (new BlockJukeBox(84, 74)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep).setBlockName("jukebox").setRequiresSelfNotify();
+ public static final Block fence = (new BlockFence(85, 4)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundWoodFootstep).setBlockName("fence").setRequiresSelfNotify();
+ public static final Block pumpkin = (new BlockPumpkin(86, 102, false)).setHardness(1.0F).setStepSound(soundWoodFootstep).setBlockName("pumpkin").setRequiresSelfNotify();
+ public static final Block bloodStone = (new BlockNetherrack(87, 103)).setHardness(0.4F).setStepSound(soundStoneFootstep).setBlockName("hellrock");
+ public static final Block slowSand = (new BlockSoulSand(88, 104)).setHardness(0.5F).setStepSound(soundSandFootstep).setBlockName("hellsand");
+ public static final Block glowStone = (new BlockGlowStone(89, 105, Material.rock)).setHardness(0.3F).setStepSound(soundGlassFootstep).setLightValue(1.0F).setBlockName("lightgem");
+ public static final BlockPortal portal = (BlockPortal)(new BlockPortal(90, 14)).setHardness(-1.0F).setStepSound(soundGlassFootstep).setLightValue(12.0F / 16.0F).setBlockName("portal");
+ public static final Block pumpkinLantern = (new BlockPumpkin(91, 102, true)).setHardness(1.0F).setStepSound(soundWoodFootstep).setLightValue(1.0F).setBlockName("litpumpkin").setRequiresSelfNotify();
+ public static final Block cake = (new BlockCake(92, 121)).setHardness(0.5F).setStepSound(soundClothFootstep).setBlockName("cake").disableStats().setRequiresSelfNotify();
+ public static final Block redstoneRepeaterIdle = (new BlockRedstoneRepeater(93, false)).setHardness(0.0F).setStepSound(soundWoodFootstep).setBlockName("diode").disableStats().setRequiresSelfNotify();
+ public static final Block redstoneRepeaterActive = (new BlockRedstoneRepeater(94, true)).setHardness(0.0F).setLightValue(10.0F / 16.0F).setStepSound(soundWoodFootstep).setBlockName("diode").disableStats().setRequiresSelfNotify();
+ public static final Block lockedChest = (new BlockLockedChest(95)).setHardness(0.0F).setLightValue(1.0F).setStepSound(soundWoodFootstep).setBlockName("lockedchest").setTickOnLoad(true).setRequiresSelfNotify();
+ public static final Block trapdoor = (new BlockTrapDoor(96, Material.wood)).setHardness(3.0F).setStepSound(soundWoodFootstep).setBlockName("trapdoor").disableStats().setRequiresSelfNotify();
+ public int blockIndexInTexture;
+ public final int blockID;
+ protected float blockHardness;
+ protected float blockResistance;
+ protected boolean blockConstructorCalled;
+ protected boolean enableStats;
+ public double minX;
+ public double minY;
+ public double minZ;
+ public double maxX;
+ public double maxY;
+ public double maxZ;
+ public StepSound stepSound;
+ public float blockParticleGravity;
+ public final Material blockMaterial;
+ public float slipperiness;
+ private String blockName;
+
+ protected Block(int var1, Material var2) {
+ this.blockConstructorCalled = true;
+ this.enableStats = true;
+ this.stepSound = soundPowderFootstep;
+ this.blockParticleGravity = 1.0F;
+ this.slipperiness = 0.6F;
+ if(blocksList[var1] != null) {
+ throw new IllegalArgumentException("Slot " + var1 + " is already occupied by " + blocksList[var1] + " when adding " + this);
+ } else {
+ this.blockMaterial = var2;
+ blocksList[var1] = this;
+ this.blockID = var1;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ opaqueCubeLookup[var1] = this.isOpaqueCube();
+ lightOpacity[var1] = this.isOpaqueCube() ? 255 : 0;
+ canBlockGrass[var1] = !var2.getCanBlockGrass();
+ isBlockContainer[var1] = false;
+ }
+ }
+
+ protected Block setRequiresSelfNotify() {
+ requiresSelfNotify[this.blockID] = true;
+ return this;
+ }
+
+ protected void setFireBurnRates() {
+ }
+
+ protected Block(int var1, int var2, Material var3) {
+ this(var1, var3);
+ this.blockIndexInTexture = var2;
+ }
+
+ protected Block setStepSound(StepSound var1) {
+ this.stepSound = var1;
+ return this;
+ }
+
+ protected Block setLightOpacity(int var1) {
+ lightOpacity[this.blockID] = var1;
+ return this;
+ }
+
+ protected Block setLightValue(float var1) {
+ lightValue[this.blockID] = (int)(15.0F * var1);
+ return this;
+ }
+
+ protected Block setResistance(float var1) {
+ this.blockResistance = var1 * 3.0F;
+ return this;
+ }
+
+ public boolean isACube() {
+ return true;
+ }
+
+ protected Block setHardness(float var1) {
+ this.blockHardness = var1;
+ if(this.blockResistance < var1 * 5.0F) {
+ this.blockResistance = var1 * 5.0F;
+ }
+
+ return this;
+ }
+
+ protected Block setBlockUnbreakable() {
+ this.setHardness(-1.0F);
+ return this;
+ }
+
+ public float getHardness() {
+ return this.blockHardness;
+ }
+
+ protected Block setTickOnLoad(boolean var1) {
+ tickOnLoad[this.blockID] = var1;
+ return this;
+ }
+
+ public void setBlockBounds(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.minX = (double)var1;
+ this.minY = (double)var2;
+ this.minZ = (double)var3;
+ this.maxX = (double)var4;
+ this.maxY = (double)var5;
+ this.maxZ = (double)var6;
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return var1.getBlockMaterial(var2, var3, var4).isSolid();
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return this.getBlockTextureFromSide(var1);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.blockIndexInTexture;
+ }
+
+ public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) {
+ AxisAlignedBB var7 = this.getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ if(var7 != null && var5.intersectsWith(var7)) {
+ var6.add(var7);
+ }
+
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return AxisAlignedBB.getBoundingBoxFromPool((double)var2 + this.minX, (double)var3 + this.minY, (double)var4 + this.minZ, (double)var2 + this.maxX, (double)var3 + this.maxY, (double)var4 + this.maxZ);
+ }
+
+ public boolean isOpaqueCube() {
+ return true;
+ }
+
+ public boolean canCollideCheck(int var1, boolean var2) {
+ return this.isCollidable();
+ }
+
+ public boolean isCollidable() {
+ return true;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ }
+
+ public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) {
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ }
+
+ public int tickRate() {
+ return 10;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return this.blockID;
+ }
+
+ public float blockStrength(EntityPlayer var1) {
+ return this.blockHardness < 0.0F ? 0.0F : (!var1.canHarvestBlock(this) ? 1.0F / this.blockHardness / 100.0F : var1.getCurrentPlayerStrVsBlock(this) / this.blockHardness / 30.0F);
+ }
+
+ public final void dropBlockAsItem(World var1, int var2, int var3, int var4, int var5) {
+ this.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, 1.0F);
+ }
+
+ public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) {
+ if(!var1.singleplayerWorld) {
+ int var7 = this.quantityDropped(var1.rand);
+
+ for(int var8 = 0; var8 < var7; ++var8) {
+ if(var1.rand.nextFloat() <= var6) {
+ int var9 = this.idDropped(var5, var1.rand);
+ if(var9 > 0) {
+ this.dropBlockAsItem_do(var1, var2, var3, var4, new ItemStack(var9, 1, this.damageDropped(var5)));
+ }
+ }
+ }
+
+ }
+ }
+
+ protected void dropBlockAsItem_do(World var1, int var2, int var3, int var4, ItemStack var5) {
+ if(!var1.singleplayerWorld) {
+ float var6 = 0.7F;
+ double var7 = (double)(var1.rand.nextFloat() * var6) + (double)(1.0F - var6) * 0.5D;
+ double var9 = (double)(var1.rand.nextFloat() * var6) + (double)(1.0F - var6) * 0.5D;
+ double var11 = (double)(var1.rand.nextFloat() * var6) + (double)(1.0F - var6) * 0.5D;
+ EntityItem var13 = new EntityItem(var1, (double)var2 + var7, (double)var3 + var9, (double)var4 + var11, var5);
+ var13.delayBeforeCanPickup = 10;
+ var1.entityJoinedWorld(var13);
+ }
+ }
+
+ protected int damageDropped(int var1) {
+ return 0;
+ }
+
+ public float getExplosionResistance(Entity var1) {
+ return this.blockResistance / 5.0F;
+ }
+
+ public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ var5 = var5.addVector((double)(-var2), (double)(-var3), (double)(-var4));
+ var6 = var6.addVector((double)(-var2), (double)(-var3), (double)(-var4));
+ Vec3D var7 = var5.getIntermediateWithXValue(var6, this.minX);
+ Vec3D var8 = var5.getIntermediateWithXValue(var6, this.maxX);
+ Vec3D var9 = var5.getIntermediateWithYValue(var6, this.minY);
+ Vec3D var10 = var5.getIntermediateWithYValue(var6, this.maxY);
+ Vec3D var11 = var5.getIntermediateWithZValue(var6, this.minZ);
+ Vec3D var12 = var5.getIntermediateWithZValue(var6, this.maxZ);
+ if(!this.isVecInsideYZBounds(var7)) {
+ var7 = null;
+ }
+
+ if(!this.isVecInsideYZBounds(var8)) {
+ var8 = null;
+ }
+
+ if(!this.isVecInsideXZBounds(var9)) {
+ var9 = null;
+ }
+
+ if(!this.isVecInsideXZBounds(var10)) {
+ var10 = null;
+ }
+
+ if(!this.isVecInsideXYBounds(var11)) {
+ var11 = null;
+ }
+
+ if(!this.isVecInsideXYBounds(var12)) {
+ var12 = null;
+ }
+
+ Vec3D var13 = null;
+ if(var7 != null && (var13 == null || var5.distanceTo(var7) < var5.distanceTo(var13))) {
+ var13 = var7;
+ }
+
+ if(var8 != null && (var13 == null || var5.distanceTo(var8) < var5.distanceTo(var13))) {
+ var13 = var8;
+ }
+
+ if(var9 != null && (var13 == null || var5.distanceTo(var9) < var5.distanceTo(var13))) {
+ var13 = var9;
+ }
+
+ if(var10 != null && (var13 == null || var5.distanceTo(var10) < var5.distanceTo(var13))) {
+ var13 = var10;
+ }
+
+ if(var11 != null && (var13 == null || var5.distanceTo(var11) < var5.distanceTo(var13))) {
+ var13 = var11;
+ }
+
+ if(var12 != null && (var13 == null || var5.distanceTo(var12) < var5.distanceTo(var13))) {
+ var13 = var12;
+ }
+
+ if(var13 == null) {
+ return null;
+ } else {
+ byte var14 = -1;
+ if(var13 == var7) {
+ var14 = 4;
+ }
+
+ if(var13 == var8) {
+ var14 = 5;
+ }
+
+ if(var13 == var9) {
+ var14 = 0;
+ }
+
+ if(var13 == var10) {
+ var14 = 1;
+ }
+
+ if(var13 == var11) {
+ var14 = 2;
+ }
+
+ if(var13 == var12) {
+ var14 = 3;
+ }
+
+ return new MovingObjectPosition(var2, var3, var4, var14, var13.addVector((double)var2, (double)var3, (double)var4));
+ }
+ }
+
+ private boolean isVecInsideYZBounds(Vec3D var1) {
+ return var1 == null ? false : var1.yCoord >= this.minY && var1.yCoord <= this.maxY && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ;
+ }
+
+ private boolean isVecInsideXZBounds(Vec3D var1) {
+ return var1 == null ? false : var1.xCoord >= this.minX && var1.xCoord <= this.maxX && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ;
+ }
+
+ private boolean isVecInsideXYBounds(Vec3D var1) {
+ return var1 == null ? false : var1.xCoord >= this.minX && var1.xCoord <= this.maxX && var1.yCoord >= this.minY && var1.yCoord <= this.maxY;
+ }
+
+ public void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) {
+ }
+
+ public boolean canPlaceBlockOnSide(World var1, int var2, int var3, int var4, int var5) {
+ return this.canPlaceBlockAt(var1, var2, var3, var4);
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3, var4);
+ return var5 == 0 || blocksList[var5].blockMaterial.func_27090_g();
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ return false;
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ }
+
+ public void velocityToAddToEntity(World var1, int var2, int var3, int var4, Entity var5, Vec3D var6) {
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return false;
+ }
+
+ public boolean canProvidePower() {
+ return false;
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return false;
+ }
+
+ public void harvestBlock(World var1, EntityPlayer var2, int var3, int var4, int var5, int var6) {
+ var2.addStat(StatList.mineBlockStatArray[this.blockID], 1);
+ this.dropBlockAsItem(var1, var3, var4, var5, var6);
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return true;
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ }
+
+ public Block setBlockName(String var1) {
+ this.blockName = "tile." + var1;
+ return this;
+ }
+
+ public String getNameLocalizedForStats() {
+ return StatCollector.translateToLocal(this.getBlockName() + ".name");
+ }
+
+ public String getBlockName() {
+ return this.blockName;
+ }
+
+ public void playBlock(World var1, int var2, int var3, int var4, int var5, int var6) {
+ }
+
+ public boolean getEnableStats() {
+ return this.enableStats;
+ }
+
+ protected Block disableStats() {
+ this.enableStats = false;
+ return this;
+ }
+
+ public int getMobilityFlag() {
+ return this.blockMaterial.getMaterialMobility();
+ }
+
+ static {
+ Item.itemsList[cloth.blockID] = (new ItemCloth(cloth.blockID - 256)).setItemName("cloth");
+ Item.itemsList[wood.blockID] = (new ItemLog(wood.blockID - 256)).setItemName("log");
+ Item.itemsList[stairSingle.blockID] = (new ItemSlab(stairSingle.blockID - 256)).setItemName("stoneSlab");
+ Item.itemsList[sapling.blockID] = (new ItemSapling(sapling.blockID - 256)).setItemName("sapling");
+ Item.itemsList[leaves.blockID] = (new ItemLeaves(leaves.blockID - 256)).setItemName("leaves");
+ Item.itemsList[pistonBase.blockID] = new ItemPiston(pistonBase.blockID - 256);
+ Item.itemsList[pistonStickyBase.blockID] = new ItemPiston(pistonStickyBase.blockID - 256);
+
+ for(int var0 = 0; var0 < 256; ++var0) {
+ if(blocksList[var0] != null && Item.itemsList[var0] == null) {
+ Item.itemsList[var0] = new ItemBlock(var0 - 256);
+ blocksList[var0].setFireBurnRates();
+ }
+ }
+
+ canBlockGrass[0] = true;
+ StatList.func_25088_a();
+ }
+}
diff --git a/src/net/minecraft/src/BlockBed.java b/src/net/minecraft/src/BlockBed.java
new file mode 100644
index 0000000..769cf9b
--- /dev/null
+++ b/src/net/minecraft/src/BlockBed.java
@@ -0,0 +1,190 @@
+package net.minecraft.src;
+
+import java.util.Iterator;
+import java.util.Random;
+
+public class BlockBed extends Block {
+ public static final int[][] field_22023_a = new int[][]{{0, 1}, {-1, 0}, {0, -1}, {1, 0}};
+
+ public BlockBed(int var1) {
+ super(var1, 134, Material.cloth);
+ this.setBounds();
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(var1.singleplayerWorld) {
+ return true;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(!func_22020_d(var6)) {
+ int var7 = func_22019_c(var6);
+ var2 += field_22023_a[var7][0];
+ var4 += field_22023_a[var7][1];
+ if(var1.getBlockId(var2, var3, var4) != this.blockID) {
+ return true;
+ }
+
+ var6 = var1.getBlockMetadata(var2, var3, var4);
+ }
+
+ if(!var1.worldProvider.func_28108_d()) {
+ double var16 = (double)var2 + 0.5D;
+ double var17 = (double)var3 + 0.5D;
+ double var11 = (double)var4 + 0.5D;
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ int var13 = func_22019_c(var6);
+ var2 += field_22023_a[var13][0];
+ var4 += field_22023_a[var13][1];
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ var16 = (var16 + (double)var2 + 0.5D) / 2.0D;
+ var17 = (var17 + (double)var3 + 0.5D) / 2.0D;
+ var11 = (var11 + (double)var4 + 0.5D) / 2.0D;
+ }
+
+ var1.newExplosion((Entity)null, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), 5.0F, true);
+ return true;
+ } else {
+ if(func_22018_f(var6)) {
+ EntityPlayer var14 = null;
+ Iterator var8 = var1.playerEntities.iterator();
+
+ while(var8.hasNext()) {
+ EntityPlayer var9 = (EntityPlayer)var8.next();
+ if(var9.func_22057_E()) {
+ ChunkCoordinates var10 = var9.playerLocation;
+ if(var10.posX == var2 && var10.posY == var3 && var10.posZ == var4) {
+ var14 = var9;
+ }
+ }
+ }
+
+ if(var14 != null) {
+ var5.func_22061_a("tile.bed.occupied");
+ return true;
+ }
+
+ func_22022_a(var1, var2, var3, var4, false);
+ }
+
+ EnumStatus var15 = var5.goToSleep(var2, var3, var4);
+ if(var15 == EnumStatus.OK) {
+ func_22022_a(var1, var2, var3, var4, true);
+ return true;
+ } else {
+ if(var15 == EnumStatus.NOT_POSSIBLE_NOW) {
+ var5.func_22061_a("tile.bed.noSleep");
+ }
+
+ return true;
+ }
+ }
+ }
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ if(var1 == 0) {
+ return Block.planks.blockIndexInTexture;
+ } else {
+ int var3 = func_22019_c(var2);
+ int var4 = ModelBed.field_22155_c[var3][var1];
+ return func_22020_d(var2) ? (var4 == 2 ? this.blockIndexInTexture + 2 + 16 : (var4 != 5 && var4 != 4 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture + 1 + 16)) : (var4 == 3 ? this.blockIndexInTexture - 1 + 16 : (var4 != 5 && var4 != 4 ? this.blockIndexInTexture : this.blockIndexInTexture + 16));
+ }
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ this.setBounds();
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = func_22019_c(var6);
+ if(func_22020_d(var6)) {
+ if(var1.getBlockId(var2 - field_22023_a[var7][0], var3, var4 - field_22023_a[var7][1]) != this.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ } else if(var1.getBlockId(var2 + field_22023_a[var7][0], var3, var4 + field_22023_a[var7][1]) != this.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ if(!var1.singleplayerWorld) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var6);
+ }
+ }
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return func_22020_d(var1) ? 0 : Item.bed.shiftedIndex;
+ }
+
+ private void setBounds() {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 9.0F / 16.0F, 1.0F);
+ }
+
+ public static int func_22019_c(int var0) {
+ return var0 & 3;
+ }
+
+ public static boolean func_22020_d(int var0) {
+ return (var0 & 8) != 0;
+ }
+
+ public static boolean func_22018_f(int var0) {
+ return (var0 & 4) != 0;
+ }
+
+ public static void func_22022_a(World var0, int var1, int var2, int var3, boolean var4) {
+ int var5 = var0.getBlockMetadata(var1, var2, var3);
+ if(var4) {
+ var5 |= 4;
+ } else {
+ var5 &= -5;
+ }
+
+ var0.setBlockMetadataWithNotify(var1, var2, var3, var5);
+ }
+
+ public static ChunkCoordinates func_22021_g(World var0, int var1, int var2, int var3, int var4) {
+ int var5 = var0.getBlockMetadata(var1, var2, var3);
+ int var6 = func_22019_c(var5);
+
+ for(int var7 = 0; var7 <= 1; ++var7) {
+ int var8 = var1 - field_22023_a[var6][0] * var7 - 1;
+ int var9 = var3 - field_22023_a[var6][1] * var7 - 1;
+ int var10 = var8 + 2;
+ int var11 = var9 + 2;
+
+ for(int var12 = var8; var12 <= var10; ++var12) {
+ for(int var13 = var9; var13 <= var11; ++var13) {
+ if(var0.isBlockNormalCube(var12, var2 - 1, var13) && var0.isAirBlock(var12, var2, var13) && var0.isAirBlock(var12, var2 + 1, var13)) {
+ if(var4 <= 0) {
+ return new ChunkCoordinates(var12, var2, var13);
+ }
+
+ --var4;
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) {
+ if(!func_22020_d(var5)) {
+ super.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, var6);
+ }
+
+ }
+
+ public int getMobilityFlag() {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/BlockBookshelf.java b/src/net/minecraft/src/BlockBookshelf.java
new file mode 100644
index 0000000..e91f8a9
--- /dev/null
+++ b/src/net/minecraft/src/BlockBookshelf.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockBookshelf extends Block {
+ public BlockBookshelf(int var1, int var2) {
+ super(var1, var2, Material.wood);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 <= 1 ? 4 : this.blockIndexInTexture;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+}
diff --git a/src/net/minecraft/src/BlockBreakable.java b/src/net/minecraft/src/BlockBreakable.java
new file mode 100644
index 0000000..f1b966b
--- /dev/null
+++ b/src/net/minecraft/src/BlockBreakable.java
@@ -0,0 +1,14 @@
+package net.minecraft.src;
+
+public class BlockBreakable extends Block {
+ private boolean field_6084_a;
+
+ protected BlockBreakable(int var1, int var2, Material var3, boolean var4) {
+ super(var1, var2, var3);
+ this.field_6084_a = var4;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/BlockButton.java b/src/net/minecraft/src/BlockButton.java
new file mode 100644
index 0000000..e1c0d04
--- /dev/null
+++ b/src/net/minecraft/src/BlockButton.java
@@ -0,0 +1,215 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockButton extends Block {
+ protected BlockButton(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ this.setTickOnLoad(true);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public int tickRate() {
+ return 20;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean canPlaceBlockOnSide(World var1, int var2, int var3, int var4, int var5) {
+ return var5 == 2 && var1.isBlockNormalCube(var2, var3, var4 + 1) ? true : (var5 == 3 && var1.isBlockNormalCube(var2, var3, var4 - 1) ? true : (var5 == 4 && var1.isBlockNormalCube(var2 + 1, var3, var4) ? true : var5 == 5 && var1.isBlockNormalCube(var2 - 1, var3, var4)));
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2 - 1, var3, var4) ? true : (var1.isBlockNormalCube(var2 + 1, var3, var4) ? true : (var1.isBlockNormalCube(var2, var3, var4 - 1) ? true : var1.isBlockNormalCube(var2, var3, var4 + 1)));
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var6 & 8;
+ var6 &= 7;
+ if(var5 == 2 && var1.isBlockNormalCube(var2, var3, var4 + 1)) {
+ var6 = 4;
+ } else if(var5 == 3 && var1.isBlockNormalCube(var2, var3, var4 - 1)) {
+ var6 = 3;
+ } else if(var5 == 4 && var1.isBlockNormalCube(var2 + 1, var3, var4)) {
+ var6 = 2;
+ } else if(var5 == 5 && var1.isBlockNormalCube(var2 - 1, var3, var4)) {
+ var6 = 1;
+ } else {
+ var6 = this.getOrientation(var1, var2, var3, var4);
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 + var7);
+ }
+
+ private int getOrientation(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2 - 1, var3, var4) ? 1 : (var1.isBlockNormalCube(var2 + 1, var3, var4) ? 2 : (var1.isBlockNormalCube(var2, var3, var4 - 1) ? 3 : (var1.isBlockNormalCube(var2, var3, var4 + 1) ? 4 : 1)));
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(this.func_322_g(var1, var2, var3, var4)) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ boolean var7 = false;
+ if(!var1.isBlockNormalCube(var2 - 1, var3, var4) && var6 == 1) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2 + 1, var3, var4) && var6 == 2) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2, var3, var4 - 1) && var6 == 3) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2, var3, var4 + 1) && var6 == 4) {
+ var7 = true;
+ }
+
+ if(var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ }
+
+ private boolean func_322_g(World var1, int var2, int var3, int var4) {
+ if(!this.canPlaceBlockAt(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ int var6 = var5 & 7;
+ boolean var7 = (var5 & 8) > 0;
+ float var8 = 6.0F / 16.0F;
+ float var9 = 10.0F / 16.0F;
+ float var10 = 3.0F / 16.0F;
+ float var11 = 2.0F / 16.0F;
+ if(var7) {
+ var11 = 1.0F / 16.0F;
+ }
+
+ if(var6 == 1) {
+ this.setBlockBounds(0.0F, var8, 0.5F - var10, var11, var9, 0.5F + var10);
+ } else if(var6 == 2) {
+ this.setBlockBounds(1.0F - var11, var8, 0.5F - var10, 1.0F, var9, 0.5F + var10);
+ } else if(var6 == 3) {
+ this.setBlockBounds(0.5F - var10, var8, 0.0F, 0.5F + var10, var9, var11);
+ } else if(var6 == 4) {
+ this.setBlockBounds(0.5F - var10, var8, 1.0F - var11, 0.5F + var10, var9, 1.0F);
+ }
+
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var6 & 7;
+ int var8 = 8 - (var6 & 8);
+ if(var8 == 0) {
+ return true;
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + var8);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.click", 0.3F, 0.6F);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ if(var7 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var7 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var7 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var7 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ return true;
+ }
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if((var5 & 8) > 0) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ int var6 = var5 & 7;
+ if(var6 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var6 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var6 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var6 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return (var1.getBlockMetadata(var2, var3, var4) & 8) > 0;
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) == 0) {
+ return false;
+ } else {
+ int var7 = var6 & 7;
+ return var7 == 5 && var5 == 1 ? true : (var7 == 4 && var5 == 2 ? true : (var7 == 3 && var5 == 3 ? true : (var7 == 2 && var5 == 4 ? true : var7 == 1 && var5 == 5)));
+ }
+ }
+
+ public boolean canProvidePower() {
+ return true;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(!var1.singleplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 & 7);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ int var7 = var6 & 7;
+ if(var7 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var7 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var7 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var7 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.click", 0.3F, 0.5F);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ }
+ }
+ }
+}
diff --git a/src/net/minecraft/src/BlockCactus.java b/src/net/minecraft/src/BlockCactus.java
new file mode 100644
index 0000000..c706954
--- /dev/null
+++ b/src/net/minecraft/src/BlockCactus.java
@@ -0,0 +1,77 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockCactus extends Block {
+ protected BlockCactus(int var1, int var2) {
+ super(var1, var2, Material.cactus);
+ this.setTickOnLoad(true);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.isAirBlock(var2, var3 + 1, var4)) {
+ int var6;
+ for(var6 = 1; var1.getBlockId(var2, var3 - var6, var4) == this.blockID; ++var6) {
+ }
+
+ if(var6 < 3) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ if(var7 == 15) {
+ var1.setBlockWithNotify(var2, var3 + 1, var4, this.blockID);
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + 1);
+ }
+ }
+ }
+
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ float var5 = 1.0F / 16.0F;
+ return AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var5), (double)var3, (double)((float)var4 + var5), (double)((float)(var2 + 1) - var5), (double)((float)(var3 + 1) - var5), (double)((float)(var4 + 1) - var5));
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture - 1 : (var1 == 0 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture);
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return !super.canPlaceBlockAt(var1, var2, var3, var4) ? false : this.canBlockStay(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!this.canBlockStay(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockMaterial(var2 - 1, var3, var4).isSolid()) {
+ return false;
+ } else if(var1.getBlockMaterial(var2 + 1, var3, var4).isSolid()) {
+ return false;
+ } else if(var1.getBlockMaterial(var2, var3, var4 - 1).isSolid()) {
+ return false;
+ } else if(var1.getBlockMaterial(var2, var3, var4 + 1).isSolid()) {
+ return false;
+ } else {
+ int var5 = var1.getBlockId(var2, var3 - 1, var4);
+ return var5 == Block.cactus.blockID || var5 == Block.sand.blockID;
+ }
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ var5.attackEntityFrom((Entity)null, 1);
+ }
+}
diff --git a/src/net/minecraft/src/BlockCake.java b/src/net/minecraft/src/BlockCake.java
new file mode 100644
index 0000000..ffa680c
--- /dev/null
+++ b/src/net/minecraft/src/BlockCake.java
@@ -0,0 +1,89 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockCake extends Block {
+ protected BlockCake(int var1, int var2) {
+ super(var1, var2, Material.cakeMaterial);
+ this.setTickOnLoad(true);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ float var6 = 1.0F / 16.0F;
+ float var7 = (float)(1 + var5 * 2) / 16.0F;
+ float var8 = 0.5F;
+ this.setBlockBounds(var7, 0.0F, var6, 1.0F - var6, var8, 1.0F - var6);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ float var6 = 1.0F / 16.0F;
+ float var7 = (float)(1 + var5 * 2) / 16.0F;
+ float var8 = 0.5F;
+ return AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var6), (double)((float)(var2 + 1) - var6), (double)((float)var3 + var8 - var6), (double)((float)(var4 + 1) - var6));
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var1 == 1 ? this.blockIndexInTexture : (var1 == 0 ? this.blockIndexInTexture + 3 : (var2 > 0 && var1 == 4 ? this.blockIndexInTexture + 2 : this.blockIndexInTexture + 1));
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture : (var1 == 0 ? this.blockIndexInTexture + 3 : this.blockIndexInTexture + 1);
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.eatCakeSlice(var1, var2, var3, var4, var5);
+ return true;
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.eatCakeSlice(var1, var2, var3, var4, var5);
+ }
+
+ private void eatCakeSlice(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(var5.health < 20) {
+ var5.heal(3);
+ int var6 = var1.getBlockMetadata(var2, var3, var4) + 1;
+ if(var6 >= 6) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ var1.markBlockAsNeedsUpdate(var2, var3, var4);
+ }
+ }
+
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return !super.canPlaceBlockAt(var1, var2, var3, var4) ? false : this.canBlockStay(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!this.canBlockStay(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return var1.getBlockMaterial(var2, var3 - 1, var4).isSolid();
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return 0;
+ }
+}
diff --git a/src/net/minecraft/src/BlockChest.java b/src/net/minecraft/src/BlockChest.java
new file mode 100644
index 0000000..2518134
--- /dev/null
+++ b/src/net/minecraft/src/BlockChest.java
@@ -0,0 +1,113 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockChest extends BlockContainer {
+ private Random random = new Random();
+
+ protected BlockChest(int var1) {
+ super(var1, Material.wood);
+ this.blockIndexInTexture = 26;
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture - 1 : (var1 == 0 ? this.blockIndexInTexture - 1 : (var1 == 3 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture));
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = 0;
+ if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID) {
+ ++var5;
+ }
+
+ if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID) {
+ ++var5;
+ }
+
+ if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID) {
+ ++var5;
+ }
+
+ if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID) {
+ ++var5;
+ }
+
+ return var5 > 1 ? false : (this.isThereANeighborChest(var1, var2 - 1, var3, var4) ? false : (this.isThereANeighborChest(var1, var2 + 1, var3, var4) ? false : (this.isThereANeighborChest(var1, var2, var3, var4 - 1) ? false : !this.isThereANeighborChest(var1, var2, var3, var4 + 1))));
+ }
+
+ private boolean isThereANeighborChest(World var1, int var2, int var3, int var4) {
+ return var1.getBlockId(var2, var3, var4) != this.blockID ? false : (var1.getBlockId(var2 - 1, var3, var4) == this.blockID ? true : (var1.getBlockId(var2 + 1, var3, var4) == this.blockID ? true : (var1.getBlockId(var2, var3, var4 - 1) == this.blockID ? true : var1.getBlockId(var2, var3, var4 + 1) == this.blockID)));
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ TileEntityChest var5 = (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4);
+
+ for(int var6 = 0; var6 < var5.getSizeInventory(); ++var6) {
+ ItemStack var7 = var5.getStackInSlot(var6);
+ if(var7 != null) {
+ float var8 = this.random.nextFloat() * 0.8F + 0.1F;
+ float var9 = this.random.nextFloat() * 0.8F + 0.1F;
+ float var10 = this.random.nextFloat() * 0.8F + 0.1F;
+
+ while(var7.stackSize > 0) {
+ int var11 = this.random.nextInt(21) + 10;
+ if(var11 > var7.stackSize) {
+ var11 = var7.stackSize;
+ }
+
+ var7.stackSize -= var11;
+ EntityItem var12 = new EntityItem(var1, (double)((float)var2 + var8), (double)((float)var3 + var9), (double)((float)var4 + var10), new ItemStack(var7.itemID, var11, var7.getItemDamage()));
+ float var13 = 0.05F;
+ var12.motionX = (double)((float)this.random.nextGaussian() * var13);
+ var12.motionY = (double)((float)this.random.nextGaussian() * var13 + 0.2F);
+ var12.motionZ = (double)((float)this.random.nextGaussian() * var13);
+ var1.entityJoinedWorld(var12);
+ }
+ }
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ Object var6 = (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4);
+ if(var1.isBlockNormalCube(var2, var3 + 1, var4)) {
+ return true;
+ } else if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID && var1.isBlockNormalCube(var2 - 1, var3 + 1, var4)) {
+ return true;
+ } else if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID && var1.isBlockNormalCube(var2 + 1, var3 + 1, var4)) {
+ return true;
+ } else if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID && var1.isBlockNormalCube(var2, var3 + 1, var4 - 1)) {
+ return true;
+ } else if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID && var1.isBlockNormalCube(var2, var3 + 1, var4 + 1)) {
+ return true;
+ } else {
+ if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID) {
+ var6 = new InventoryLargeChest("Large chest", (TileEntityChest)var1.getBlockTileEntity(var2 - 1, var3, var4), (IInventory)var6);
+ }
+
+ if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID) {
+ var6 = new InventoryLargeChest("Large chest", (IInventory)var6, (TileEntityChest)var1.getBlockTileEntity(var2 + 1, var3, var4));
+ }
+
+ if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID) {
+ var6 = new InventoryLargeChest("Large chest", (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4 - 1), (IInventory)var6);
+ }
+
+ if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID) {
+ var6 = new InventoryLargeChest("Large chest", (IInventory)var6, (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4 + 1));
+ }
+
+ if(var1.singleplayerWorld) {
+ return true;
+ } else {
+ var5.displayGUIChest((IInventory)var6);
+ return true;
+ }
+ }
+ }
+
+ protected TileEntity getBlockEntity() {
+ return new TileEntityChest();
+ }
+}
diff --git a/src/net/minecraft/src/BlockClay.java b/src/net/minecraft/src/BlockClay.java
new file mode 100644
index 0000000..89b79b7
--- /dev/null
+++ b/src/net/minecraft/src/BlockClay.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockClay extends Block {
+ public BlockClay(int var1, int var2) {
+ super(var1, var2, Material.clay);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.clay.shiftedIndex;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 4;
+ }
+}
diff --git a/src/net/minecraft/src/BlockCloth.java b/src/net/minecraft/src/BlockCloth.java
new file mode 100644
index 0000000..f2cbcb8
--- /dev/null
+++ b/src/net/minecraft/src/BlockCloth.java
@@ -0,0 +1,28 @@
+package net.minecraft.src;
+
+public class BlockCloth extends Block {
+ public BlockCloth() {
+ super(35, 64, Material.cloth);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ if(var2 == 0) {
+ return this.blockIndexInTexture;
+ } else {
+ var2 = ~(var2 & 15);
+ return 113 + ((var2 & 8) >> 3) + (var2 & 7) * 16;
+ }
+ }
+
+ protected int damageDropped(int var1) {
+ return var1;
+ }
+
+ public static int func_21033_c(int var0) {
+ return ~var0 & 15;
+ }
+
+ public static int func_21034_d(int var0) {
+ return ~var0 & 15;
+ }
+}
diff --git a/src/net/minecraft/src/BlockContainer.java b/src/net/minecraft/src/BlockContainer.java
new file mode 100644
index 0000000..5138b13
--- /dev/null
+++ b/src/net/minecraft/src/BlockContainer.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+public abstract class BlockContainer extends Block {
+ protected BlockContainer(int var1, Material var2) {
+ super(var1, var2);
+ isBlockContainer[var1] = true;
+ }
+
+ protected BlockContainer(int var1, int var2, Material var3) {
+ super(var1, var2, var3);
+ isBlockContainer[var1] = true;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ var1.setBlockTileEntity(var2, var3, var4, this.getBlockEntity());
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ super.onBlockRemoval(var1, var2, var3, var4);
+ var1.removeBlockTileEntity(var2, var3, var4);
+ }
+
+ protected abstract TileEntity getBlockEntity();
+}
diff --git a/src/net/minecraft/src/BlockCrops.java b/src/net/minecraft/src/BlockCrops.java
new file mode 100644
index 0000000..c460ff4
--- /dev/null
+++ b/src/net/minecraft/src/BlockCrops.java
@@ -0,0 +1,110 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockCrops extends BlockFlower {
+ protected BlockCrops(int var1, int var2) {
+ super(var1, var2);
+ this.blockIndexInTexture = var2;
+ this.setTickOnLoad(true);
+ float var3 = 0.5F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 0.25F, 0.5F + var3);
+ }
+
+ protected boolean canThisPlantGrowOnThisBlockID(int var1) {
+ return var1 == Block.tilledField.blockID;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ super.updateTick(var1, var2, var3, var4, var5);
+ if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 < 7) {
+ float var7 = this.getGrowthRate(var1, var2, var3, var4);
+ if(var5.nextInt((int)(100.0F / var7)) == 0) {
+ ++var6;
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ }
+ }
+ }
+
+ }
+
+ public void fertilize(World var1, int var2, int var3, int var4) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 7);
+ }
+
+ private float getGrowthRate(World var1, int var2, int var3, int var4) {
+ float var5 = 1.0F;
+ int var6 = var1.getBlockId(var2, var3, var4 - 1);
+ int var7 = var1.getBlockId(var2, var3, var4 + 1);
+ int var8 = var1.getBlockId(var2 - 1, var3, var4);
+ int var9 = var1.getBlockId(var2 + 1, var3, var4);
+ int var10 = var1.getBlockId(var2 - 1, var3, var4 - 1);
+ int var11 = var1.getBlockId(var2 + 1, var3, var4 - 1);
+ int var12 = var1.getBlockId(var2 + 1, var3, var4 + 1);
+ int var13 = var1.getBlockId(var2 - 1, var3, var4 + 1);
+ boolean var14 = var8 == this.blockID || var9 == this.blockID;
+ boolean var15 = var6 == this.blockID || var7 == this.blockID;
+ boolean var16 = var10 == this.blockID || var11 == this.blockID || var12 == this.blockID || var13 == this.blockID;
+
+ for(int var17 = var2 - 1; var17 <= var2 + 1; ++var17) {
+ for(int var18 = var4 - 1; var18 <= var4 + 1; ++var18) {
+ int var19 = var1.getBlockId(var17, var3 - 1, var18);
+ float var20 = 0.0F;
+ if(var19 == Block.tilledField.blockID) {
+ var20 = 1.0F;
+ if(var1.getBlockMetadata(var17, var3 - 1, var18) > 0) {
+ var20 = 3.0F;
+ }
+ }
+
+ if(var17 != var2 || var18 != var4) {
+ var20 /= 4.0F;
+ }
+
+ var5 += var20;
+ }
+ }
+
+ if(var16 || var14 && var15) {
+ var5 /= 2.0F;
+ }
+
+ return var5;
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ if(var2 < 0) {
+ var2 = 7;
+ }
+
+ return this.blockIndexInTexture + var2;
+ }
+
+ public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) {
+ super.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, var6);
+ if(!var1.singleplayerWorld) {
+ for(int var7 = 0; var7 < 3; ++var7) {
+ if(var1.rand.nextInt(15) <= var5) {
+ float var8 = 0.7F;
+ float var9 = var1.rand.nextFloat() * var8 + (1.0F - var8) * 0.5F;
+ float var10 = var1.rand.nextFloat() * var8 + (1.0F - var8) * 0.5F;
+ float var11 = var1.rand.nextFloat() * var8 + (1.0F - var8) * 0.5F;
+ EntityItem var12 = new EntityItem(var1, (double)((float)var2 + var9), (double)((float)var3 + var10), (double)((float)var4 + var11), new ItemStack(Item.seeds));
+ var12.delayBeforeCanPickup = 10;
+ var1.entityJoinedWorld(var12);
+ }
+ }
+
+ }
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return var1 == 7 ? Item.wheat.shiftedIndex : -1;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/BlockDeadBush.java b/src/net/minecraft/src/BlockDeadBush.java
new file mode 100644
index 0000000..f2868c8
--- /dev/null
+++ b/src/net/minecraft/src/BlockDeadBush.java
@@ -0,0 +1,23 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockDeadBush extends BlockFlower {
+ protected BlockDeadBush(int var1, int var2) {
+ super(var1, var2);
+ float var3 = 0.4F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 0.8F, 0.5F + var3);
+ }
+
+ protected boolean canThisPlantGrowOnThisBlockID(int var1) {
+ return var1 == Block.sand.blockID;
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return this.blockIndexInTexture;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return -1;
+ }
+}
diff --git a/src/net/minecraft/src/BlockDetectorRail.java b/src/net/minecraft/src/BlockDetectorRail.java
new file mode 100644
index 0000000..22570de
--- /dev/null
+++ b/src/net/minecraft/src/BlockDetectorRail.java
@@ -0,0 +1,74 @@
+package net.minecraft.src;
+
+import java.util.List;
+import java.util.Random;
+
+public class BlockDetectorRail extends BlockRail {
+ public BlockDetectorRail(int var1, int var2) {
+ super(var1, var2, true);
+ this.setTickOnLoad(true);
+ }
+
+ public int tickRate() {
+ return 20;
+ }
+
+ public boolean canProvidePower() {
+ return true;
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ if(!var1.singleplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) == 0) {
+ this.func_27035_f(var1, var2, var3, var4, var6);
+ }
+ }
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(!var1.singleplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ this.func_27035_f(var1, var2, var3, var4, var6);
+ }
+ }
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return (var1.getBlockMetadata(var2, var3, var4) & 8) != 0;
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return (var1.getBlockMetadata(var2, var3, var4) & 8) == 0 ? false : var5 == 1;
+ }
+
+ private void func_27035_f(World var1, int var2, int var3, int var4, int var5) {
+ boolean var6 = (var5 & 8) != 0;
+ boolean var7 = false;
+ float var8 = 2.0F / 16.0F;
+ List var9 = var1.getEntitiesWithinAABB(EntityMinecart.class, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var8), (double)var3, (double)((float)var4 + var8), (double)((float)(var2 + 1) - var8), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var8)));
+ if(var9.size() > 0) {
+ var7 = true;
+ }
+
+ if(var7 && !var6) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var5 | 8);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ }
+
+ if(!var7 && var6) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var5 & 7);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ }
+
+ if(var7) {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/BlockDirt.java b/src/net/minecraft/src/BlockDirt.java
new file mode 100644
index 0000000..d3b8a7a
--- /dev/null
+++ b/src/net/minecraft/src/BlockDirt.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public class BlockDirt extends Block {
+ protected BlockDirt(int var1, int var2) {
+ super(var1, var2, Material.ground);
+ }
+}
diff --git a/src/net/minecraft/src/BlockDispenser.java b/src/net/minecraft/src/BlockDispenser.java
new file mode 100644
index 0000000..d6fab64
--- /dev/null
+++ b/src/net/minecraft/src/BlockDispenser.java
@@ -0,0 +1,193 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockDispenser extends BlockContainer {
+ private Random field_28032_a = new Random();
+
+ protected BlockDispenser(int var1) {
+ super(var1, Material.rock);
+ this.blockIndexInTexture = 45;
+ }
+
+ public int tickRate() {
+ return 4;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.dispenser.blockID;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ this.setDispenserDefaultDirection(var1, var2, var3, var4);
+ }
+
+ private void setDispenserDefaultDirection(World var1, int var2, int var3, int var4) {
+ if(!var1.singleplayerWorld) {
+ int var5 = var1.getBlockId(var2, var3, var4 - 1);
+ int var6 = var1.getBlockId(var2, var3, var4 + 1);
+ int var7 = var1.getBlockId(var2 - 1, var3, var4);
+ int var8 = var1.getBlockId(var2 + 1, var3, var4);
+ byte var9 = 3;
+ if(Block.opaqueCubeLookup[var5] && !Block.opaqueCubeLookup[var6]) {
+ var9 = 3;
+ }
+
+ if(Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var5]) {
+ var9 = 2;
+ }
+
+ if(Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var8]) {
+ var9 = 5;
+ }
+
+ if(Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var7]) {
+ var9 = 4;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var9);
+ }
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture + 17 : (var1 == 0 ? this.blockIndexInTexture + 17 : (var1 == 3 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture));
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(var1.singleplayerWorld) {
+ return true;
+ } else {
+ TileEntityDispenser var6 = (TileEntityDispenser)var1.getBlockTileEntity(var2, var3, var4);
+ var5.displayGUIDispenser(var6);
+ return true;
+ }
+ }
+
+ private void dispenseItem(World var1, int var2, int var3, int var4, Random var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ byte var9 = 0;
+ byte var10 = 0;
+ if(var6 == 3) {
+ var10 = 1;
+ } else if(var6 == 2) {
+ var10 = -1;
+ } else if(var6 == 5) {
+ var9 = 1;
+ } else {
+ var9 = -1;
+ }
+
+ TileEntityDispenser var11 = (TileEntityDispenser)var1.getBlockTileEntity(var2, var3, var4);
+ ItemStack var12 = var11.getRandomStackFromInventory();
+ double var13 = (double)var2 + (double)var9 * 0.6D + 0.5D;
+ double var15 = (double)var3 + 0.5D;
+ double var17 = (double)var4 + (double)var10 * 0.6D + 0.5D;
+ if(var12 == null) {
+ var1.func_28097_e(1001, var2, var3, var4, 0);
+ } else {
+ if(var12.itemID == Item.arrow.shiftedIndex) {
+ EntityArrow var19 = new EntityArrow(var1, var13, var15, var17);
+ var19.setArrowHeading((double)var9, (double)0.1F, (double)var10, 1.1F, 6.0F);
+ var19.field_28012_a = true;
+ var1.entityJoinedWorld(var19);
+ var1.func_28097_e(1002, var2, var3, var4, 0);
+ } else if(var12.itemID == Item.egg.shiftedIndex) {
+ EntityEgg var22 = new EntityEgg(var1, var13, var15, var17);
+ var22.func_20078_a((double)var9, (double)0.1F, (double)var10, 1.1F, 6.0F);
+ var1.entityJoinedWorld(var22);
+ var1.func_28097_e(1002, var2, var3, var4, 0);
+ } else if(var12.itemID == Item.snowball.shiftedIndex) {
+ EntitySnowball var23 = new EntitySnowball(var1, var13, var15, var17);
+ var23.func_6141_a((double)var9, (double)0.1F, (double)var10, 1.1F, 6.0F);
+ var1.entityJoinedWorld(var23);
+ var1.func_28097_e(1002, var2, var3, var4, 0);
+ } else {
+ EntityItem var24 = new EntityItem(var1, var13, var15 - 0.3D, var17, var12);
+ double var20 = var5.nextDouble() * 0.1D + 0.2D;
+ var24.motionX = (double)var9 * var20;
+ var24.motionY = (double)0.2F;
+ var24.motionZ = (double)var10 * var20;
+ var24.motionX += var5.nextGaussian() * (double)0.0075F * 6.0D;
+ var24.motionY += var5.nextGaussian() * (double)0.0075F * 6.0D;
+ var24.motionZ += var5.nextGaussian() * (double)0.0075F * 6.0D;
+ var1.entityJoinedWorld(var24);
+ var1.func_28097_e(1000, var2, var3, var4, 0);
+ }
+
+ var1.func_28097_e(2000, var2, var3, var4, var9 + 1 + (var10 + 1) * 3);
+ }
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(var5 > 0 && Block.blocksList[var5].canProvidePower()) {
+ boolean var6 = var1.isBlockIndirectlyGettingPowered(var2, var3, var4) || var1.isBlockIndirectlyGettingPowered(var2, var3 + 1, var4);
+ if(var6) {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ }
+ }
+
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.isBlockIndirectlyGettingPowered(var2, var3, var4) || var1.isBlockIndirectlyGettingPowered(var2, var3 + 1, var4)) {
+ this.dispenseItem(var1, var2, var3, var4, var5);
+ }
+
+ }
+
+ protected TileEntity getBlockEntity() {
+ return new TileEntityDispenser();
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+ if(var6 == 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 2);
+ }
+
+ if(var6 == 1) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 5);
+ }
+
+ if(var6 == 2) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 3);
+ }
+
+ if(var6 == 3) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 4);
+ }
+
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ TileEntityDispenser var5 = (TileEntityDispenser)var1.getBlockTileEntity(var2, var3, var4);
+
+ for(int var6 = 0; var6 < var5.getSizeInventory(); ++var6) {
+ ItemStack var7 = var5.getStackInSlot(var6);
+ if(var7 != null) {
+ float var8 = this.field_28032_a.nextFloat() * 0.8F + 0.1F;
+ float var9 = this.field_28032_a.nextFloat() * 0.8F + 0.1F;
+ float var10 = this.field_28032_a.nextFloat() * 0.8F + 0.1F;
+
+ while(var7.stackSize > 0) {
+ int var11 = this.field_28032_a.nextInt(21) + 10;
+ if(var11 > var7.stackSize) {
+ var11 = var7.stackSize;
+ }
+
+ var7.stackSize -= var11;
+ EntityItem var12 = new EntityItem(var1, (double)((float)var2 + var8), (double)((float)var3 + var9), (double)((float)var4 + var10), new ItemStack(var7.itemID, var11, var7.getItemDamage()));
+ float var13 = 0.05F;
+ var12.motionX = (double)((float)this.field_28032_a.nextGaussian() * var13);
+ var12.motionY = (double)((float)this.field_28032_a.nextGaussian() * var13 + 0.2F);
+ var12.motionZ = (double)((float)this.field_28032_a.nextGaussian() * var13);
+ var1.entityJoinedWorld(var12);
+ }
+ }
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+}
diff --git a/src/net/minecraft/src/BlockDoor.java b/src/net/minecraft/src/BlockDoor.java
new file mode 100644
index 0000000..e211f47
--- /dev/null
+++ b/src/net/minecraft/src/BlockDoor.java
@@ -0,0 +1,186 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockDoor extends Block {
+ protected BlockDoor(int var1, Material var2) {
+ super(var1, var2);
+ this.blockIndexInTexture = 97;
+ if(var2 == Material.iron) {
+ ++this.blockIndexInTexture;
+ }
+
+ float var3 = 0.5F;
+ float var4 = 1.0F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var4, 0.5F + var3);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ if(var1 != 0 && var1 != 1) {
+ int var3 = this.func_271_d(var2);
+ if((var3 == 0 || var3 == 2) ^ var1 <= 3) {
+ return this.blockIndexInTexture;
+ } else {
+ int var4 = var3 / 2 + (var1 & 1 ^ var3);
+ var4 += (var2 & 4) / 4;
+ int var5 = this.blockIndexInTexture - (var2 & 8) * 2;
+ if((var4 & 1) != 0) {
+ var5 = -var5;
+ }
+
+ return var5;
+ }
+ } else {
+ return this.blockIndexInTexture;
+ }
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ this.func_273_b(this.func_271_d(var1.getBlockMetadata(var2, var3, var4)));
+ }
+
+ public void func_273_b(int var1) {
+ float var2 = 3.0F / 16.0F;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);
+ if(var1 == 0) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2);
+ }
+
+ if(var1 == 1) {
+ this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var1 == 2) {
+ this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var1 == 3) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F);
+ }
+
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(this.blockMaterial == Material.iron) {
+ return true;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ if(var1.getBlockId(var2, var3 - 1, var4) == this.blockID) {
+ this.blockActivated(var1, var2, var3 - 1, var4, var5);
+ }
+
+ return true;
+ } else {
+ if(var1.getBlockId(var2, var3 + 1, var4) == this.blockID) {
+ var1.setBlockMetadataWithNotify(var2, var3 + 1, var4, (var6 ^ 4) + 8);
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 ^ 4);
+ var1.markBlocksDirty(var2, var3 - 1, var4, var2, var3, var4);
+ var1.func_28101_a(var5, 1003, var2, var3, var4, 0);
+ return true;
+ }
+ }
+ }
+
+ public void func_272_a(World var1, int var2, int var3, int var4, boolean var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ if(var1.getBlockId(var2, var3 - 1, var4) == this.blockID) {
+ this.func_272_a(var1, var2, var3 - 1, var4, var5);
+ }
+
+ } else {
+ boolean var7 = (var1.getBlockMetadata(var2, var3, var4) & 4) > 0;
+ if(var7 != var5) {
+ if(var1.getBlockId(var2, var3 + 1, var4) == this.blockID) {
+ var1.setBlockMetadataWithNotify(var2, var3 + 1, var4, (var6 ^ 4) + 8);
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 ^ 4);
+ var1.markBlocksDirty(var2, var3 - 1, var4, var2, var3, var4);
+ var1.func_28101_a((EntityPlayer)null, 1003, var2, var3, var4, 0);
+ }
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ if(var1.getBlockId(var2, var3 - 1, var4) != this.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ if(var5 > 0 && Block.blocksList[var5].canProvidePower()) {
+ this.onNeighborBlockChange(var1, var2, var3 - 1, var4, var5);
+ }
+ } else {
+ boolean var7 = false;
+ if(var1.getBlockId(var2, var3 + 1, var4) != this.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2, var3 - 1, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ var7 = true;
+ if(var1.getBlockId(var2, var3 + 1, var4) == this.blockID) {
+ var1.setBlockWithNotify(var2, var3 + 1, var4, 0);
+ }
+ }
+
+ if(var7) {
+ if(!var1.singleplayerWorld) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var6);
+ }
+ } else if(var5 > 0 && Block.blocksList[var5].canProvidePower()) {
+ boolean var8 = var1.isBlockIndirectlyGettingPowered(var2, var3, var4) || var1.isBlockIndirectlyGettingPowered(var2, var3 + 1, var4);
+ this.func_272_a(var1, var2, var3, var4, var8);
+ }
+ }
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return (var1 & 8) != 0 ? 0 : (this.blockMaterial == Material.iron ? Item.doorSteel.shiftedIndex : Item.doorWood.shiftedIndex);
+ }
+
+ public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.collisionRayTrace(var1, var2, var3, var4, var5, var6);
+ }
+
+ public int func_271_d(int var1) {
+ return (var1 & 4) == 0 ? var1 - 1 & 3 : var1 & 3;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var3 >= 127 ? false : var1.isBlockNormalCube(var2, var3 - 1, var4) && super.canPlaceBlockAt(var1, var2, var3, var4) && super.canPlaceBlockAt(var1, var2, var3 + 1, var4);
+ }
+
+ public static boolean func_27036_e(int var0) {
+ return (var0 & 4) != 0;
+ }
+
+ public int getMobilityFlag() {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/BlockFarmland.java b/src/net/minecraft/src/BlockFarmland.java
new file mode 100644
index 0000000..04e8d34
--- /dev/null
+++ b/src/net/minecraft/src/BlockFarmland.java
@@ -0,0 +1,93 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockFarmland extends Block {
+ protected BlockFarmland(int var1) {
+ super(var1, Material.ground);
+ this.blockIndexInTexture = 87;
+ this.setTickOnLoad(true);
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 15.0F / 16.0F, 1.0F);
+ this.setLightOpacity(255);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return AxisAlignedBB.getBoundingBoxFromPool((double)(var2 + 0), (double)(var3 + 0), (double)(var4 + 0), (double)(var2 + 1), (double)(var3 + 1), (double)(var4 + 1));
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var1 == 1 && var2 > 0 ? this.blockIndexInTexture - 1 : (var1 == 1 ? this.blockIndexInTexture : 2);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var5.nextInt(5) == 0) {
+ if(!this.isWaterNearby(var1, var2, var3, var4) && !var1.canLightningStrikeAt(var2, var3 + 1, var4)) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 > 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 - 1);
+ } else if(!this.isCropsNearby(var1, var2, var3, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID);
+ }
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 7);
+ }
+ }
+
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ if(var1.rand.nextInt(4) == 0) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID);
+ }
+
+ }
+
+ private boolean isCropsNearby(World var1, int var2, int var3, int var4) {
+ byte var5 = 0;
+
+ for(int var6 = var2 - var5; var6 <= var2 + var5; ++var6) {
+ for(int var7 = var4 - var5; var7 <= var4 + var5; ++var7) {
+ if(var1.getBlockId(var6, var3 + 1, var7) == Block.crops.blockID) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private boolean isWaterNearby(World var1, int var2, int var3, int var4) {
+ for(int var5 = var2 - 4; var5 <= var2 + 4; ++var5) {
+ for(int var6 = var3; var6 <= var3 + 1; ++var6) {
+ for(int var7 = var4 - 4; var7 <= var4 + 4; ++var7) {
+ if(var1.getBlockMaterial(var5, var6, var7) == Material.water) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ Material var6 = var1.getBlockMaterial(var2, var3 + 1, var4);
+ if(var6.isSolid()) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID);
+ }
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.dirt.idDropped(0, var2);
+ }
+}
diff --git a/src/net/minecraft/src/BlockFence.java b/src/net/minecraft/src/BlockFence.java
new file mode 100644
index 0000000..ef1882a
--- /dev/null
+++ b/src/net/minecraft/src/BlockFence.java
@@ -0,0 +1,23 @@
+package net.minecraft.src;
+
+public class BlockFence extends Block {
+ public BlockFence(int var1, int var2) {
+ super(var1, var2, Material.wood);
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.getBlockId(var2, var3 - 1, var4) == this.blockID ? true : (!var1.getBlockMaterial(var2, var3 - 1, var4).isSolid() ? false : super.canPlaceBlockAt(var1, var2, var3, var4));
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return AxisAlignedBB.getBoundingBoxFromPool((double)var2, (double)var3, (double)var4, (double)(var2 + 1), (double)((float)var3 + 1.5F), (double)(var4 + 1));
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/BlockFire.java b/src/net/minecraft/src/BlockFire.java
new file mode 100644
index 0000000..92fa07d
--- /dev/null
+++ b/src/net/minecraft/src/BlockFire.java
@@ -0,0 +1,184 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockFire extends Block {
+ private int[] chanceToEncourageFire = new int[256];
+ private int[] abilityToCatchFire = new int[256];
+
+ protected BlockFire(int var1, int var2) {
+ super(var1, var2, Material.fire);
+ this.setTickOnLoad(true);
+ }
+
+ public void setFireBurnRates() {
+ this.setBurnRate(Block.planks.blockID, 5, 20);
+ this.setBurnRate(Block.fence.blockID, 5, 20);
+ this.setBurnRate(Block.stairCompactPlanks.blockID, 5, 20);
+ this.setBurnRate(Block.wood.blockID, 5, 5);
+ this.setBurnRate(Block.leaves.blockID, 30, 60);
+ this.setBurnRate(Block.bookShelf.blockID, 30, 20);
+ this.setBurnRate(Block.tnt.blockID, 15, 100);
+ this.setBurnRate(Block.tallGrass.blockID, 60, 100);
+ this.setBurnRate(Block.cloth.blockID, 30, 60);
+ }
+
+ private void setBurnRate(int var1, int var2, int var3) {
+ this.chanceToEncourageFire[var1] = var2;
+ this.abilityToCatchFire[var1] = var3;
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public int tickRate() {
+ return 40;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ boolean var6 = var1.getBlockId(var2, var3 - 1, var4) == Block.bloodStone.blockID;
+ if(!this.canPlaceBlockAt(var1, var2, var3, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ if(var6 || !var1.func_27068_v() || !var1.canLightningStrikeAt(var2, var3, var4) && !var1.canLightningStrikeAt(var2 - 1, var3, var4) && !var1.canLightningStrikeAt(var2 + 1, var3, var4) && !var1.canLightningStrikeAt(var2, var3, var4 - 1) && !var1.canLightningStrikeAt(var2, var3, var4 + 1)) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ if(var7 < 15) {
+ var1.setBlockMetadata(var2, var3, var4, var7 + var5.nextInt(3) / 2);
+ }
+
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ if(!var6 && !this.func_268_g(var1, var2, var3, var4)) {
+ if(!var1.isBlockNormalCube(var2, var3 - 1, var4) || var7 > 3) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ } else if(!var6 && !this.canBlockCatchFire(var1, var2, var3 - 1, var4) && var7 == 15 && var5.nextInt(4) == 0) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ this.tryToCatchBlockOnFire(var1, var2 + 1, var3, var4, 300, var5, var7);
+ this.tryToCatchBlockOnFire(var1, var2 - 1, var3, var4, 300, var5, var7);
+ this.tryToCatchBlockOnFire(var1, var2, var3 - 1, var4, 250, var5, var7);
+ this.tryToCatchBlockOnFire(var1, var2, var3 + 1, var4, 250, var5, var7);
+ this.tryToCatchBlockOnFire(var1, var2, var3, var4 - 1, 300, var5, var7);
+ this.tryToCatchBlockOnFire(var1, var2, var3, var4 + 1, 300, var5, var7);
+
+ for(int var8 = var2 - 1; var8 <= var2 + 1; ++var8) {
+ for(int var9 = var4 - 1; var9 <= var4 + 1; ++var9) {
+ for(int var10 = var3 - 1; var10 <= var3 + 4; ++var10) {
+ if(var8 != var2 || var10 != var3 || var9 != var4) {
+ int var11 = 100;
+ if(var10 > var3 + 1) {
+ var11 += (var10 - (var3 + 1)) * 100;
+ }
+
+ int var12 = this.getChanceOfNeighborsEncouragingFire(var1, var8, var10, var9);
+ if(var12 > 0) {
+ int var13 = (var12 + 40) / (var7 + 30);
+ if(var13 > 0 && var5.nextInt(var11) <= var13 && (!var1.func_27068_v() || !var1.canLightningStrikeAt(var8, var10, var9)) && !var1.canLightningStrikeAt(var8 - 1, var10, var4) && !var1.canLightningStrikeAt(var8 + 1, var10, var9) && !var1.canLightningStrikeAt(var8, var10, var9 - 1) && !var1.canLightningStrikeAt(var8, var10, var9 + 1)) {
+ int var14 = var7 + var5.nextInt(5) / 4;
+ if(var14 > 15) {
+ var14 = 15;
+ }
+
+ var1.setBlockAndMetadataWithNotify(var8, var10, var9, this.blockID, var14);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+ } else {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ private void tryToCatchBlockOnFire(World var1, int var2, int var3, int var4, int var5, Random var6, int var7) {
+ int var8 = this.abilityToCatchFire[var1.getBlockId(var2, var3, var4)];
+ if(var6.nextInt(var5) < var8) {
+ boolean var9 = var1.getBlockId(var2, var3, var4) == Block.tnt.blockID;
+ if(var6.nextInt(var7 + 10) < 5 && !var1.canLightningStrikeAt(var2, var3, var4)) {
+ int var10 = var7 + var6.nextInt(5) / 4;
+ if(var10 > 15) {
+ var10 = 15;
+ }
+
+ var1.setBlockAndMetadataWithNotify(var2, var3, var4, this.blockID, var10);
+ } else {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ if(var9) {
+ Block.tnt.onBlockDestroyedByPlayer(var1, var2, var3, var4, 1);
+ }
+ }
+
+ }
+
+ private boolean func_268_g(World var1, int var2, int var3, int var4) {
+ return this.canBlockCatchFire(var1, var2 + 1, var3, var4) ? true : (this.canBlockCatchFire(var1, var2 - 1, var3, var4) ? true : (this.canBlockCatchFire(var1, var2, var3 - 1, var4) ? true : (this.canBlockCatchFire(var1, var2, var3 + 1, var4) ? true : (this.canBlockCatchFire(var1, var2, var3, var4 - 1) ? true : this.canBlockCatchFire(var1, var2, var3, var4 + 1)))));
+ }
+
+ private int getChanceOfNeighborsEncouragingFire(World var1, int var2, int var3, int var4) {
+ byte var5 = 0;
+ if(!var1.isAirBlock(var2, var3, var4)) {
+ return 0;
+ } else {
+ int var6 = this.getChanceToEncourageFire(var1, var2 + 1, var3, var4, var5);
+ var6 = this.getChanceToEncourageFire(var1, var2 - 1, var3, var4, var6);
+ var6 = this.getChanceToEncourageFire(var1, var2, var3 - 1, var4, var6);
+ var6 = this.getChanceToEncourageFire(var1, var2, var3 + 1, var4, var6);
+ var6 = this.getChanceToEncourageFire(var1, var2, var3, var4 - 1, var6);
+ var6 = this.getChanceToEncourageFire(var1, var2, var3, var4 + 1, var6);
+ return var6;
+ }
+ }
+
+ public boolean isCollidable() {
+ return false;
+ }
+
+ public boolean canBlockCatchFire(IBlockAccess var1, int var2, int var3, int var4) {
+ return this.chanceToEncourageFire[var1.getBlockId(var2, var3, var4)] > 0;
+ }
+
+ public int getChanceToEncourageFire(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = this.chanceToEncourageFire[var1.getBlockId(var2, var3, var4)];
+ return var6 > var5 ? var6 : var5;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2, var3 - 1, var4) || this.func_268_g(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!var1.isBlockNormalCube(var2, var3 - 1, var4) && !this.func_268_g(var1, var2, var3, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockId(var2, var3 - 1, var4) != Block.obsidian.blockID || !Block.portal.tryToCreatePortal(var1, var2, var3, var4)) {
+ if(!var1.isBlockNormalCube(var2, var3 - 1, var4) && !this.func_268_g(var1, var2, var3, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ }
+ }
+ }
+}
diff --git a/src/net/minecraft/src/BlockFlower.java b/src/net/minecraft/src/BlockFlower.java
new file mode 100644
index 0000000..a1c2f07
--- /dev/null
+++ b/src/net/minecraft/src/BlockFlower.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockFlower extends Block {
+ protected BlockFlower(int var1, int var2) {
+ super(var1, Material.plants);
+ this.blockIndexInTexture = var2;
+ this.setTickOnLoad(true);
+ float var3 = 0.2F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 3.0F, 0.5F + var3);
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return super.canPlaceBlockAt(var1, var2, var3, var4) && this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4));
+ }
+
+ protected boolean canThisPlantGrowOnThisBlockID(int var1) {
+ return var1 == Block.grass.blockID || var1 == Block.dirt.blockID || var1 == Block.tilledField.blockID;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ this.func_276_g(var1, var2, var3, var4);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ this.func_276_g(var1, var2, var3, var4);
+ }
+
+ protected final void func_276_g(World var1, int var2, int var3, int var4) {
+ if(!this.canBlockStay(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return (var1.getBlockLightValueNoChecks(var2, var3, var4) >= 8 || var1.canBlockSeeTheSky(var2, var3, var4)) && this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4));
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/BlockFlowing.java b/src/net/minecraft/src/BlockFlowing.java
new file mode 100644
index 0000000..6cfa119
--- /dev/null
+++ b/src/net/minecraft/src/BlockFlowing.java
@@ -0,0 +1,263 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockFlowing extends BlockFluid {
+ int field_659_a = 0;
+ boolean[] field_658_b = new boolean[4];
+ int[] field_660_c = new int[4];
+
+ protected BlockFlowing(int var1, Material var2) {
+ super(var1, var2);
+ }
+
+ private void func_30004_i(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ var1.setBlockAndMetadata(var2, var3, var4, this.blockID + 1, var5);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ var1.markBlockNeedsUpdate(var2, var3, var4);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ int var6 = this.func_301_g(var1, var2, var3, var4);
+ byte var7 = 1;
+ if(this.blockMaterial == Material.lava && !var1.worldProvider.isHellWorld) {
+ var7 = 2;
+ }
+
+ boolean var8 = true;
+ int var10;
+ if(var6 > 0) {
+ byte var9 = -100;
+ this.field_659_a = 0;
+ int var12 = this.func_307_e(var1, var2 - 1, var3, var4, var9);
+ var12 = this.func_307_e(var1, var2 + 1, var3, var4, var12);
+ var12 = this.func_307_e(var1, var2, var3, var4 - 1, var12);
+ var12 = this.func_307_e(var1, var2, var3, var4 + 1, var12);
+ var10 = var12 + var7;
+ if(var10 >= 8 || var12 < 0) {
+ var10 = -1;
+ }
+
+ if(this.func_301_g(var1, var2, var3 + 1, var4) >= 0) {
+ int var11 = this.func_301_g(var1, var2, var3 + 1, var4);
+ if(var11 >= 8) {
+ var10 = var11;
+ } else {
+ var10 = var11 + 8;
+ }
+ }
+
+ if(this.field_659_a >= 2 && this.blockMaterial == Material.water) {
+ if(var1.getBlockMaterial(var2, var3 - 1, var4).isSolid()) {
+ var10 = 0;
+ } else if(var1.getBlockMaterial(var2, var3 - 1, var4) == this.blockMaterial && var1.getBlockMetadata(var2, var3, var4) == 0) {
+ var10 = 0;
+ }
+ }
+
+ if(this.blockMaterial == Material.lava && var6 < 8 && var10 < 8 && var10 > var6 && var5.nextInt(4) != 0) {
+ var10 = var6;
+ var8 = false;
+ }
+
+ if(var10 != var6) {
+ var6 = var10;
+ if(var10 < 0) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var10);
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ }
+ } else if(var8) {
+ this.func_30004_i(var1, var2, var3, var4);
+ }
+ } else {
+ this.func_30004_i(var1, var2, var3, var4);
+ }
+
+ if(this.func_312_l(var1, var2, var3 - 1, var4)) {
+ if(var6 >= 8) {
+ var1.setBlockAndMetadataWithNotify(var2, var3 - 1, var4, this.blockID, var6);
+ } else {
+ var1.setBlockAndMetadataWithNotify(var2, var3 - 1, var4, this.blockID, var6 + 8);
+ }
+ } else if(var6 >= 0 && (var6 == 0 || this.func_309_k(var1, var2, var3 - 1, var4))) {
+ boolean[] var13 = this.func_4035_j(var1, var2, var3, var4);
+ var10 = var6 + var7;
+ if(var6 >= 8) {
+ var10 = 1;
+ }
+
+ if(var10 >= 8) {
+ return;
+ }
+
+ if(var13[0]) {
+ this.func_311_f(var1, var2 - 1, var3, var4, var10);
+ }
+
+ if(var13[1]) {
+ this.func_311_f(var1, var2 + 1, var3, var4, var10);
+ }
+
+ if(var13[2]) {
+ this.func_311_f(var1, var2, var3, var4 - 1, var10);
+ }
+
+ if(var13[3]) {
+ this.func_311_f(var1, var2, var3, var4 + 1, var10);
+ }
+ }
+
+ }
+
+ private void func_311_f(World var1, int var2, int var3, int var4, int var5) {
+ if(this.func_312_l(var1, var2, var3, var4)) {
+ int var6 = var1.getBlockId(var2, var3, var4);
+ if(var6 > 0) {
+ if(this.blockMaterial == Material.lava) {
+ this.func_300_h(var1, var2, var3, var4);
+ } else {
+ Block.blocksList[var6].dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ }
+ }
+
+ var1.setBlockAndMetadataWithNotify(var2, var3, var4, this.blockID, var5);
+ }
+
+ }
+
+ private int func_4034_a(World var1, int var2, int var3, int var4, int var5, int var6) {
+ int var7 = 1000;
+
+ for(int var8 = 0; var8 < 4; ++var8) {
+ if((var8 != 0 || var6 != 1) && (var8 != 1 || var6 != 0) && (var8 != 2 || var6 != 3) && (var8 != 3 || var6 != 2)) {
+ int var9 = var2;
+ int var11 = var4;
+ if(var8 == 0) {
+ var9 = var2 - 1;
+ }
+
+ if(var8 == 1) {
+ ++var9;
+ }
+
+ if(var8 == 2) {
+ var11 = var4 - 1;
+ }
+
+ if(var8 == 3) {
+ ++var11;
+ }
+
+ if(!this.func_309_k(var1, var9, var3, var11) && (var1.getBlockMaterial(var9, var3, var11) != this.blockMaterial || var1.getBlockMetadata(var9, var3, var11) != 0)) {
+ if(!this.func_309_k(var1, var9, var3 - 1, var11)) {
+ return var5;
+ }
+
+ if(var5 < 4) {
+ int var12 = this.func_4034_a(var1, var9, var3, var11, var5 + 1, var8);
+ if(var12 < var7) {
+ var7 = var12;
+ }
+ }
+ }
+ }
+ }
+
+ return var7;
+ }
+
+ private boolean[] func_4035_j(World var1, int var2, int var3, int var4) {
+ int var5;
+ int var6;
+ for(var5 = 0; var5 < 4; ++var5) {
+ this.field_660_c[var5] = 1000;
+ var6 = var2;
+ int var8 = var4;
+ if(var5 == 0) {
+ var6 = var2 - 1;
+ }
+
+ if(var5 == 1) {
+ ++var6;
+ }
+
+ if(var5 == 2) {
+ var8 = var4 - 1;
+ }
+
+ if(var5 == 3) {
+ ++var8;
+ }
+
+ if(!this.func_309_k(var1, var6, var3, var8) && (var1.getBlockMaterial(var6, var3, var8) != this.blockMaterial || var1.getBlockMetadata(var6, var3, var8) != 0)) {
+ if(!this.func_309_k(var1, var6, var3 - 1, var8)) {
+ this.field_660_c[var5] = 0;
+ } else {
+ this.field_660_c[var5] = this.func_4034_a(var1, var6, var3, var8, 1, var5);
+ }
+ }
+ }
+
+ var5 = this.field_660_c[0];
+
+ for(var6 = 1; var6 < 4; ++var6) {
+ if(this.field_660_c[var6] < var5) {
+ var5 = this.field_660_c[var6];
+ }
+ }
+
+ for(var6 = 0; var6 < 4; ++var6) {
+ this.field_658_b[var6] = this.field_660_c[var6] == var5;
+ }
+
+ return this.field_658_b;
+ }
+
+ private boolean func_309_k(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3, var4);
+ if(var5 != Block.doorWood.blockID && var5 != Block.doorSteel.blockID && var5 != Block.signPost.blockID && var5 != Block.ladder.blockID && var5 != Block.reed.blockID) {
+ if(var5 == 0) {
+ return false;
+ } else {
+ Material var6 = Block.blocksList[var5].blockMaterial;
+ return var6.getIsSolid();
+ }
+ } else {
+ return true;
+ }
+ }
+
+ protected int func_307_e(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = this.func_301_g(var1, var2, var3, var4);
+ if(var6 < 0) {
+ return var5;
+ } else {
+ if(var6 == 0) {
+ ++this.field_659_a;
+ }
+
+ if(var6 >= 8) {
+ var6 = 0;
+ }
+
+ return var5 >= 0 && var6 >= var5 ? var5 : var6;
+ }
+ }
+
+ private boolean func_312_l(World var1, int var2, int var3, int var4) {
+ Material var5 = var1.getBlockMaterial(var2, var3, var4);
+ return var5 == this.blockMaterial ? false : (var5 == Material.lava ? false : !this.func_309_k(var1, var2, var3, var4));
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/BlockFluid.java b/src/net/minecraft/src/BlockFluid.java
new file mode 100644
index 0000000..55f49da
--- /dev/null
+++ b/src/net/minecraft/src/BlockFluid.java
@@ -0,0 +1,225 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public abstract class BlockFluid extends Block {
+ protected BlockFluid(int var1, Material var2) {
+ super(var1, (var2 == Material.lava ? 14 : 12) * 16 + 13, var2);
+ float var3 = 0.0F;
+ float var4 = 0.0F;
+ this.setBlockBounds(0.0F + var4, 0.0F + var3, 0.0F + var4, 1.0F + var4, 1.0F + var3, 1.0F + var4);
+ this.setTickOnLoad(true);
+ }
+
+ public static float setFluidHeight(int var0) {
+ if(var0 >= 8) {
+ var0 = 0;
+ }
+
+ float var1 = (float)(var0 + 1) / 9.0F;
+ return var1;
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 != 0 && var1 != 1 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture;
+ }
+
+ protected int func_301_g(World var1, int var2, int var3, int var4) {
+ return var1.getBlockMaterial(var2, var3, var4) != this.blockMaterial ? -1 : var1.getBlockMetadata(var2, var3, var4);
+ }
+
+ protected int func_303_b(IBlockAccess var1, int var2, int var3, int var4) {
+ if(var1.getBlockMaterial(var2, var3, var4) != this.blockMaterial) {
+ return -1;
+ } else {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if(var5 >= 8) {
+ var5 = 0;
+ }
+
+ return var5;
+ }
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean canCollideCheck(int var1, boolean var2) {
+ return var2 && var1 == 0;
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ Material var6 = var1.getBlockMaterial(var2, var3, var4);
+ return var6 == this.blockMaterial ? false : (var6 == Material.ice ? false : (var5 == 1 ? true : super.shouldSideBeRendered(var1, var2, var3, var4, var5)));
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return 0;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ private Vec3D func_298_c(IBlockAccess var1, int var2, int var3, int var4) {
+ Vec3D var5 = Vec3D.createVector(0.0D, 0.0D, 0.0D);
+ int var6 = this.func_303_b(var1, var2, var3, var4);
+
+ for(int var7 = 0; var7 < 4; ++var7) {
+ int var8 = var2;
+ int var10 = var4;
+ if(var7 == 0) {
+ var8 = var2 - 1;
+ }
+
+ if(var7 == 1) {
+ var10 = var4 - 1;
+ }
+
+ if(var7 == 2) {
+ ++var8;
+ }
+
+ if(var7 == 3) {
+ ++var10;
+ }
+
+ int var11 = this.func_303_b(var1, var8, var3, var10);
+ int var12;
+ if(var11 < 0) {
+ if(!var1.getBlockMaterial(var8, var3, var10).getIsSolid()) {
+ var11 = this.func_303_b(var1, var8, var3 - 1, var10);
+ if(var11 >= 0) {
+ var12 = var11 - (var6 - 8);
+ var5 = var5.addVector((double)((var8 - var2) * var12), (double)((var3 - var3) * var12), (double)((var10 - var4) * var12));
+ }
+ }
+ } else if(var11 >= 0) {
+ var12 = var11 - var6;
+ var5 = var5.addVector((double)((var8 - var2) * var12), (double)((var3 - var3) * var12), (double)((var10 - var4) * var12));
+ }
+ }
+
+ if(var1.getBlockMetadata(var2, var3, var4) >= 8) {
+ boolean var13 = false;
+ if(var13 || this.shouldSideBeRendered(var1, var2, var3, var4 - 1, 2)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2, var3, var4 + 1, 3)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2 - 1, var3, var4, 4)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2 + 1, var3, var4, 5)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2, var3 + 1, var4 - 1, 2)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2, var3 + 1, var4 + 1, 3)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2 - 1, var3 + 1, var4, 4)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2 + 1, var3 + 1, var4, 5)) {
+ var13 = true;
+ }
+
+ if(var13) {
+ var5 = var5.normalize().addVector(0.0D, -6.0D, 0.0D);
+ }
+ }
+
+ var5 = var5.normalize();
+ return var5;
+ }
+
+ public void velocityToAddToEntity(World var1, int var2, int var3, int var4, Entity var5, Vec3D var6) {
+ Vec3D var7 = this.func_298_c(var1, var2, var3, var4);
+ var6.xCoord += var7.xCoord;
+ var6.yCoord += var7.yCoord;
+ var6.zCoord += var7.zCoord;
+ }
+
+ public int tickRate() {
+ return this.blockMaterial == Material.water ? 5 : (this.blockMaterial == Material.lava ? 30 : 0);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ super.updateTick(var1, var2, var3, var4, var5);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ this.checkForHarden(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ this.checkForHarden(var1, var2, var3, var4);
+ }
+
+ private void checkForHarden(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ if(this.blockMaterial == Material.lava) {
+ boolean var5 = false;
+ if(var5 || var1.getBlockMaterial(var2, var3, var4 - 1) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5 || var1.getBlockMaterial(var2, var3, var4 + 1) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5 || var1.getBlockMaterial(var2 - 1, var3, var4) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5 || var1.getBlockMaterial(var2 + 1, var3, var4) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5 || var1.getBlockMaterial(var2, var3 + 1, var4) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 == 0) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.obsidian.blockID);
+ } else if(var6 <= 4) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.cobblestone.blockID);
+ }
+
+ this.func_300_h(var1, var2, var3, var4);
+ }
+ }
+
+ }
+ }
+
+ protected void func_300_h(World var1, int var2, int var3, int var4) {
+ var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "random.fizz", 0.5F, 2.6F + (var1.rand.nextFloat() - var1.rand.nextFloat()) * 0.8F);
+
+ for(int var5 = 0; var5 < 8; ++var5) {
+ var1.spawnParticle("largesmoke", (double)var2 + Math.random(), (double)var3 + 1.2D, (double)var4 + Math.random(), 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/BlockFurnace.java b/src/net/minecraft/src/BlockFurnace.java
new file mode 100644
index 0000000..8952264
--- /dev/null
+++ b/src/net/minecraft/src/BlockFurnace.java
@@ -0,0 +1,137 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockFurnace extends BlockContainer {
+ private Random field_28033_a = new Random();
+ private final boolean isActive;
+ private static boolean field_28034_c = false;
+
+ protected BlockFurnace(int var1, boolean var2) {
+ super(var1, Material.rock);
+ this.isActive = var2;
+ this.blockIndexInTexture = 45;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.stoneOvenIdle.blockID;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ this.setDefaultDirection(var1, var2, var3, var4);
+ }
+
+ private void setDefaultDirection(World var1, int var2, int var3, int var4) {
+ if(!var1.singleplayerWorld) {
+ int var5 = var1.getBlockId(var2, var3, var4 - 1);
+ int var6 = var1.getBlockId(var2, var3, var4 + 1);
+ int var7 = var1.getBlockId(var2 - 1, var3, var4);
+ int var8 = var1.getBlockId(var2 + 1, var3, var4);
+ byte var9 = 3;
+ if(Block.opaqueCubeLookup[var5] && !Block.opaqueCubeLookup[var6]) {
+ var9 = 3;
+ }
+
+ if(Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var5]) {
+ var9 = 2;
+ }
+
+ if(Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var8]) {
+ var9 = 5;
+ }
+
+ if(Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var7]) {
+ var9 = 4;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var9);
+ }
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture + 17 : (var1 == 0 ? this.blockIndexInTexture + 17 : (var1 == 3 ? this.blockIndexInTexture - 1 : this.blockIndexInTexture));
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(var1.singleplayerWorld) {
+ return true;
+ } else {
+ TileEntityFurnace var6 = (TileEntityFurnace)var1.getBlockTileEntity(var2, var3, var4);
+ var5.displayGUIFurnace(var6);
+ return true;
+ }
+ }
+
+ public static void updateFurnaceBlockState(boolean var0, World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ TileEntity var6 = var1.getBlockTileEntity(var2, var3, var4);
+ field_28034_c = true;
+ if(var0) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.stoneOvenActive.blockID);
+ } else {
+ var1.setBlockWithNotify(var2, var3, var4, Block.stoneOvenIdle.blockID);
+ }
+
+ field_28034_c = false;
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var5);
+ var6.validate();
+ var1.setBlockTileEntity(var2, var3, var4, var6);
+ }
+
+ protected TileEntity getBlockEntity() {
+ return new TileEntityFurnace();
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+ if(var6 == 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 2);
+ }
+
+ if(var6 == 1) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 5);
+ }
+
+ if(var6 == 2) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 3);
+ }
+
+ if(var6 == 3) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 4);
+ }
+
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ if(!field_28034_c) {
+ TileEntityFurnace var5 = (TileEntityFurnace)var1.getBlockTileEntity(var2, var3, var4);
+
+ for(int var6 = 0; var6 < var5.getSizeInventory(); ++var6) {
+ ItemStack var7 = var5.getStackInSlot(var6);
+ if(var7 != null) {
+ float var8 = this.field_28033_a.nextFloat() * 0.8F + 0.1F;
+ float var9 = this.field_28033_a.nextFloat() * 0.8F + 0.1F;
+ float var10 = this.field_28033_a.nextFloat() * 0.8F + 0.1F;
+
+ while(var7.stackSize > 0) {
+ int var11 = this.field_28033_a.nextInt(21) + 10;
+ if(var11 > var7.stackSize) {
+ var11 = var7.stackSize;
+ }
+
+ var7.stackSize -= var11;
+ EntityItem var12 = new EntityItem(var1, (double)((float)var2 + var8), (double)((float)var3 + var9), (double)((float)var4 + var10), new ItemStack(var7.itemID, var11, var7.getItemDamage()));
+ float var13 = 0.05F;
+ var12.motionX = (double)((float)this.field_28033_a.nextGaussian() * var13);
+ var12.motionY = (double)((float)this.field_28033_a.nextGaussian() * var13 + 0.2F);
+ var12.motionZ = (double)((float)this.field_28033_a.nextGaussian() * var13);
+ var1.entityJoinedWorld(var12);
+ }
+ }
+ }
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+}
diff --git a/src/net/minecraft/src/BlockGlass.java b/src/net/minecraft/src/BlockGlass.java
new file mode 100644
index 0000000..c2672d1
--- /dev/null
+++ b/src/net/minecraft/src/BlockGlass.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockGlass extends BlockBreakable {
+ public BlockGlass(int var1, int var2, Material var3, boolean var4) {
+ super(var1, var2, var3, var4);
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+}
diff --git a/src/net/minecraft/src/BlockGlowStone.java b/src/net/minecraft/src/BlockGlowStone.java
new file mode 100644
index 0000000..aea4346
--- /dev/null
+++ b/src/net/minecraft/src/BlockGlowStone.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockGlowStone extends Block {
+ public BlockGlowStone(int var1, int var2, Material var3) {
+ super(var1, var2, var3);
+ }
+
+ public int quantityDropped(Random var1) {
+ return 2 + var1.nextInt(3);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.lightStoneDust.shiftedIndex;
+ }
+}
diff --git a/src/net/minecraft/src/BlockGrass.java b/src/net/minecraft/src/BlockGrass.java
new file mode 100644
index 0000000..bc5b431
--- /dev/null
+++ b/src/net/minecraft/src/BlockGrass.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockGrass extends Block {
+ protected BlockGrass(int var1) {
+ super(var1, Material.grass);
+ this.blockIndexInTexture = 3;
+ this.setTickOnLoad(true);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(!var1.singleplayerWorld) {
+ if(var1.getBlockLightValue(var2, var3 + 1, var4) < 4 && Block.lightOpacity[var1.getBlockId(var2, var3 + 1, var4)] > 2) {
+ if(var5.nextInt(4) != 0) {
+ return;
+ }
+
+ var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID);
+ } else if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9) {
+ int var6 = var2 + var5.nextInt(3) - 1;
+ int var7 = var3 + var5.nextInt(5) - 3;
+ int var8 = var4 + var5.nextInt(3) - 1;
+ int var9 = var1.getBlockId(var6, var7 + 1, var8);
+ if(var1.getBlockId(var6, var7, var8) == Block.dirt.blockID && var1.getBlockLightValue(var6, var7 + 1, var8) >= 4 && Block.lightOpacity[var9] <= 2) {
+ var1.setBlockWithNotify(var6, var7, var8, Block.grass.blockID);
+ }
+ }
+
+ }
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.dirt.idDropped(0, var2);
+ }
+}
diff --git a/src/net/minecraft/src/BlockGravel.java b/src/net/minecraft/src/BlockGravel.java
new file mode 100644
index 0000000..c0fd641
--- /dev/null
+++ b/src/net/minecraft/src/BlockGravel.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockGravel extends BlockSand {
+ public BlockGravel(int var1, int var2) {
+ super(var1, var2);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return var2.nextInt(10) == 0 ? Item.flint.shiftedIndex : this.blockID;
+ }
+}
diff --git a/src/net/minecraft/src/BlockIce.java b/src/net/minecraft/src/BlockIce.java
new file mode 100644
index 0000000..700b726
--- /dev/null
+++ b/src/net/minecraft/src/BlockIce.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockIce extends BlockBreakable {
+ public BlockIce(int var1, int var2) {
+ super(var1, var2, Material.ice, false);
+ this.slipperiness = 0.98F;
+ this.setTickOnLoad(true);
+ }
+
+ public void harvestBlock(World var1, EntityPlayer var2, int var3, int var4, int var5, int var6) {
+ super.harvestBlock(var1, var2, var3, var4, var5, var6);
+ Material var7 = var1.getBlockMaterial(var3, var4 - 1, var5);
+ if(var7.getIsSolid() || var7.getIsLiquid()) {
+ var1.setBlockWithNotify(var3, var4, var5, Block.waterMoving.blockID);
+ }
+
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getSavedLightValue(EnumSkyBlock.Block, var2, var3, var4) > 11 - Block.lightOpacity[this.blockID]) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, Block.waterStill.blockID);
+ }
+
+ }
+
+ public int getMobilityFlag() {
+ return 0;
+ }
+}
diff --git a/src/net/minecraft/src/BlockJukeBox.java b/src/net/minecraft/src/BlockJukeBox.java
new file mode 100644
index 0000000..a6fef0b
--- /dev/null
+++ b/src/net/minecraft/src/BlockJukeBox.java
@@ -0,0 +1,65 @@
+package net.minecraft.src;
+
+public class BlockJukeBox extends BlockContainer {
+ protected BlockJukeBox(int var1, int var2) {
+ super(var1, var2, Material.wood);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.blockIndexInTexture + (var1 == 1 ? 1 : 0);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(var1.getBlockMetadata(var2, var3, var4) == 0) {
+ return false;
+ } else {
+ this.func_28035_b_(var1, var2, var3, var4);
+ return true;
+ }
+ }
+
+ public void ejectRecord(World var1, int var2, int var3, int var4, int var5) {
+ if(!var1.singleplayerWorld) {
+ TileEntityRecordPlayer var6 = (TileEntityRecordPlayer)var1.getBlockTileEntity(var2, var3, var4);
+ var6.field_28009_a = var5;
+ var6.onInventoryChanged();
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ }
+ }
+
+ public void func_28035_b_(World var1, int var2, int var3, int var4) {
+ if(!var1.singleplayerWorld) {
+ TileEntityRecordPlayer var5 = (TileEntityRecordPlayer)var1.getBlockTileEntity(var2, var3, var4);
+ int var6 = var5.field_28009_a;
+ if(var6 != 0) {
+ var1.func_28097_e(1005, var2, var3, var4, 0);
+ var1.playRecord((String)null, var2, var3, var4);
+ var5.field_28009_a = 0;
+ var5.onInventoryChanged();
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ float var8 = 0.7F;
+ double var9 = (double)(var1.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D;
+ double var11 = (double)(var1.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.2D + 0.6D;
+ double var13 = (double)(var1.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D;
+ EntityItem var15 = new EntityItem(var1, (double)var2 + var9, (double)var3 + var11, (double)var4 + var13, new ItemStack(var6, 1, 0));
+ var15.delayBeforeCanPickup = 10;
+ var1.entityJoinedWorld(var15);
+ }
+ }
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ this.func_28035_b_(var1, var2, var3, var4);
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) {
+ if(!var1.singleplayerWorld) {
+ super.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, var6);
+ }
+ }
+
+ protected TileEntity getBlockEntity() {
+ return new TileEntityRecordPlayer();
+ }
+}
diff --git a/src/net/minecraft/src/BlockLadder.java b/src/net/minecraft/src/BlockLadder.java
new file mode 100644
index 0000000..1e88ba1
--- /dev/null
+++ b/src/net/minecraft/src/BlockLadder.java
@@ -0,0 +1,95 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockLadder extends Block {
+ protected BlockLadder(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ float var6 = 2.0F / 16.0F;
+ if(var5 == 2) {
+ this.setBlockBounds(0.0F, 0.0F, 1.0F - var6, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var5 == 3) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var6);
+ }
+
+ if(var5 == 4) {
+ this.setBlockBounds(1.0F - var6, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var5 == 5) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, var6, 1.0F, 1.0F);
+ }
+
+ return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2 - 1, var3, var4) ? true : (var1.isBlockNormalCube(var2 + 1, var3, var4) ? true : (var1.isBlockNormalCube(var2, var3, var4 - 1) ? true : var1.isBlockNormalCube(var2, var3, var4 + 1)));
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 == 0 || var5 == 2) && var1.isBlockNormalCube(var2, var3, var4 + 1)) {
+ var6 = 2;
+ }
+
+ if((var6 == 0 || var5 == 3) && var1.isBlockNormalCube(var2, var3, var4 - 1)) {
+ var6 = 3;
+ }
+
+ if((var6 == 0 || var5 == 4) && var1.isBlockNormalCube(var2 + 1, var3, var4)) {
+ var6 = 4;
+ }
+
+ if((var6 == 0 || var5 == 5) && var1.isBlockNormalCube(var2 - 1, var3, var4)) {
+ var6 = 5;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = false;
+ if(var6 == 2 && var1.isBlockNormalCube(var2, var3, var4 + 1)) {
+ var7 = true;
+ }
+
+ if(var6 == 3 && var1.isBlockNormalCube(var2, var3, var4 - 1)) {
+ var7 = true;
+ }
+
+ if(var6 == 4 && var1.isBlockNormalCube(var2 + 1, var3, var4)) {
+ var7 = true;
+ }
+
+ if(var6 == 5 && var1.isBlockNormalCube(var2 - 1, var3, var4)) {
+ var7 = true;
+ }
+
+ if(!var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var6);
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/BlockLeaves.java b/src/net/minecraft/src/BlockLeaves.java
new file mode 100644
index 0000000..2a918d1
--- /dev/null
+++ b/src/net/minecraft/src/BlockLeaves.java
@@ -0,0 +1,166 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockLeaves extends BlockLeavesBase {
+ private int baseIndexInPNG;
+ int[] adjacentTreeBlocks;
+
+ protected BlockLeaves(int var1, int var2) {
+ super(var1, var2, Material.leaves, false);
+ this.baseIndexInPNG = var2;
+ this.setTickOnLoad(true);
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ byte var5 = 1;
+ int var6 = var5 + 1;
+ if(var1.checkChunksExist(var2 - var6, var3 - var6, var4 - var6, var2 + var6, var3 + var6, var4 + var6)) {
+ for(int var7 = -var5; var7 <= var5; ++var7) {
+ for(int var8 = -var5; var8 <= var5; ++var8) {
+ for(int var9 = -var5; var9 <= var5; ++var9) {
+ int var10 = var1.getBlockId(var2 + var7, var3 + var8, var4 + var9);
+ if(var10 == Block.leaves.blockID) {
+ int var11 = var1.getBlockMetadata(var2 + var7, var3 + var8, var4 + var9);
+ var1.setBlockMetadata(var2 + var7, var3 + var8, var4 + var9, var11 | 8);
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(!var1.singleplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ byte var7 = 4;
+ int var8 = var7 + 1;
+ byte var9 = 32;
+ int var10 = var9 * var9;
+ int var11 = var9 / 2;
+ if(this.adjacentTreeBlocks == null) {
+ this.adjacentTreeBlocks = new int[var9 * var9 * var9];
+ }
+
+ int var12;
+ if(var1.checkChunksExist(var2 - var8, var3 - var8, var4 - var8, var2 + var8, var3 + var8, var4 + var8)) {
+ var12 = -var7;
+
+ label111:
+ while(true) {
+ int var13;
+ int var14;
+ int var15;
+ if(var12 > var7) {
+ var12 = 1;
+
+ while(true) {
+ if(var12 > 4) {
+ break label111;
+ }
+
+ for(var13 = -var7; var13 <= var7; ++var13) {
+ for(var14 = -var7; var14 <= var7; ++var14) {
+ for(var15 = -var7; var15 <= var7; ++var15) {
+ if(this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + var15 + var11] == var12 - 1) {
+ if(this.adjacentTreeBlocks[(var13 + var11 - 1) * var10 + (var14 + var11) * var9 + var15 + var11] == -2) {
+ this.adjacentTreeBlocks[(var13 + var11 - 1) * var10 + (var14 + var11) * var9 + var15 + var11] = var12;
+ }
+
+ if(this.adjacentTreeBlocks[(var13 + var11 + 1) * var10 + (var14 + var11) * var9 + var15 + var11] == -2) {
+ this.adjacentTreeBlocks[(var13 + var11 + 1) * var10 + (var14 + var11) * var9 + var15 + var11] = var12;
+ }
+
+ if(this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11 - 1) * var9 + var15 + var11] == -2) {
+ this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11 - 1) * var9 + var15 + var11] = var12;
+ }
+
+ if(this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11 + 1) * var9 + var15 + var11] == -2) {
+ this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11 + 1) * var9 + var15 + var11] = var12;
+ }
+
+ if(this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + (var15 + var11 - 1)] == -2) {
+ this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + (var15 + var11 - 1)] = var12;
+ }
+
+ if(this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + var15 + var11 + 1] == -2) {
+ this.adjacentTreeBlocks[(var13 + var11) * var10 + (var14 + var11) * var9 + var15 + var11 + 1] = var12;
+ }
+ }
+ }
+ }
+ }
+
+ ++var12;
+ }
+ }
+
+ for(var13 = -var7; var13 <= var7; ++var13) {
+ for(var14 = -var7; var14 <= var7; ++var14) {
+ var15 = var1.getBlockId(var2 + var12, var3 + var13, var4 + var14);
+ if(var15 == Block.wood.blockID) {
+ this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = 0;
+ } else if(var15 == Block.leaves.blockID) {
+ this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = -2;
+ } else {
+ this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = -1;
+ }
+ }
+ }
+
+ ++var12;
+ }
+ }
+
+ var12 = this.adjacentTreeBlocks[var11 * var10 + var11 * var9 + var11];
+ if(var12 >= 0) {
+ var1.setBlockMetadata(var2, var3, var4, var6 & -9);
+ } else {
+ this.removeLeaves(var1, var2, var3, var4);
+ }
+ }
+
+ }
+ }
+
+ private void removeLeaves(World var1, int var2, int var3, int var4) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ public int quantityDropped(Random var1) {
+ return var1.nextInt(20) == 0 ? 1 : 0;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.sapling.blockID;
+ }
+
+ public void harvestBlock(World var1, EntityPlayer var2, int var3, int var4, int var5, int var6) {
+ if(!var1.singleplayerWorld && var2.getCurrentEquippedItem() != null && var2.getCurrentEquippedItem().itemID == Item.field_31022_bc.shiftedIndex) {
+ var2.addStat(StatList.mineBlockStatArray[this.blockID], 1);
+ this.dropBlockAsItem_do(var1, var3, var4, var5, new ItemStack(Block.leaves.blockID, 1, var6 & 3));
+ } else {
+ super.harvestBlock(var1, var2, var3, var4, var5, var6);
+ }
+
+ }
+
+ protected int damageDropped(int var1) {
+ return var1 & 3;
+ }
+
+ public boolean isOpaqueCube() {
+ return !this.graphicsLevel;
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return (var2 & 3) == 1 ? this.blockIndexInTexture + 80 : this.blockIndexInTexture;
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ super.onEntityWalking(var1, var2, var3, var4, var5);
+ }
+}
diff --git a/src/net/minecraft/src/BlockLeavesBase.java b/src/net/minecraft/src/BlockLeavesBase.java
new file mode 100644
index 0000000..1208378
--- /dev/null
+++ b/src/net/minecraft/src/BlockLeavesBase.java
@@ -0,0 +1,14 @@
+package net.minecraft.src;
+
+public class BlockLeavesBase extends Block {
+ protected boolean graphicsLevel;
+
+ protected BlockLeavesBase(int var1, int var2, Material var3, boolean var4) {
+ super(var1, var2, var3);
+ this.graphicsLevel = var4;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/BlockLever.java b/src/net/minecraft/src/BlockLever.java
new file mode 100644
index 0000000..148ff5e
--- /dev/null
+++ b/src/net/minecraft/src/BlockLever.java
@@ -0,0 +1,194 @@
+package net.minecraft.src;
+
+public class BlockLever extends Block {
+ protected BlockLever(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean canPlaceBlockOnSide(World var1, int var2, int var3, int var4, int var5) {
+ return var5 == 1 && var1.isBlockNormalCube(var2, var3 - 1, var4) ? true : (var5 == 2 && var1.isBlockNormalCube(var2, var3, var4 + 1) ? true : (var5 == 3 && var1.isBlockNormalCube(var2, var3, var4 - 1) ? true : (var5 == 4 && var1.isBlockNormalCube(var2 + 1, var3, var4) ? true : var5 == 5 && var1.isBlockNormalCube(var2 - 1, var3, var4))));
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2 - 1, var3, var4) ? true : (var1.isBlockNormalCube(var2 + 1, var3, var4) ? true : (var1.isBlockNormalCube(var2, var3, var4 - 1) ? true : (var1.isBlockNormalCube(var2, var3, var4 + 1) ? true : var1.isBlockNormalCube(var2, var3 - 1, var4))));
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var6 & 8;
+ var6 &= 7;
+ var6 = -1;
+ if(var5 == 1 && var1.isBlockNormalCube(var2, var3 - 1, var4)) {
+ var6 = 5 + var1.rand.nextInt(2);
+ }
+
+ if(var5 == 2 && var1.isBlockNormalCube(var2, var3, var4 + 1)) {
+ var6 = 4;
+ }
+
+ if(var5 == 3 && var1.isBlockNormalCube(var2, var3, var4 - 1)) {
+ var6 = 3;
+ }
+
+ if(var5 == 4 && var1.isBlockNormalCube(var2 + 1, var3, var4)) {
+ var6 = 2;
+ }
+
+ if(var5 == 5 && var1.isBlockNormalCube(var2 - 1, var3, var4)) {
+ var6 = 1;
+ }
+
+ if(var6 == -1) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 + var7);
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(this.checkIfAttachedToBlock(var1, var2, var3, var4)) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ boolean var7 = false;
+ if(!var1.isBlockNormalCube(var2 - 1, var3, var4) && var6 == 1) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2 + 1, var3, var4) && var6 == 2) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2, var3, var4 - 1) && var6 == 3) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2, var3, var4 + 1) && var6 == 4) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2, var3 - 1, var4) && var6 == 5) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2, var3 - 1, var4) && var6 == 6) {
+ var7 = true;
+ }
+
+ if(var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ }
+
+ private boolean checkIfAttachedToBlock(World var1, int var2, int var3, int var4) {
+ if(!this.canPlaceBlockAt(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ float var6 = 3.0F / 16.0F;
+ if(var5 == 1) {
+ this.setBlockBounds(0.0F, 0.2F, 0.5F - var6, var6 * 2.0F, 0.8F, 0.5F + var6);
+ } else if(var5 == 2) {
+ this.setBlockBounds(1.0F - var6 * 2.0F, 0.2F, 0.5F - var6, 1.0F, 0.8F, 0.5F + var6);
+ } else if(var5 == 3) {
+ this.setBlockBounds(0.5F - var6, 0.2F, 0.0F, 0.5F + var6, 0.8F, var6 * 2.0F);
+ } else if(var5 == 4) {
+ this.setBlockBounds(0.5F - var6, 0.2F, 1.0F - var6 * 2.0F, 0.5F + var6, 0.8F, 1.0F);
+ } else {
+ var6 = 0.25F;
+ this.setBlockBounds(0.5F - var6, 0.0F, 0.5F - var6, 0.5F + var6, 0.6F, 0.5F + var6);
+ }
+
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(var1.singleplayerWorld) {
+ return true;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var6 & 7;
+ int var8 = 8 - (var6 & 8);
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + var8);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.click", 0.3F, var8 > 0 ? 0.6F : 0.5F);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ if(var7 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var7 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var7 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var7 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+
+ return true;
+ }
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if((var5 & 8) > 0) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ int var6 = var5 & 7;
+ if(var6 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var6 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var6 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var6 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return (var1.getBlockMetadata(var2, var3, var4) & 8) > 0;
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) == 0) {
+ return false;
+ } else {
+ int var7 = var6 & 7;
+ return var7 == 6 && var5 == 1 ? true : (var7 == 5 && var5 == 1 ? true : (var7 == 4 && var5 == 2 ? true : (var7 == 3 && var5 == 3 ? true : (var7 == 2 && var5 == 4 ? true : var7 == 1 && var5 == 5))));
+ }
+ }
+
+ public boolean canProvidePower() {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/BlockLockedChest.java b/src/net/minecraft/src/BlockLockedChest.java
new file mode 100644
index 0000000..aa9aa16
--- /dev/null
+++ b/src/net/minecraft/src/BlockLockedChest.java
@@ -0,0 +1,22 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockLockedChest extends Block {
+ protected BlockLockedChest(int var1) {
+ super(var1, Material.wood);
+ this.blockIndexInTexture = 26;
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture - 1 : (var1 == 0 ? this.blockIndexInTexture - 1 : (var1 == 3 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture));
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return true;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+}
diff --git a/src/net/minecraft/src/BlockLog.java b/src/net/minecraft/src/BlockLog.java
new file mode 100644
index 0000000..09c65f7
--- /dev/null
+++ b/src/net/minecraft/src/BlockLog.java
@@ -0,0 +1,51 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockLog extends Block {
+ protected BlockLog(int var1) {
+ super(var1, Material.wood);
+ this.blockIndexInTexture = 20;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.wood.blockID;
+ }
+
+ public void harvestBlock(World var1, EntityPlayer var2, int var3, int var4, int var5, int var6) {
+ super.harvestBlock(var1, var2, var3, var4, var5, var6);
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ byte var5 = 4;
+ int var6 = var5 + 1;
+ if(var1.checkChunksExist(var2 - var6, var3 - var6, var4 - var6, var2 + var6, var3 + var6, var4 + var6)) {
+ for(int var7 = -var5; var7 <= var5; ++var7) {
+ for(int var8 = -var5; var8 <= var5; ++var8) {
+ for(int var9 = -var5; var9 <= var5; ++var9) {
+ int var10 = var1.getBlockId(var2 + var7, var3 + var8, var4 + var9);
+ if(var10 == Block.leaves.blockID) {
+ int var11 = var1.getBlockMetadata(var2 + var7, var3 + var8, var4 + var9);
+ if((var11 & 8) == 0) {
+ var1.setBlockMetadata(var2 + var7, var3 + var8, var4 + var9, var11 | 8);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var1 == 1 ? 21 : (var1 == 0 ? 21 : (var2 == 1 ? 116 : (var2 == 2 ? 117 : 20)));
+ }
+
+ protected int damageDropped(int var1) {
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/BlockMobSpawner.java b/src/net/minecraft/src/BlockMobSpawner.java
new file mode 100644
index 0000000..74f9f02
--- /dev/null
+++ b/src/net/minecraft/src/BlockMobSpawner.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockMobSpawner extends BlockContainer {
+ protected BlockMobSpawner(int var1, int var2) {
+ super(var1, var2, Material.rock);
+ }
+
+ protected TileEntity getBlockEntity() {
+ return new TileEntityMobSpawner();
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return 0;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/BlockMushroom.java b/src/net/minecraft/src/BlockMushroom.java
new file mode 100644
index 0000000..ee19e71
--- /dev/null
+++ b/src/net/minecraft/src/BlockMushroom.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockMushroom extends BlockFlower {
+ protected BlockMushroom(int var1, int var2) {
+ super(var1, var2);
+ float var3 = 0.2F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 2.0F, 0.5F + var3);
+ this.setTickOnLoad(true);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var5.nextInt(100) == 0) {
+ int var6 = var2 + var5.nextInt(3) - 1;
+ int var7 = var3 + var5.nextInt(2) - var5.nextInt(2);
+ int var8 = var4 + var5.nextInt(3) - 1;
+ if(var1.isAirBlock(var6, var7, var8) && this.canBlockStay(var1, var6, var7, var8)) {
+ int var10000 = var2 + (var5.nextInt(3) - 1);
+ var10000 = var4 + (var5.nextInt(3) - 1);
+ if(var1.isAirBlock(var6, var7, var8) && this.canBlockStay(var1, var6, var7, var8)) {
+ var1.setBlockWithNotify(var6, var7, var8, this.blockID);
+ }
+ }
+ }
+
+ }
+
+ protected boolean canThisPlantGrowOnThisBlockID(int var1) {
+ return Block.opaqueCubeLookup[var1];
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return var3 >= 0 && var3 < 128 ? var1.getBlockLightValueNoChecks(var2, var3, var4) < 13 && this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4)) : false;
+ }
+}
diff --git a/src/net/minecraft/src/BlockNetherrack.java b/src/net/minecraft/src/BlockNetherrack.java
new file mode 100644
index 0000000..70b4ea7
--- /dev/null
+++ b/src/net/minecraft/src/BlockNetherrack.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public class BlockNetherrack extends Block {
+ public BlockNetherrack(int var1, int var2) {
+ super(var1, var2, Material.rock);
+ }
+}
diff --git a/src/net/minecraft/src/BlockNote.java b/src/net/minecraft/src/BlockNote.java
new file mode 100644
index 0000000..c680a8c
--- /dev/null
+++ b/src/net/minecraft/src/BlockNote.java
@@ -0,0 +1,71 @@
+package net.minecraft.src;
+
+public class BlockNote extends BlockContainer {
+ public BlockNote(int var1) {
+ super(var1, 74, Material.wood);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.blockIndexInTexture;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(var5 > 0 && Block.blocksList[var5].canProvidePower()) {
+ boolean var6 = var1.isBlockGettingPowered(var2, var3, var4);
+ TileEntityNote var7 = (TileEntityNote)var1.getBlockTileEntity(var2, var3, var4);
+ if(var7.previousRedstoneState != var6) {
+ if(var6) {
+ var7.triggerNote(var1, var2, var3, var4);
+ }
+
+ var7.previousRedstoneState = var6;
+ }
+ }
+
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(var1.singleplayerWorld) {
+ return true;
+ } else {
+ TileEntityNote var6 = (TileEntityNote)var1.getBlockTileEntity(var2, var3, var4);
+ var6.changePitch();
+ var6.triggerNote(var1, var2, var3, var4);
+ return true;
+ }
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(!var1.singleplayerWorld) {
+ TileEntityNote var6 = (TileEntityNote)var1.getBlockTileEntity(var2, var3, var4);
+ var6.triggerNote(var1, var2, var3, var4);
+ }
+ }
+
+ protected TileEntity getBlockEntity() {
+ return new TileEntityNote();
+ }
+
+ public void playBlock(World var1, int var2, int var3, int var4, int var5, int var6) {
+ float var7 = (float)Math.pow(2.0D, (double)(var6 - 12) / 12.0D);
+ String var8 = "harp";
+ if(var5 == 1) {
+ var8 = "bd";
+ }
+
+ if(var5 == 2) {
+ var8 = "snare";
+ }
+
+ if(var5 == 3) {
+ var8 = "hat";
+ }
+
+ if(var5 == 4) {
+ var8 = "bassattack";
+ }
+
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "note." + var8, 3.0F, var7);
+ var1.spawnParticle("note", (double)var2 + 0.5D, (double)var3 + 1.2D, (double)var4 + 0.5D, (double)var6 / 24.0D, 0.0D, 0.0D);
+ }
+}
diff --git a/src/net/minecraft/src/BlockObsidian.java b/src/net/minecraft/src/BlockObsidian.java
new file mode 100644
index 0000000..c75b227
--- /dev/null
+++ b/src/net/minecraft/src/BlockObsidian.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockObsidian extends BlockStone {
+ public BlockObsidian(int var1, int var2) {
+ super(var1, var2);
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.obsidian.blockID;
+ }
+}
diff --git a/src/net/minecraft/src/BlockOre.java b/src/net/minecraft/src/BlockOre.java
new file mode 100644
index 0000000..949ac1b
--- /dev/null
+++ b/src/net/minecraft/src/BlockOre.java
@@ -0,0 +1,21 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockOre extends Block {
+ public BlockOre(int var1, int var2) {
+ super(var1, var2, Material.rock);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return this.blockID == Block.oreCoal.blockID ? Item.coal.shiftedIndex : (this.blockID == Block.oreDiamond.blockID ? Item.diamond.shiftedIndex : (this.blockID == Block.oreLapis.blockID ? Item.dyePowder.shiftedIndex : this.blockID));
+ }
+
+ public int quantityDropped(Random var1) {
+ return this.blockID == Block.oreLapis.blockID ? 4 + var1.nextInt(5) : 1;
+ }
+
+ protected int damageDropped(int var1) {
+ return this.blockID == Block.oreLapis.blockID ? 4 : 0;
+ }
+}
diff --git a/src/net/minecraft/src/BlockOreStorage.java b/src/net/minecraft/src/BlockOreStorage.java
new file mode 100644
index 0000000..891e520
--- /dev/null
+++ b/src/net/minecraft/src/BlockOreStorage.java
@@ -0,0 +1,12 @@
+package net.minecraft.src;
+
+public class BlockOreStorage extends Block {
+ public BlockOreStorage(int var1, int var2) {
+ super(var1, Material.iron);
+ this.blockIndexInTexture = var2;
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.blockIndexInTexture;
+ }
+}
diff --git a/src/net/minecraft/src/BlockPistonBase.java b/src/net/minecraft/src/BlockPistonBase.java
new file mode 100644
index 0000000..31fedfe
--- /dev/null
+++ b/src/net/minecraft/src/BlockPistonBase.java
@@ -0,0 +1,317 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+
+public class BlockPistonBase extends Block {
+ private boolean isSticky;
+ private boolean ignoreUpdates;
+
+ public BlockPistonBase(int var1, int var2, boolean var3) {
+ super(var1, var2, Material.piston);
+ this.isSticky = var3;
+ this.setStepSound(soundStoneFootstep);
+ this.setHardness(0.5F);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ int var3 = getOrientation(var2);
+ return var3 > 5 ? this.blockIndexInTexture : (var1 == var3 ? (!isExtended(var2) && this.minX <= 0.0D && this.minY <= 0.0D && this.minZ <= 0.0D && this.maxX >= 1.0D && this.maxY >= 1.0D && this.maxZ >= 1.0D ? this.blockIndexInTexture : 110) : (var1 == PistonBlockTextures.field_31052_a[var3] ? 109 : 108));
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ return false;
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ int var6 = determineOrientation(var1, var2, var3, var4, (EntityPlayer)var5);
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ if(!var1.singleplayerWorld) {
+ this.updatePistonState(var1, var2, var3, var4);
+ }
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!var1.singleplayerWorld && !this.ignoreUpdates) {
+ this.updatePistonState(var1, var2, var3, var4);
+ }
+
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(!var1.singleplayerWorld && var1.getBlockTileEntity(var2, var3, var4) == null) {
+ this.updatePistonState(var1, var2, var3, var4);
+ }
+
+ }
+
+ private void updatePistonState(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ int var6 = getOrientation(var5);
+ boolean var7 = this.isPowered(var1, var2, var3, var4, var6);
+ if(var5 != 7) {
+ if(var7 && !isExtended(var5)) {
+ if(canExtend(var1, var2, var3, var4, var6)) {
+ var1.setBlockMetadata(var2, var3, var4, var6 | 8);
+ var1.playNoteAt(var2, var3, var4, 0, var6);
+ }
+ } else if(!var7 && isExtended(var5)) {
+ var1.setBlockMetadata(var2, var3, var4, var6);
+ var1.playNoteAt(var2, var3, var4, 1, var6);
+ }
+
+ }
+ }
+
+ private boolean isPowered(World var1, int var2, int var3, int var4, int var5) {
+ return var5 != 0 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3 - 1, var4, 0) ? true : (var5 != 1 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3 + 1, var4, 1) ? true : (var5 != 2 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 - 1, 2) ? true : (var5 != 3 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 + 1, 3) ? true : (var5 != 5 && var1.isBlockIndirectlyProvidingPowerTo(var2 + 1, var3, var4, 5) ? true : (var5 != 4 && var1.isBlockIndirectlyProvidingPowerTo(var2 - 1, var3, var4, 4) ? true : (var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4, 0) ? true : (var1.isBlockIndirectlyProvidingPowerTo(var2, var3 + 2, var4, 1) ? true : (var1.isBlockIndirectlyProvidingPowerTo(var2, var3 + 1, var4 - 1, 2) ? true : (var1.isBlockIndirectlyProvidingPowerTo(var2, var3 + 1, var4 + 1, 3) ? true : (var1.isBlockIndirectlyProvidingPowerTo(var2 - 1, var3 + 1, var4, 4) ? true : var1.isBlockIndirectlyProvidingPowerTo(var2 + 1, var3 + 1, var4, 5)))))))))));
+ }
+
+ public void playBlock(World var1, int var2, int var3, int var4, int var5, int var6) {
+ this.ignoreUpdates = true;
+ if(var5 == 0) {
+ if(this.tryExtend(var1, var2, var3, var4, var6)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 | 8);
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "tile.piston.out", 0.5F, var1.rand.nextFloat() * 0.25F + 0.6F);
+ }
+ } else if(var5 == 1) {
+ TileEntity var8 = var1.getBlockTileEntity(var2 + PistonBlockTextures.field_31051_b[var6], var3 + PistonBlockTextures.field_31054_c[var6], var4 + PistonBlockTextures.field_31053_d[var6]);
+ if(var8 != null && var8 instanceof TileEntityPiston) {
+ ((TileEntityPiston)var8).clearPistonTileEntity();
+ }
+
+ var1.setBlockAndMetadata(var2, var3, var4, Block.pistonMoving.blockID, var6);
+ var1.setBlockTileEntity(var2, var3, var4, BlockPistonMoving.getTileEntity(this.blockID, var6, var6, false, true));
+ if(this.isSticky) {
+ int var9 = var2 + PistonBlockTextures.field_31051_b[var6] * 2;
+ int var10 = var3 + PistonBlockTextures.field_31054_c[var6] * 2;
+ int var11 = var4 + PistonBlockTextures.field_31053_d[var6] * 2;
+ int var12 = var1.getBlockId(var9, var10, var11);
+ int var13 = var1.getBlockMetadata(var9, var10, var11);
+ boolean var14 = false;
+ if(var12 == Block.pistonMoving.blockID) {
+ TileEntity var15 = var1.getBlockTileEntity(var9, var10, var11);
+ if(var15 != null && var15 instanceof TileEntityPiston) {
+ TileEntityPiston var16 = (TileEntityPiston)var15;
+ if(var16.func_31008_d() == var6 && var16.func_31010_c()) {
+ var16.clearPistonTileEntity();
+ var12 = var16.getStoredBlockID();
+ var13 = var16.func_31005_e();
+ var14 = true;
+ }
+ }
+ }
+
+ if(var14 || var12 <= 0 || !canPushBlock(var12, var1, var9, var10, var11, false) || Block.blocksList[var12].getMobilityFlag() != 0 && var12 != Block.pistonBase.blockID && var12 != Block.pistonStickyBase.blockID) {
+ if(!var14) {
+ this.ignoreUpdates = false;
+ var1.setBlockWithNotify(var2 + PistonBlockTextures.field_31051_b[var6], var3 + PistonBlockTextures.field_31054_c[var6], var4 + PistonBlockTextures.field_31053_d[var6], 0);
+ this.ignoreUpdates = true;
+ }
+ } else {
+ this.ignoreUpdates = false;
+ var1.setBlockWithNotify(var9, var10, var11, 0);
+ this.ignoreUpdates = true;
+ var2 += PistonBlockTextures.field_31051_b[var6];
+ var3 += PistonBlockTextures.field_31054_c[var6];
+ var4 += PistonBlockTextures.field_31053_d[var6];
+ var1.setBlockAndMetadata(var2, var3, var4, Block.pistonMoving.blockID, var13);
+ var1.setBlockTileEntity(var2, var3, var4, BlockPistonMoving.getTileEntity(var12, var13, var6, false, false));
+ }
+ } else {
+ this.ignoreUpdates = false;
+ var1.setBlockWithNotify(var2 + PistonBlockTextures.field_31051_b[var6], var3 + PistonBlockTextures.field_31054_c[var6], var4 + PistonBlockTextures.field_31053_d[var6], 0);
+ this.ignoreUpdates = true;
+ }
+
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "tile.piston.in", 0.5F, var1.rand.nextFloat() * 0.15F + 0.6F);
+ }
+
+ this.ignoreUpdates = false;
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if(isExtended(var5)) {
+ switch(getOrientation(var5)) {
+ case 0:
+ this.setBlockBounds(0.0F, 0.25F, 0.0F, 1.0F, 1.0F, 1.0F);
+ break;
+ case 1:
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 12.0F / 16.0F, 1.0F);
+ break;
+ case 2:
+ this.setBlockBounds(0.0F, 0.0F, 0.25F, 1.0F, 1.0F, 1.0F);
+ break;
+ case 3:
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 12.0F / 16.0F);
+ break;
+ case 4:
+ this.setBlockBounds(0.25F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ break;
+ case 5:
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 12.0F / 16.0F, 1.0F, 1.0F);
+ }
+ } else {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ }
+
+ public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public static int getOrientation(int var0) {
+ return var0 & 7;
+ }
+
+ public static boolean isExtended(int var0) {
+ return (var0 & 8) != 0;
+ }
+
+ private static int determineOrientation(World var0, int var1, int var2, int var3, EntityPlayer var4) {
+ if(MathHelper.abs((float)var4.posX - (float)var1) < 2.0F && MathHelper.abs((float)var4.posZ - (float)var3) < 2.0F) {
+ double var5 = var4.posY + 1.82D - (double)var4.yOffset;
+ if(var5 - (double)var2 > 2.0D) {
+ return 1;
+ }
+
+ if((double)var2 - var5 > 0.0D) {
+ return 0;
+ }
+ }
+
+ int var7 = MathHelper.floor_double((double)(var4.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+ return var7 == 0 ? 2 : (var7 == 1 ? 5 : (var7 == 2 ? 3 : (var7 == 3 ? 4 : 0)));
+ }
+
+ private static boolean canPushBlock(int var0, World var1, int var2, int var3, int var4, boolean var5) {
+ if(var0 == Block.obsidian.blockID) {
+ return false;
+ } else {
+ if(var0 != Block.pistonBase.blockID && var0 != Block.pistonStickyBase.blockID) {
+ if(Block.blocksList[var0].getHardness() == -1.0F) {
+ return false;
+ }
+
+ if(Block.blocksList[var0].getMobilityFlag() == 2) {
+ return false;
+ }
+
+ if(!var5 && Block.blocksList[var0].getMobilityFlag() == 1) {
+ return false;
+ }
+ } else if(isExtended(var1.getBlockMetadata(var2, var3, var4))) {
+ return false;
+ }
+
+ TileEntity var6 = var1.getBlockTileEntity(var2, var3, var4);
+ return var6 == null;
+ }
+ }
+
+ private static boolean canExtend(World var0, int var1, int var2, int var3, int var4) {
+ int var5 = var1 + PistonBlockTextures.field_31051_b[var4];
+ int var6 = var2 + PistonBlockTextures.field_31054_c[var4];
+ int var7 = var3 + PistonBlockTextures.field_31053_d[var4];
+ int var8 = 0;
+
+ while(true) {
+ if(var8 < 13) {
+ if(var6 <= 0 || var6 >= 127) {
+ return false;
+ }
+
+ int var9 = var0.getBlockId(var5, var6, var7);
+ if(var9 != 0) {
+ if(!canPushBlock(var9, var0, var5, var6, var7, true)) {
+ return false;
+ }
+
+ if(Block.blocksList[var9].getMobilityFlag() != 1) {
+ if(var8 == 12) {
+ return false;
+ }
+
+ var5 += PistonBlockTextures.field_31051_b[var4];
+ var6 += PistonBlockTextures.field_31054_c[var4];
+ var7 += PistonBlockTextures.field_31053_d[var4];
+ ++var8;
+ continue;
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+
+ private boolean tryExtend(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var2 + PistonBlockTextures.field_31051_b[var5];
+ int var7 = var3 + PistonBlockTextures.field_31054_c[var5];
+ int var8 = var4 + PistonBlockTextures.field_31053_d[var5];
+ int var9 = 0;
+
+ while(true) {
+ int var10;
+ if(var9 < 13) {
+ if(var7 <= 0 || var7 >= 127) {
+ return false;
+ }
+
+ var10 = var1.getBlockId(var6, var7, var8);
+ if(var10 != 0) {
+ if(!canPushBlock(var10, var1, var6, var7, var8, true)) {
+ return false;
+ }
+
+ if(Block.blocksList[var10].getMobilityFlag() != 1) {
+ if(var9 == 12) {
+ return false;
+ }
+
+ var6 += PistonBlockTextures.field_31051_b[var5];
+ var7 += PistonBlockTextures.field_31054_c[var5];
+ var8 += PistonBlockTextures.field_31053_d[var5];
+ ++var9;
+ continue;
+ }
+
+ Block.blocksList[var10].dropBlockAsItem(var1, var6, var7, var8, var1.getBlockMetadata(var6, var7, var8));
+ var1.setBlockWithNotify(var6, var7, var8, 0);
+ }
+ }
+
+ while(var6 != var2 || var7 != var3 || var8 != var4) {
+ var9 = var6 - PistonBlockTextures.field_31051_b[var5];
+ var10 = var7 - PistonBlockTextures.field_31054_c[var5];
+ int var11 = var8 - PistonBlockTextures.field_31053_d[var5];
+ int var12 = var1.getBlockId(var9, var10, var11);
+ int var13 = var1.getBlockMetadata(var9, var10, var11);
+ if(var12 == this.blockID && var9 == var2 && var10 == var3 && var11 == var4) {
+ var1.setBlockAndMetadata(var6, var7, var8, Block.pistonMoving.blockID, var5 | (this.isSticky ? 8 : 0));
+ var1.setBlockTileEntity(var6, var7, var8, BlockPistonMoving.getTileEntity(Block.pistonExtension.blockID, var5 | (this.isSticky ? 8 : 0), var5, true, false));
+ } else {
+ var1.setBlockAndMetadata(var6, var7, var8, Block.pistonMoving.blockID, var13);
+ var1.setBlockTileEntity(var6, var7, var8, BlockPistonMoving.getTileEntity(var12, var13, var5, true, false));
+ }
+
+ var6 = var9;
+ var7 = var10;
+ var8 = var11;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/BlockPistonExtension.java b/src/net/minecraft/src/BlockPistonExtension.java
new file mode 100644
index 0000000..5792a09
--- /dev/null
+++ b/src/net/minecraft/src/BlockPistonExtension.java
@@ -0,0 +1,139 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+public class BlockPistonExtension extends Block {
+ private int field_31046_a = -1;
+
+ public BlockPistonExtension(int var1, int var2) {
+ super(var1, var2, Material.piston);
+ this.setStepSound(soundStoneFootstep);
+ this.setHardness(0.5F);
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ super.onBlockRemoval(var1, var2, var3, var4);
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ int var6 = PistonBlockTextures.field_31052_a[func_31045_b(var5)];
+ var2 += PistonBlockTextures.field_31051_b[var6];
+ var3 += PistonBlockTextures.field_31054_c[var6];
+ var4 += PistonBlockTextures.field_31053_d[var6];
+ int var7 = var1.getBlockId(var2, var3, var4);
+ if(var7 == Block.pistonBase.blockID || var7 == Block.pistonStickyBase.blockID) {
+ var5 = var1.getBlockMetadata(var2, var3, var4);
+ if(BlockPistonBase.isExtended(var5)) {
+ Block.blocksList[var7].dropBlockAsItem(var1, var2, var3, var4, var5);
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ int var3 = func_31045_b(var2);
+ return var1 == var3 ? (this.field_31046_a >= 0 ? this.field_31046_a : ((var2 & 8) != 0 ? this.blockIndexInTexture - 1 : this.blockIndexInTexture)) : (var1 == PistonBlockTextures.field_31052_a[var3] ? 107 : 108);
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return false;
+ }
+
+ public boolean canPlaceBlockOnSide(World var1, int var2, int var3, int var4, int var5) {
+ return false;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ switch(func_31045_b(var7)) {
+ case 0:
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(6.0F / 16.0F, 0.25F, 6.0F / 16.0F, 10.0F / 16.0F, 1.0F, 10.0F / 16.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ break;
+ case 1:
+ this.setBlockBounds(0.0F, 12.0F / 16.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(6.0F / 16.0F, 0.0F, 6.0F / 16.0F, 10.0F / 16.0F, 12.0F / 16.0F, 10.0F / 16.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ break;
+ case 2:
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.25F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.25F, 6.0F / 16.0F, 0.25F, 12.0F / 16.0F, 10.0F / 16.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ break;
+ case 3:
+ this.setBlockBounds(0.0F, 0.0F, 12.0F / 16.0F, 1.0F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.25F, 6.0F / 16.0F, 0.0F, 12.0F / 16.0F, 10.0F / 16.0F, 12.0F / 16.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ break;
+ case 4:
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.25F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(6.0F / 16.0F, 0.25F, 0.25F, 10.0F / 16.0F, 12.0F / 16.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ break;
+ case 5:
+ this.setBlockBounds(12.0F / 16.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.0F, 6.0F / 16.0F, 0.25F, 12.0F / 16.0F, 10.0F / 16.0F, 12.0F / 16.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ }
+
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ switch(func_31045_b(var5)) {
+ case 0:
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F);
+ break;
+ case 1:
+ this.setBlockBounds(0.0F, 12.0F / 16.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ break;
+ case 2:
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.25F);
+ break;
+ case 3:
+ this.setBlockBounds(0.0F, 0.0F, 12.0F / 16.0F, 1.0F, 1.0F, 1.0F);
+ break;
+ case 4:
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.25F, 1.0F, 1.0F);
+ break;
+ case 5:
+ this.setBlockBounds(12.0F / 16.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = func_31045_b(var1.getBlockMetadata(var2, var3, var4));
+ int var7 = var1.getBlockId(var2 - PistonBlockTextures.field_31051_b[var6], var3 - PistonBlockTextures.field_31054_c[var6], var4 - PistonBlockTextures.field_31053_d[var6]);
+ if(var7 != Block.pistonBase.blockID && var7 != Block.pistonStickyBase.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ Block.blocksList[var7].onNeighborBlockChange(var1, var2 - PistonBlockTextures.field_31051_b[var6], var3 - PistonBlockTextures.field_31054_c[var6], var4 - PistonBlockTextures.field_31053_d[var6], var5);
+ }
+
+ }
+
+ public static int func_31045_b(int var0) {
+ return var0 & 7;
+ }
+}
diff --git a/src/net/minecraft/src/BlockPistonMoving.java b/src/net/minecraft/src/BlockPistonMoving.java
new file mode 100644
index 0000000..0eb02c8
--- /dev/null
+++ b/src/net/minecraft/src/BlockPistonMoving.java
@@ -0,0 +1,138 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockPistonMoving extends BlockContainer {
+ public BlockPistonMoving(int var1) {
+ super(var1, Material.piston);
+ this.setHardness(-1.0F);
+ }
+
+ protected TileEntity getBlockEntity() {
+ return null;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ TileEntity var5 = var1.getBlockTileEntity(var2, var3, var4);
+ if(var5 != null && var5 instanceof TileEntityPiston) {
+ ((TileEntityPiston)var5).clearPistonTileEntity();
+ } else {
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return false;
+ }
+
+ public boolean canPlaceBlockOnSide(World var1, int var2, int var3, int var4, int var5) {
+ return false;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(!var1.singleplayerWorld && var1.getBlockTileEntity(var2, var3, var4) == null) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return 0;
+ }
+
+ public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) {
+ if(!var1.singleplayerWorld) {
+ TileEntityPiston var7 = this.getTileEntityAtLocation(var1, var2, var3, var4);
+ if(var7 != null) {
+ Block.blocksList[var7.getStoredBlockID()].dropBlockAsItem(var1, var2, var3, var4, var7.func_31005_e());
+ }
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!var1.singleplayerWorld && var1.getBlockTileEntity(var2, var3, var4) == null) {
+ }
+
+ }
+
+ public static TileEntity getTileEntity(int var0, int var1, int var2, boolean var3, boolean var4) {
+ return new TileEntityPiston(var0, var1, var2, var3, var4);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ TileEntityPiston var5 = this.getTileEntityAtLocation(var1, var2, var3, var4);
+ if(var5 == null) {
+ return null;
+ } else {
+ float var6 = var5.func_31007_a(0.0F);
+ if(var5.func_31010_c()) {
+ var6 = 1.0F - var6;
+ }
+
+ return this.func_31032_a(var1, var2, var3, var4, var5.getStoredBlockID(), var6, var5.func_31008_d());
+ }
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ TileEntityPiston var5 = this.getTileEntityAtLocation(var1, var2, var3, var4);
+ if(var5 != null) {
+ Block var6 = Block.blocksList[var5.getStoredBlockID()];
+ if(var6 == null || var6 == this) {
+ return;
+ }
+
+ var6.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ float var7 = var5.func_31007_a(0.0F);
+ if(var5.func_31010_c()) {
+ var7 = 1.0F - var7;
+ }
+
+ int var8 = var5.func_31008_d();
+ this.minX = var6.minX - (double)((float)PistonBlockTextures.field_31051_b[var8] * var7);
+ this.minY = var6.minY - (double)((float)PistonBlockTextures.field_31054_c[var8] * var7);
+ this.minZ = var6.minZ - (double)((float)PistonBlockTextures.field_31053_d[var8] * var7);
+ this.maxX = var6.maxX - (double)((float)PistonBlockTextures.field_31051_b[var8] * var7);
+ this.maxY = var6.maxY - (double)((float)PistonBlockTextures.field_31054_c[var8] * var7);
+ this.maxZ = var6.maxZ - (double)((float)PistonBlockTextures.field_31053_d[var8] * var7);
+ }
+
+ }
+
+ public AxisAlignedBB func_31032_a(World var1, int var2, int var3, int var4, int var5, float var6, int var7) {
+ if(var5 != 0 && var5 != this.blockID) {
+ AxisAlignedBB var8 = Block.blocksList[var5].getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ if(var8 == null) {
+ return null;
+ } else {
+ var8.minX -= (double)((float)PistonBlockTextures.field_31051_b[var7] * var6);
+ var8.maxX -= (double)((float)PistonBlockTextures.field_31051_b[var7] * var6);
+ var8.minY -= (double)((float)PistonBlockTextures.field_31054_c[var7] * var6);
+ var8.maxY -= (double)((float)PistonBlockTextures.field_31054_c[var7] * var6);
+ var8.minZ -= (double)((float)PistonBlockTextures.field_31053_d[var7] * var6);
+ var8.maxZ -= (double)((float)PistonBlockTextures.field_31053_d[var7] * var6);
+ return var8;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ private TileEntityPiston getTileEntityAtLocation(IBlockAccess var1, int var2, int var3, int var4) {
+ TileEntity var5 = var1.getBlockTileEntity(var2, var3, var4);
+ return var5 != null && var5 instanceof TileEntityPiston ? (TileEntityPiston)var5 : null;
+ }
+}
diff --git a/src/net/minecraft/src/BlockPortal.java b/src/net/minecraft/src/BlockPortal.java
new file mode 100644
index 0000000..dc6c9b5
--- /dev/null
+++ b/src/net/minecraft/src/BlockPortal.java
@@ -0,0 +1,130 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockPortal extends BlockBreakable {
+ public BlockPortal(int var1, int var2) {
+ super(var1, var2, Material.portal, false);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ float var5;
+ float var6;
+ if(var1.getBlockId(var2 - 1, var3, var4) != this.blockID && var1.getBlockId(var2 + 1, var3, var4) != this.blockID) {
+ var5 = 2.0F / 16.0F;
+ var6 = 0.5F;
+ this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6);
+ } else {
+ var5 = 0.5F;
+ var6 = 2.0F / 16.0F;
+ this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6);
+ }
+
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean tryToCreatePortal(World var1, int var2, int var3, int var4) {
+ byte var5 = 0;
+ byte var6 = 0;
+ if(var1.getBlockId(var2 - 1, var3, var4) == Block.obsidian.blockID || var1.getBlockId(var2 + 1, var3, var4) == Block.obsidian.blockID) {
+ var5 = 1;
+ }
+
+ if(var1.getBlockId(var2, var3, var4 - 1) == Block.obsidian.blockID || var1.getBlockId(var2, var3, var4 + 1) == Block.obsidian.blockID) {
+ var6 = 1;
+ }
+
+ if(var5 == var6) {
+ return false;
+ } else {
+ if(var1.getBlockId(var2 - var5, var3, var4 - var6) == 0) {
+ var2 -= var5;
+ var4 -= var6;
+ }
+
+ int var7;
+ int var8;
+ for(var7 = -1; var7 <= 2; ++var7) {
+ for(var8 = -1; var8 <= 3; ++var8) {
+ boolean var9 = var7 == -1 || var7 == 2 || var8 == -1 || var8 == 3;
+ if(var7 != -1 && var7 != 2 || var8 != -1 && var8 != 3) {
+ int var10 = var1.getBlockId(var2 + var5 * var7, var3 + var8, var4 + var6 * var7);
+ if(var9) {
+ if(var10 != Block.obsidian.blockID) {
+ return false;
+ }
+ } else if(var10 != 0 && var10 != Block.fire.blockID) {
+ return false;
+ }
+ }
+ }
+ }
+
+ var1.editingBlocks = true;
+
+ for(var7 = 0; var7 < 2; ++var7) {
+ for(var8 = 0; var8 < 3; ++var8) {
+ var1.setBlockWithNotify(var2 + var5 * var7, var3 + var8, var4 + var6 * var7, Block.portal.blockID);
+ }
+ }
+
+ var1.editingBlocks = false;
+ return true;
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ byte var6 = 0;
+ byte var7 = 1;
+ if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID) {
+ var6 = 1;
+ var7 = 0;
+ }
+
+ int var8;
+ for(var8 = var3; var1.getBlockId(var2, var8 - 1, var4) == this.blockID; --var8) {
+ }
+
+ if(var1.getBlockId(var2, var8 - 1, var4) != Block.obsidian.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ int var9;
+ for(var9 = 1; var9 < 4 && var1.getBlockId(var2, var8 + var9, var4) == this.blockID; ++var9) {
+ }
+
+ if(var9 == 3 && var1.getBlockId(var2, var8 + var9, var4) == Block.obsidian.blockID) {
+ boolean var10 = var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID;
+ boolean var11 = var1.getBlockId(var2, var3, var4 - 1) == this.blockID || var1.getBlockId(var2, var3, var4 + 1) == this.blockID;
+ if(var10 && var11) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else if((var1.getBlockId(var2 + var6, var3, var4 + var7) != Block.obsidian.blockID || var1.getBlockId(var2 - var6, var3, var4 - var7) != this.blockID) && (var1.getBlockId(var2 - var6, var3, var4 - var7) != Block.obsidian.blockID || var1.getBlockId(var2 + var6, var3, var4 + var7) != this.blockID)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ } else {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ if(var5.ridingEntity == null && var5.riddenByEntity == null) {
+ var5.setInPortal();
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/BlockPressurePlate.java b/src/net/minecraft/src/BlockPressurePlate.java
new file mode 100644
index 0000000..9237285
--- /dev/null
+++ b/src/net/minecraft/src/BlockPressurePlate.java
@@ -0,0 +1,148 @@
+package net.minecraft.src;
+
+import java.util.List;
+import java.util.Random;
+
+public class BlockPressurePlate extends Block {
+ private EnumMobType triggerMobType;
+
+ protected BlockPressurePlate(int var1, int var2, EnumMobType var3, Material var4) {
+ super(var1, var2, var4);
+ this.triggerMobType = var3;
+ this.setTickOnLoad(true);
+ float var5 = 1.0F / 16.0F;
+ this.setBlockBounds(var5, 0.0F, var5, 1.0F - var5, 0.03125F, 1.0F - var5);
+ }
+
+ public int tickRate() {
+ return 20;
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2, var3 - 1, var4);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ boolean var6 = false;
+ if(!var1.isBlockNormalCube(var2, var3 - 1, var4)) {
+ var6 = true;
+ }
+
+ if(var6) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(!var1.singleplayerWorld) {
+ if(var1.getBlockMetadata(var2, var3, var4) != 0) {
+ this.setStateIfMobInteractsWithPlate(var1, var2, var3, var4);
+ }
+ }
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ if(!var1.singleplayerWorld) {
+ if(var1.getBlockMetadata(var2, var3, var4) != 1) {
+ this.setStateIfMobInteractsWithPlate(var1, var2, var3, var4);
+ }
+ }
+ }
+
+ private void setStateIfMobInteractsWithPlate(World var1, int var2, int var3, int var4) {
+ boolean var5 = var1.getBlockMetadata(var2, var3, var4) == 1;
+ boolean var6 = false;
+ float var7 = 2.0F / 16.0F;
+ List var8 = null;
+ if(this.triggerMobType == EnumMobType.everything) {
+ var8 = var1.getEntitiesWithinAABBExcludingEntity((Entity)null, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var7), (double)((float)(var2 + 1) - var7), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var7)));
+ }
+
+ if(this.triggerMobType == EnumMobType.mobs) {
+ var8 = var1.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var7), (double)((float)(var2 + 1) - var7), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var7)));
+ }
+
+ if(this.triggerMobType == EnumMobType.players) {
+ var8 = var1.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var7), (double)((float)(var2 + 1) - var7), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var7)));
+ }
+
+ if(var8.size() > 0) {
+ var6 = true;
+ }
+
+ if(var6 && !var5) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.1D, (double)var4 + 0.5D, "random.click", 0.3F, 0.6F);
+ }
+
+ if(!var6 && var5) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.1D, (double)var4 + 0.5D, "random.click", 0.3F, 0.5F);
+ }
+
+ if(var6) {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ }
+
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if(var5 > 0) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ boolean var5 = var1.getBlockMetadata(var2, var3, var4) == 1;
+ float var6 = 1.0F / 16.0F;
+ if(var5) {
+ this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 0.03125F, 1.0F - var6);
+ } else {
+ this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 1.0F / 16.0F, 1.0F - var6);
+ }
+
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return var1.getBlockMetadata(var2, var3, var4) > 0;
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return var1.getBlockMetadata(var2, var3, var4) == 0 ? false : var5 == 1;
+ }
+
+ public boolean canProvidePower() {
+ return true;
+ }
+
+ public int getMobilityFlag() {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/BlockPumpkin.java b/src/net/minecraft/src/BlockPumpkin.java
new file mode 100644
index 0000000..b65b401
--- /dev/null
+++ b/src/net/minecraft/src/BlockPumpkin.java
@@ -0,0 +1,45 @@
+package net.minecraft.src;
+
+public class BlockPumpkin extends Block {
+ private boolean blockType;
+
+ protected BlockPumpkin(int var1, int var2, boolean var3) {
+ super(var1, Material.pumpkin);
+ this.blockIndexInTexture = var2;
+ this.setTickOnLoad(true);
+ this.blockType = var3;
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ if(var1 == 1) {
+ return this.blockIndexInTexture;
+ } else if(var1 == 0) {
+ return this.blockIndexInTexture;
+ } else {
+ int var3 = this.blockIndexInTexture + 1 + 16;
+ if(this.blockType) {
+ ++var3;
+ }
+
+ return var2 == 2 && var1 == 2 ? var3 : (var2 == 3 && var1 == 5 ? var3 : (var2 == 0 && var1 == 3 ? var3 : (var2 == 1 && var1 == 4 ? var3 : this.blockIndexInTexture + 16)));
+ }
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture : (var1 == 0 ? this.blockIndexInTexture : (var1 == 3 ? this.blockIndexInTexture + 1 + 16 : this.blockIndexInTexture + 16));
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3, var4);
+ return (var5 == 0 || Block.blocksList[var5].blockMaterial.func_27090_g()) && var1.isBlockNormalCube(var2, var3 - 1, var4);
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ }
+}
diff --git a/src/net/minecraft/src/BlockRail.java b/src/net/minecraft/src/BlockRail.java
new file mode 100644
index 0000000..5da457c
--- /dev/null
+++ b/src/net/minecraft/src/BlockRail.java
@@ -0,0 +1,246 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockRail extends Block {
+ private final boolean field_27034_a;
+
+ public static final boolean func_27029_g(World var0, int var1, int var2, int var3) {
+ int var4 = var0.getBlockId(var1, var2, var3);
+ return var4 == Block.minecartTrack.blockID || var4 == Block.railPowered.blockID || var4 == Block.railDetector.blockID;
+ }
+
+ public static final boolean func_27030_c(int var0) {
+ return var0 == Block.minecartTrack.blockID || var0 == Block.railPowered.blockID || var0 == Block.railDetector.blockID;
+ }
+
+ protected BlockRail(int var1, int var2, boolean var3) {
+ super(var1, var2, Material.circuits);
+ this.field_27034_a = var3;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F);
+ }
+
+ public boolean func_27028_d() {
+ return this.field_27034_a;
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.collisionRayTrace(var1, var2, var3, var4, var5, var6);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if(var5 >= 2 && var5 <= 5) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 10.0F / 16.0F, 1.0F);
+ } else {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F);
+ }
+
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ if(this.field_27034_a) {
+ if(this.blockID == Block.railPowered.blockID && (var2 & 8) == 0) {
+ return this.blockIndexInTexture - 16;
+ }
+ } else if(var2 >= 6) {
+ return this.blockIndexInTexture - 16;
+ }
+
+ return this.blockIndexInTexture;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2, var3 - 1, var4);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(!var1.singleplayerWorld) {
+ this.func_4038_g(var1, var2, var3, var4, true);
+ }
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!var1.singleplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var6;
+ if(this.field_27034_a) {
+ var7 = var6 & 7;
+ }
+
+ boolean var8 = false;
+ if(!var1.isBlockNormalCube(var2, var3 - 1, var4)) {
+ var8 = true;
+ }
+
+ if(var7 == 2 && !var1.isBlockNormalCube(var2 + 1, var3, var4)) {
+ var8 = true;
+ }
+
+ if(var7 == 3 && !var1.isBlockNormalCube(var2 - 1, var3, var4)) {
+ var8 = true;
+ }
+
+ if(var7 == 4 && !var1.isBlockNormalCube(var2, var3, var4 - 1)) {
+ var8 = true;
+ }
+
+ if(var7 == 5 && !var1.isBlockNormalCube(var2, var3, var4 + 1)) {
+ var8 = true;
+ }
+
+ if(var8) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else if(this.blockID == Block.railPowered.blockID) {
+ boolean var9 = var1.isBlockIndirectlyGettingPowered(var2, var3, var4) || var1.isBlockIndirectlyGettingPowered(var2, var3 + 1, var4);
+ var9 = var9 || this.func_27032_a(var1, var2, var3, var4, var6, true, 0) || this.func_27032_a(var1, var2, var3, var4, var6, false, 0);
+ boolean var10 = false;
+ if(var9 && (var6 & 8) == 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 | 8);
+ var10 = true;
+ } else if(!var9 && (var6 & 8) != 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7);
+ var10 = true;
+ }
+
+ if(var10) {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ if(var7 == 2 || var7 == 3 || var7 == 4 || var7 == 5) {
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ }
+ }
+ } else if(var5 > 0 && Block.blocksList[var5].canProvidePower() && !this.field_27034_a && RailLogic.getNAdjacentTracks(new RailLogic(this, var1, var2, var3, var4)) == 3) {
+ this.func_4038_g(var1, var2, var3, var4, false);
+ }
+
+ }
+ }
+
+ private void func_4038_g(World var1, int var2, int var3, int var4, boolean var5) {
+ if(!var1.singleplayerWorld) {
+ (new RailLogic(this, var1, var2, var3, var4)).func_596_a(var1.isBlockIndirectlyGettingPowered(var2, var3, var4), var5);
+ }
+ }
+
+ private boolean func_27032_a(World var1, int var2, int var3, int var4, int var5, boolean var6, int var7) {
+ if(var7 >= 8) {
+ return false;
+ } else {
+ int var8 = var5 & 7;
+ boolean var9 = true;
+ switch(var8) {
+ case 0:
+ if(var6) {
+ ++var4;
+ } else {
+ --var4;
+ }
+ break;
+ case 1:
+ if(var6) {
+ --var2;
+ } else {
+ ++var2;
+ }
+ break;
+ case 2:
+ if(var6) {
+ --var2;
+ } else {
+ ++var2;
+ ++var3;
+ var9 = false;
+ }
+
+ var8 = 1;
+ break;
+ case 3:
+ if(var6) {
+ --var2;
+ ++var3;
+ var9 = false;
+ } else {
+ ++var2;
+ }
+
+ var8 = 1;
+ break;
+ case 4:
+ if(var6) {
+ ++var4;
+ } else {
+ --var4;
+ ++var3;
+ var9 = false;
+ }
+
+ var8 = 0;
+ break;
+ case 5:
+ if(var6) {
+ ++var4;
+ ++var3;
+ var9 = false;
+ } else {
+ --var4;
+ }
+
+ var8 = 0;
+ }
+
+ return this.func_27031_a(var1, var2, var3, var4, var6, var7, var8) ? true : var9 && this.func_27031_a(var1, var2, var3 - 1, var4, var6, var7, var8);
+ }
+ }
+
+ private boolean func_27031_a(World var1, int var2, int var3, int var4, boolean var5, int var6, int var7) {
+ int var8 = var1.getBlockId(var2, var3, var4);
+ if(var8 == Block.railPowered.blockID) {
+ int var9 = var1.getBlockMetadata(var2, var3, var4);
+ int var10 = var9 & 7;
+ if(var7 == 1 && (var10 == 0 || var10 == 4 || var10 == 5)) {
+ return false;
+ }
+
+ if(var7 == 0 && (var10 == 1 || var10 == 2 || var10 == 3)) {
+ return false;
+ }
+
+ if((var9 & 8) != 0) {
+ if(!var1.isBlockIndirectlyGettingPowered(var2, var3, var4) && !var1.isBlockIndirectlyGettingPowered(var2, var3 + 1, var4)) {
+ return this.func_27032_a(var1, var2, var3, var4, var9, var5, var6 + 1);
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public int getMobilityFlag() {
+ return 0;
+ }
+
+ static boolean func_27033_a(BlockRail var0) {
+ return var0.field_27034_a;
+ }
+}
diff --git a/src/net/minecraft/src/BlockRedstoneOre.java b/src/net/minecraft/src/BlockRedstoneOre.java
new file mode 100644
index 0000000..c78cd8f
--- /dev/null
+++ b/src/net/minecraft/src/BlockRedstoneOre.java
@@ -0,0 +1,97 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockRedstoneOre extends Block {
+ private boolean field_665_a;
+
+ public BlockRedstoneOre(int var1, int var2, boolean var3) {
+ super(var1, var2, Material.rock);
+ if(var3) {
+ this.setTickOnLoad(true);
+ }
+
+ this.field_665_a = var3;
+ }
+
+ public int tickRate() {
+ return 30;
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.func_321_g(var1, var2, var3, var4);
+ super.onBlockClicked(var1, var2, var3, var4, var5);
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ this.func_321_g(var1, var2, var3, var4);
+ super.onEntityWalking(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.func_321_g(var1, var2, var3, var4);
+ return super.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ private void func_321_g(World var1, int var2, int var3, int var4) {
+ this.func_320_h(var1, var2, var3, var4);
+ if(this.blockID == Block.oreRedstone.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.oreRedstoneGlowing.blockID);
+ }
+
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(this.blockID == Block.oreRedstoneGlowing.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.oreRedstone.blockID);
+ }
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.redstone.shiftedIndex;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 4 + var1.nextInt(2);
+ }
+
+ private void func_320_h(World var1, int var2, int var3, int var4) {
+ Random var5 = var1.rand;
+ double var6 = 1.0D / 16.0D;
+
+ for(int var8 = 0; var8 < 6; ++var8) {
+ double var9 = (double)((float)var2 + var5.nextFloat());
+ double var11 = (double)((float)var3 + var5.nextFloat());
+ double var13 = (double)((float)var4 + var5.nextFloat());
+ if(var8 == 0 && !var1.isBlockOpaqueCube(var2, var3 + 1, var4)) {
+ var11 = (double)(var3 + 1) + var6;
+ }
+
+ if(var8 == 1 && !var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var11 = (double)(var3 + 0) - var6;
+ }
+
+ if(var8 == 2 && !var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var13 = (double)(var4 + 1) + var6;
+ }
+
+ if(var8 == 3 && !var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var13 = (double)(var4 + 0) - var6;
+ }
+
+ if(var8 == 4 && !var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var9 = (double)(var2 + 1) + var6;
+ }
+
+ if(var8 == 5 && !var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var9 = (double)(var2 + 0) - var6;
+ }
+
+ if(var9 < (double)var2 || var9 > (double)(var2 + 1) || var11 < 0.0D || var11 > (double)(var3 + 1) || var13 < (double)var4 || var13 > (double)(var4 + 1)) {
+ var1.spawnParticle("reddust", var9, var11, var13, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/BlockRedstoneRepeater.java b/src/net/minecraft/src/BlockRedstoneRepeater.java
new file mode 100644
index 0000000..0cfd15b
--- /dev/null
+++ b/src/net/minecraft/src/BlockRedstoneRepeater.java
@@ -0,0 +1,135 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockRedstoneRepeater extends Block {
+ public static final double[] field_22014_a = new double[]{-0.0625D, 1.0D / 16.0D, 0.1875D, 0.3125D};
+ private static final int[] field_22013_b = new int[]{1, 2, 3, 4};
+ private final boolean field_22015_c;
+
+ protected BlockRedstoneRepeater(int var1, boolean var2) {
+ super(var1, 6, Material.circuits);
+ this.field_22015_c = var2;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F);
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return !var1.isBlockNormalCube(var2, var3 - 1, var4) ? false : super.canPlaceBlockAt(var1, var2, var3, var4);
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return !var1.isBlockNormalCube(var2, var3 - 1, var4) ? false : super.canBlockStay(var1, var2, var3, var4);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = this.func_22012_g(var1, var2, var3, var4, var6);
+ if(this.field_22015_c && !var7) {
+ var1.setBlockAndMetadataWithNotify(var2, var3, var4, Block.redstoneRepeaterIdle.blockID, var6);
+ } else if(!this.field_22015_c) {
+ var1.setBlockAndMetadataWithNotify(var2, var3, var4, Block.redstoneRepeaterActive.blockID, var6);
+ if(!var7) {
+ int var8 = (var6 & 12) >> 2;
+ var1.scheduleUpdateTick(var2, var3, var4, Block.redstoneRepeaterActive.blockID, field_22013_b[var8] * 2);
+ }
+ }
+
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var1 == 0 ? (this.field_22015_c ? 99 : 115) : (var1 == 1 ? (this.field_22015_c ? 147 : 131) : 5);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.getBlockTextureFromSideAndMetadata(var1, 0);
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return this.isPoweringTo(var1, var2, var3, var4, var5);
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ if(!this.field_22015_c) {
+ return false;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4) & 3;
+ return var6 == 0 && var5 == 3 ? true : (var6 == 1 && var5 == 4 ? true : (var6 == 2 && var5 == 2 ? true : var6 == 3 && var5 == 5));
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!this.canBlockStay(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = this.func_22012_g(var1, var2, var3, var4, var6);
+ int var8 = (var6 & 12) >> 2;
+ if(this.field_22015_c && !var7) {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, field_22013_b[var8] * 2);
+ } else if(!this.field_22015_c && var7) {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, field_22013_b[var8] * 2);
+ }
+
+ }
+ }
+
+ private boolean func_22012_g(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var5 & 3;
+ switch(var6) {
+ case 0:
+ return var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 + 1, 3) || var1.getBlockId(var2, var3, var4 + 1) == Block.redstoneWire.blockID && var1.getBlockMetadata(var2, var3, var4 + 1) > 0;
+ case 1:
+ return var1.isBlockIndirectlyProvidingPowerTo(var2 - 1, var3, var4, 4) || var1.getBlockId(var2 - 1, var3, var4) == Block.redstoneWire.blockID && var1.getBlockMetadata(var2 - 1, var3, var4) > 0;
+ case 2:
+ return var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 - 1, 2) || var1.getBlockId(var2, var3, var4 - 1) == Block.redstoneWire.blockID && var1.getBlockMetadata(var2, var3, var4 - 1) > 0;
+ case 3:
+ return var1.isBlockIndirectlyProvidingPowerTo(var2 + 1, var3, var4, 5) || var1.getBlockId(var2 + 1, var3, var4) == Block.redstoneWire.blockID && var1.getBlockMetadata(var2 + 1, var3, var4) > 0;
+ default:
+ return false;
+ }
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = (var6 & 12) >> 2;
+ var7 = var7 + 1 << 2 & 12;
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 | var6 & 3);
+ return true;
+ }
+
+ public boolean canProvidePower() {
+ return false;
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ int var6 = ((MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3) + 2) % 4;
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ boolean var7 = this.func_22012_g(var1, var2, var3, var4, var6);
+ if(var7) {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, 1);
+ }
+
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.redstoneRepeater.shiftedIndex;
+ }
+}
diff --git a/src/net/minecraft/src/BlockRedstoneTorch.java b/src/net/minecraft/src/BlockRedstoneTorch.java
new file mode 100644
index 0000000..79f5ca0
--- /dev/null
+++ b/src/net/minecraft/src/BlockRedstoneTorch.java
@@ -0,0 +1,130 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class BlockRedstoneTorch extends BlockTorch {
+ private boolean torchActive = false;
+ private static List torchUpdates = new ArrayList();
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var1 == 1 ? Block.redstoneWire.getBlockTextureFromSideAndMetadata(var1, var2) : super.getBlockTextureFromSideAndMetadata(var1, var2);
+ }
+
+ private boolean checkForBurnout(World var1, int var2, int var3, int var4, boolean var5) {
+ if(var5) {
+ torchUpdates.add(new RedstoneUpdateInfo(var2, var3, var4, var1.getWorldTime()));
+ }
+
+ int var6 = 0;
+
+ for(int var7 = 0; var7 < torchUpdates.size(); ++var7) {
+ RedstoneUpdateInfo var8 = (RedstoneUpdateInfo)torchUpdates.get(var7);
+ if(var8.x == var2 && var8.y == var3 && var8.z == var4) {
+ ++var6;
+ if(var6 >= 8) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ protected BlockRedstoneTorch(int var1, int var2, boolean var3) {
+ super(var1, var2);
+ this.torchActive = var3;
+ this.setTickOnLoad(true);
+ }
+
+ public int tickRate() {
+ return 2;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockMetadata(var2, var3, var4) == 0) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ if(this.torchActive) {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ }
+
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ if(this.torchActive) {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ }
+
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ if(!this.torchActive) {
+ return false;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ return var6 == 5 && var5 == 1 ? false : (var6 == 3 && var5 == 3 ? false : (var6 == 4 && var5 == 2 ? false : (var6 == 1 && var5 == 5 ? false : var6 != 2 || var5 != 4)));
+ }
+ }
+
+ private boolean func_30003_g(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ return var5 == 5 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3 - 1, var4, 0) ? true : (var5 == 3 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 - 1, 2) ? true : (var5 == 4 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 + 1, 3) ? true : (var5 == 1 && var1.isBlockIndirectlyProvidingPowerTo(var2 - 1, var3, var4, 4) ? true : var5 == 2 && var1.isBlockIndirectlyProvidingPowerTo(var2 + 1, var3, var4, 5))));
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ boolean var6 = this.func_30003_g(var1, var2, var3, var4);
+
+ while(torchUpdates.size() > 0 && var1.getWorldTime() - ((RedstoneUpdateInfo)torchUpdates.get(0)).updateTime > 100L) {
+ torchUpdates.remove(0);
+ }
+
+ if(this.torchActive) {
+ if(var6) {
+ var1.setBlockAndMetadataWithNotify(var2, var3, var4, Block.torchRedstoneIdle.blockID, var1.getBlockMetadata(var2, var3, var4));
+ if(this.checkForBurnout(var1, var2, var3, var4, true)) {
+ var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "random.fizz", 0.5F, 2.6F + (var1.rand.nextFloat() - var1.rand.nextFloat()) * 0.8F);
+
+ for(int var7 = 0; var7 < 5; ++var7) {
+ double var8 = (double)var2 + var5.nextDouble() * 0.6D + 0.2D;
+ double var10 = (double)var3 + var5.nextDouble() * 0.6D + 0.2D;
+ double var12 = (double)var4 + var5.nextDouble() * 0.6D + 0.2D;
+ var1.spawnParticle("smoke", var8, var10, var12, 0.0D, 0.0D, 0.0D);
+ }
+ }
+ }
+ } else if(!var6 && !this.checkForBurnout(var1, var2, var3, var4, false)) {
+ var1.setBlockAndMetadataWithNotify(var2, var3, var4, Block.torchRedstoneActive.blockID, var1.getBlockMetadata(var2, var3, var4));
+ }
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return var5 == 0 ? this.isPoweringTo(var1, var2, var3, var4, var5) : false;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.torchRedstoneActive.blockID;
+ }
+
+ public boolean canProvidePower() {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/BlockRedstoneWire.java b/src/net/minecraft/src/BlockRedstoneWire.java
new file mode 100644
index 0000000..ad1b873
--- /dev/null
+++ b/src/net/minecraft/src/BlockRedstoneWire.java
@@ -0,0 +1,336 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
+
+public class BlockRedstoneWire extends Block {
+ private boolean wiresProvidePower = true;
+ private Set field_21032_b = new HashSet();
+
+ public BlockRedstoneWire(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F / 16.0F, 1.0F);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return this.blockIndexInTexture;
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2, var3 - 1, var4);
+ }
+
+ private void updateAndPropagateCurrentStrength(World var1, int var2, int var3, int var4) {
+ this.func_21031_a(var1, var2, var3, var4, var2, var3, var4);
+ ArrayList var5 = new ArrayList(this.field_21032_b);
+ this.field_21032_b.clear();
+
+ for(int var6 = 0; var6 < var5.size(); ++var6) {
+ ChunkPosition var7 = (ChunkPosition)var5.get(var6);
+ var1.notifyBlocksOfNeighborChange(var7.x, var7.y, var7.z, this.blockID);
+ }
+
+ }
+
+ private void func_21031_a(World var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ int var8 = var1.getBlockMetadata(var2, var3, var4);
+ int var9 = 0;
+ this.wiresProvidePower = false;
+ boolean var10 = var1.isBlockIndirectlyGettingPowered(var2, var3, var4);
+ this.wiresProvidePower = true;
+ int var11;
+ int var12;
+ int var13;
+ if(var10) {
+ var9 = 15;
+ } else {
+ for(var11 = 0; var11 < 4; ++var11) {
+ var12 = var2;
+ var13 = var4;
+ if(var11 == 0) {
+ var12 = var2 - 1;
+ }
+
+ if(var11 == 1) {
+ ++var12;
+ }
+
+ if(var11 == 2) {
+ var13 = var4 - 1;
+ }
+
+ if(var11 == 3) {
+ ++var13;
+ }
+
+ if(var12 != var5 || var3 != var6 || var13 != var7) {
+ var9 = this.getMaxCurrentStrength(var1, var12, var3, var13, var9);
+ }
+
+ if(var1.isBlockNormalCube(var12, var3, var13) && !var1.isBlockNormalCube(var2, var3 + 1, var4)) {
+ if(var12 != var5 || var3 + 1 != var6 || var13 != var7) {
+ var9 = this.getMaxCurrentStrength(var1, var12, var3 + 1, var13, var9);
+ }
+ } else if(!var1.isBlockNormalCube(var12, var3, var13) && (var12 != var5 || var3 - 1 != var6 || var13 != var7)) {
+ var9 = this.getMaxCurrentStrength(var1, var12, var3 - 1, var13, var9);
+ }
+ }
+
+ if(var9 > 0) {
+ --var9;
+ } else {
+ var9 = 0;
+ }
+ }
+
+ if(var8 != var9) {
+ var1.editingBlocks = true;
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var9);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ var1.editingBlocks = false;
+
+ for(var11 = 0; var11 < 4; ++var11) {
+ var12 = var2;
+ var13 = var4;
+ int var14 = var3 - 1;
+ if(var11 == 0) {
+ var12 = var2 - 1;
+ }
+
+ if(var11 == 1) {
+ ++var12;
+ }
+
+ if(var11 == 2) {
+ var13 = var4 - 1;
+ }
+
+ if(var11 == 3) {
+ ++var13;
+ }
+
+ if(var1.isBlockNormalCube(var12, var3, var13)) {
+ var14 += 2;
+ }
+
+ boolean var15 = false;
+ int var16 = this.getMaxCurrentStrength(var1, var12, var3, var13, -1);
+ var9 = var1.getBlockMetadata(var2, var3, var4);
+ if(var9 > 0) {
+ --var9;
+ }
+
+ if(var16 >= 0 && var16 != var9) {
+ this.func_21031_a(var1, var12, var3, var13, var2, var3, var4);
+ }
+
+ var16 = this.getMaxCurrentStrength(var1, var12, var14, var13, -1);
+ var9 = var1.getBlockMetadata(var2, var3, var4);
+ if(var9 > 0) {
+ --var9;
+ }
+
+ if(var16 >= 0 && var16 != var9) {
+ this.func_21031_a(var1, var12, var14, var13, var2, var3, var4);
+ }
+ }
+
+ if(var8 == 0 || var9 == 0) {
+ this.field_21032_b.add(new ChunkPosition(var2, var3, var4));
+ this.field_21032_b.add(new ChunkPosition(var2 - 1, var3, var4));
+ this.field_21032_b.add(new ChunkPosition(var2 + 1, var3, var4));
+ this.field_21032_b.add(new ChunkPosition(var2, var3 - 1, var4));
+ this.field_21032_b.add(new ChunkPosition(var2, var3 + 1, var4));
+ this.field_21032_b.add(new ChunkPosition(var2, var3, var4 - 1));
+ this.field_21032_b.add(new ChunkPosition(var2, var3, var4 + 1));
+ }
+ }
+
+ }
+
+ private void notifyWireNeighborsOfNeighborChange(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ }
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ if(!var1.singleplayerWorld) {
+ this.updateAndPropagateCurrentStrength(var1, var2, var3, var4);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 - 1);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 + 1);
+ if(var1.isBlockNormalCube(var2 - 1, var3, var4)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 + 1, var4);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 - 1, var4);
+ }
+
+ if(var1.isBlockNormalCube(var2 + 1, var3, var4)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 + 1, var4);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 - 1, var4);
+ }
+
+ if(var1.isBlockNormalCube(var2, var3, var4 - 1)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 - 1);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 - 1);
+ }
+
+ if(var1.isBlockNormalCube(var2, var3, var4 + 1)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 + 1);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 + 1);
+ }
+
+ }
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ super.onBlockRemoval(var1, var2, var3, var4);
+ if(!var1.singleplayerWorld) {
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ this.updateAndPropagateCurrentStrength(var1, var2, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 - 1);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 + 1);
+ if(var1.isBlockNormalCube(var2 - 1, var3, var4)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 + 1, var4);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 - 1, var4);
+ }
+
+ if(var1.isBlockNormalCube(var2 + 1, var3, var4)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 + 1, var4);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 - 1, var4);
+ }
+
+ if(var1.isBlockNormalCube(var2, var3, var4 - 1)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 - 1);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 - 1);
+ }
+
+ if(var1.isBlockNormalCube(var2, var3, var4 + 1)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 + 1);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 + 1);
+ }
+
+ }
+ }
+
+ private int getMaxCurrentStrength(World var1, int var2, int var3, int var4, int var5) {
+ if(var1.getBlockId(var2, var3, var4) != this.blockID) {
+ return var5;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ return var6 > var5 ? var6 : var5;
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!var1.singleplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = this.canPlaceBlockAt(var1, var2, var3, var4);
+ if(!var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var6);
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ this.updateAndPropagateCurrentStrength(var1, var2, var3, var4);
+ }
+
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ }
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.redstone.shiftedIndex;
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return !this.wiresProvidePower ? false : this.isPoweringTo(var1, var2, var3, var4, var5);
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ if(!this.wiresProvidePower) {
+ return false;
+ } else if(var1.getBlockMetadata(var2, var3, var4) == 0) {
+ return false;
+ } else if(var5 == 1) {
+ return true;
+ } else {
+ boolean var6 = isPowerProviderOrWire(var1, var2 - 1, var3, var4, 1) || !var1.isBlockNormalCube(var2 - 1, var3, var4) && isPowerProviderOrWire(var1, var2 - 1, var3 - 1, var4, -1);
+ boolean var7 = isPowerProviderOrWire(var1, var2 + 1, var3, var4, 3) || !var1.isBlockNormalCube(var2 + 1, var3, var4) && isPowerProviderOrWire(var1, var2 + 1, var3 - 1, var4, -1);
+ boolean var8 = isPowerProviderOrWire(var1, var2, var3, var4 - 1, 2) || !var1.isBlockNormalCube(var2, var3, var4 - 1) && isPowerProviderOrWire(var1, var2, var3 - 1, var4 - 1, -1);
+ boolean var9 = isPowerProviderOrWire(var1, var2, var3, var4 + 1, 0) || !var1.isBlockNormalCube(var2, var3, var4 + 1) && isPowerProviderOrWire(var1, var2, var3 - 1, var4 + 1, -1);
+ if(!var1.isBlockNormalCube(var2, var3 + 1, var4)) {
+ if(var1.isBlockNormalCube(var2 - 1, var3, var4) && isPowerProviderOrWire(var1, var2 - 1, var3 + 1, var4, -1)) {
+ var6 = true;
+ }
+
+ if(var1.isBlockNormalCube(var2 + 1, var3, var4) && isPowerProviderOrWire(var1, var2 + 1, var3 + 1, var4, -1)) {
+ var7 = true;
+ }
+
+ if(var1.isBlockNormalCube(var2, var3, var4 - 1) && isPowerProviderOrWire(var1, var2, var3 + 1, var4 - 1, -1)) {
+ var8 = true;
+ }
+
+ if(var1.isBlockNormalCube(var2, var3, var4 + 1) && isPowerProviderOrWire(var1, var2, var3 + 1, var4 + 1, -1)) {
+ var9 = true;
+ }
+ }
+
+ return !var8 && !var7 && !var6 && !var9 && var5 >= 2 && var5 <= 5 ? true : (var5 == 2 && var8 && !var6 && !var7 ? true : (var5 == 3 && var9 && !var6 && !var7 ? true : (var5 == 4 && var6 && !var8 && !var9 ? true : var5 == 5 && var7 && !var8 && !var9)));
+ }
+ }
+
+ public boolean canProvidePower() {
+ return this.wiresProvidePower;
+ }
+
+ public static boolean isPowerProviderOrWire(IBlockAccess var0, int var1, int var2, int var3, int var4) {
+ int var5 = var0.getBlockId(var1, var2, var3);
+ if(var5 == Block.redstoneWire.blockID) {
+ return true;
+ } else if(var5 == 0) {
+ return false;
+ } else if(Block.blocksList[var5].canProvidePower()) {
+ return true;
+ } else if(var5 != Block.redstoneRepeaterIdle.blockID && var5 != Block.redstoneRepeaterActive.blockID) {
+ return false;
+ } else {
+ int var6 = var0.getBlockMetadata(var1, var2, var3);
+ return var4 == ModelBed.field_22153_b[var6 & 3];
+ }
+ }
+}
diff --git a/src/net/minecraft/src/BlockReed.java b/src/net/minecraft/src/BlockReed.java
new file mode 100644
index 0000000..9a38b29
--- /dev/null
+++ b/src/net/minecraft/src/BlockReed.java
@@ -0,0 +1,69 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockReed extends Block {
+ protected BlockReed(int var1, int var2) {
+ super(var1, Material.plants);
+ this.blockIndexInTexture = var2;
+ float var3 = 6.0F / 16.0F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 1.0F, 0.5F + var3);
+ this.setTickOnLoad(true);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.isAirBlock(var2, var3 + 1, var4)) {
+ int var6;
+ for(var6 = 1; var1.getBlockId(var2, var3 - var6, var4) == this.blockID; ++var6) {
+ }
+
+ if(var6 < 3) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ if(var7 == 15) {
+ var1.setBlockWithNotify(var2, var3 + 1, var4, this.blockID);
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + 1);
+ }
+ }
+ }
+
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3 - 1, var4);
+ return var5 == this.blockID ? true : (var5 != Block.grass.blockID && var5 != Block.dirt.blockID ? false : (var1.getBlockMaterial(var2 - 1, var3 - 1, var4) == Material.water ? true : (var1.getBlockMaterial(var2 + 1, var3 - 1, var4) == Material.water ? true : (var1.getBlockMaterial(var2, var3 - 1, var4 - 1) == Material.water ? true : var1.getBlockMaterial(var2, var3 - 1, var4 + 1) == Material.water))));
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ this.checkBlockCoordValid(var1, var2, var3, var4);
+ }
+
+ protected final void checkBlockCoordValid(World var1, int var2, int var3, int var4) {
+ if(!this.canBlockStay(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return this.canPlaceBlockAt(var1, var2, var3, var4);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.reed.shiftedIndex;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/BlockSand.java b/src/net/minecraft/src/BlockSand.java
new file mode 100644
index 0000000..2c82950
--- /dev/null
+++ b/src/net/minecraft/src/BlockSand.java
@@ -0,0 +1,60 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSand extends Block {
+ public static boolean fallInstantly = false;
+
+ public BlockSand(int var1, int var2) {
+ super(var1, var2, Material.sand);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID, this.tickRate());
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ this.tryToFall(var1, var2, var3, var4);
+ }
+
+ private void tryToFall(World var1, int var2, int var3, int var4) {
+ if(canFallBelow(var1, var2, var3 - 1, var4) && var3 >= 0) {
+ byte var8 = 32;
+ if(!fallInstantly && var1.checkChunksExist(var2 - var8, var3 - var8, var4 - var8, var2 + var8, var3 + var8, var4 + var8)) {
+ EntityFallingSand var9 = new EntityFallingSand(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), this.blockID);
+ var1.entityJoinedWorld(var9);
+ } else {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+
+ while(canFallBelow(var1, var2, var3 - 1, var4) && var3 > 0) {
+ --var3;
+ }
+
+ if(var3 > 0) {
+ var1.setBlockWithNotify(var2, var3, var4, this.blockID);
+ }
+ }
+ }
+
+ }
+
+ public int tickRate() {
+ return 3;
+ }
+
+ public static boolean canFallBelow(World var0, int var1, int var2, int var3) {
+ int var4 = var0.getBlockId(var1, var2, var3);
+ if(var4 == 0) {
+ return true;
+ } else if(var4 == Block.fire.blockID) {
+ return true;
+ } else {
+ Material var5 = Block.blocksList[var4].blockMaterial;
+ return var5 == Material.water ? true : var5 == Material.lava;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/BlockSandStone.java b/src/net/minecraft/src/BlockSandStone.java
new file mode 100644
index 0000000..69cd0e2
--- /dev/null
+++ b/src/net/minecraft/src/BlockSandStone.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public class BlockSandStone extends Block {
+ public BlockSandStone(int var1) {
+ super(var1, 192, Material.rock);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture - 16 : (var1 == 0 ? this.blockIndexInTexture + 16 : this.blockIndexInTexture);
+ }
+}
diff --git a/src/net/minecraft/src/BlockSapling.java b/src/net/minecraft/src/BlockSapling.java
new file mode 100644
index 0000000..1e1716f
--- /dev/null
+++ b/src/net/minecraft/src/BlockSapling.java
@@ -0,0 +1,56 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSapling extends BlockFlower {
+ protected BlockSapling(int var1, int var2) {
+ super(var1, var2);
+ float var3 = 0.4F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 2.0F, 0.5F + var3);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(!var1.singleplayerWorld) {
+ super.updateTick(var1, var2, var3, var4, var5);
+ if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9 && var5.nextInt(30) == 0) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) == 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 | 8);
+ } else {
+ this.growTree(var1, var2, var3, var4, var5);
+ }
+ }
+
+ }
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ var2 &= 3;
+ return var2 == 1 ? 63 : (var2 == 2 ? 79 : super.getBlockTextureFromSideAndMetadata(var1, var2));
+ }
+
+ public void growTree(World var1, int var2, int var3, int var4, Random var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4) & 3;
+ var1.setBlock(var2, var3, var4, 0);
+ Object var7 = null;
+ if(var6 == 1) {
+ var7 = new WorldGenTaiga2();
+ } else if(var6 == 2) {
+ var7 = new WorldGenForest();
+ } else {
+ var7 = new WorldGenTrees();
+ if(var5.nextInt(10) == 0) {
+ var7 = new WorldGenBigTree();
+ }
+ }
+
+ if(!((WorldGenerator)var7).generate(var1, var5, var2, var3, var4)) {
+ var1.setBlockAndMetadata(var2, var3, var4, this.blockID, var6);
+ }
+
+ }
+
+ protected int damageDropped(int var1) {
+ return var1 & 3;
+ }
+}
diff --git a/src/net/minecraft/src/BlockSign.java b/src/net/minecraft/src/BlockSign.java
new file mode 100644
index 0000000..066fb32
--- /dev/null
+++ b/src/net/minecraft/src/BlockSign.java
@@ -0,0 +1,104 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSign extends BlockContainer {
+ private Class signEntityClass;
+ private boolean isFreestanding;
+
+ protected BlockSign(int var1, Class var2, boolean var3) {
+ super(var1, Material.wood);
+ this.isFreestanding = var3;
+ this.blockIndexInTexture = 4;
+ this.signEntityClass = var2;
+ float var4 = 0.25F;
+ float var5 = 1.0F;
+ this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var5, 0.5F + var4);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ if(!this.isFreestanding) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ float var6 = 9.0F / 32.0F;
+ float var7 = 25.0F / 32.0F;
+ float var8 = 0.0F;
+ float var9 = 1.0F;
+ float var10 = 2.0F / 16.0F;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ if(var5 == 2) {
+ this.setBlockBounds(var8, var6, 1.0F - var10, var9, var7, 1.0F);
+ }
+
+ if(var5 == 3) {
+ this.setBlockBounds(var8, var6, 0.0F, var9, var7, var10);
+ }
+
+ if(var5 == 4) {
+ this.setBlockBounds(1.0F - var10, var6, var8, 1.0F, var7, var9);
+ }
+
+ if(var5 == 5) {
+ this.setBlockBounds(0.0F, var6, var8, var10, var7, var9);
+ }
+
+ }
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ protected TileEntity getBlockEntity() {
+ try {
+ return (TileEntity)this.signEntityClass.newInstance();
+ } catch (Exception var2) {
+ throw new RuntimeException(var2);
+ }
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.sign.shiftedIndex;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ boolean var6 = false;
+ if(this.isFreestanding) {
+ if(!var1.getBlockMaterial(var2, var3 - 1, var4).isSolid()) {
+ var6 = true;
+ }
+ } else {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ var6 = true;
+ if(var7 == 2 && var1.getBlockMaterial(var2, var3, var4 + 1).isSolid()) {
+ var6 = false;
+ }
+
+ if(var7 == 3 && var1.getBlockMaterial(var2, var3, var4 - 1).isSolid()) {
+ var6 = false;
+ }
+
+ if(var7 == 4 && var1.getBlockMaterial(var2 + 1, var3, var4).isSolid()) {
+ var6 = false;
+ }
+
+ if(var7 == 5 && var1.getBlockMaterial(var2 - 1, var3, var4).isSolid()) {
+ var6 = false;
+ }
+ }
+
+ if(var6) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ }
+}
diff --git a/src/net/minecraft/src/BlockSnow.java b/src/net/minecraft/src/BlockSnow.java
new file mode 100644
index 0000000..bc5f035
--- /dev/null
+++ b/src/net/minecraft/src/BlockSnow.java
@@ -0,0 +1,78 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSnow extends Block {
+ protected BlockSnow(int var1, int var2) {
+ super(var1, var2, Material.snow);
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F);
+ this.setTickOnLoad(true);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ return var5 >= 3 ? AxisAlignedBB.getBoundingBoxFromPool((double)var2 + this.minX, (double)var3 + this.minY, (double)var4 + this.minZ, (double)var2 + this.maxX, (double)((float)var3 + 0.5F), (double)var4 + this.maxZ) : null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ float var6 = (float)(2 * (1 + var5)) / 16.0F;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, var6, 1.0F);
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3 - 1, var4);
+ return var5 != 0 && Block.blocksList[var5].isOpaqueCube() ? var1.getBlockMaterial(var2, var3 - 1, var4).getIsSolid() : false;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ this.func_275_g(var1, var2, var3, var4);
+ }
+
+ private boolean func_275_g(World var1, int var2, int var3, int var4) {
+ if(!this.canPlaceBlockAt(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public void harvestBlock(World var1, EntityPlayer var2, int var3, int var4, int var5, int var6) {
+ int var7 = Item.snowball.shiftedIndex;
+ float var8 = 0.7F;
+ double var9 = (double)(var1.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D;
+ double var11 = (double)(var1.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D;
+ double var13 = (double)(var1.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D;
+ EntityItem var15 = new EntityItem(var1, (double)var3 + var9, (double)var4 + var11, (double)var5 + var13, new ItemStack(var7, 1, 0));
+ var15.delayBeforeCanPickup = 10;
+ var1.entityJoinedWorld(var15);
+ var1.setBlockWithNotify(var3, var4, var5, 0);
+ var2.addStat(StatList.mineBlockStatArray[this.blockID], 1);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.snowball.shiftedIndex;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getSavedLightValue(EnumSkyBlock.Block, var2, var3, var4) > 11) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/BlockSnowBlock.java b/src/net/minecraft/src/BlockSnowBlock.java
new file mode 100644
index 0000000..0e1275b
--- /dev/null
+++ b/src/net/minecraft/src/BlockSnowBlock.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSnowBlock extends Block {
+ protected BlockSnowBlock(int var1, int var2) {
+ super(var1, var2, Material.builtSnow);
+ this.setTickOnLoad(true);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.snowball.shiftedIndex;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 4;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getSavedLightValue(EnumSkyBlock.Block, var2, var3, var4) > 11) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/BlockSoulSand.java b/src/net/minecraft/src/BlockSoulSand.java
new file mode 100644
index 0000000..4b2fe01
--- /dev/null
+++ b/src/net/minecraft/src/BlockSoulSand.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class BlockSoulSand extends Block {
+ public BlockSoulSand(int var1, int var2) {
+ super(var1, var2, Material.sand);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ float var5 = 2.0F / 16.0F;
+ return AxisAlignedBB.getBoundingBoxFromPool((double)var2, (double)var3, (double)var4, (double)(var2 + 1), (double)((float)(var3 + 1) - var5), (double)(var4 + 1));
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ var5.motionX *= 0.4D;
+ var5.motionZ *= 0.4D;
+ }
+}
diff --git a/src/net/minecraft/src/BlockSponge.java b/src/net/minecraft/src/BlockSponge.java
new file mode 100644
index 0000000..d8a441d
--- /dev/null
+++ b/src/net/minecraft/src/BlockSponge.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+public class BlockSponge extends Block {
+ protected BlockSponge(int var1) {
+ super(var1, Material.sponge);
+ this.blockIndexInTexture = 48;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ byte var5 = 2;
+
+ for(int var6 = var2 - var5; var6 <= var2 + var5; ++var6) {
+ for(int var7 = var3 - var5; var7 <= var3 + var5; ++var7) {
+ for(int var8 = var4 - var5; var8 <= var4 + var5; ++var8) {
+ if(var1.getBlockMaterial(var6, var7, var8) == Material.water) {
+ }
+ }
+ }
+ }
+
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ byte var5 = 2;
+
+ for(int var6 = var2 - var5; var6 <= var2 + var5; ++var6) {
+ for(int var7 = var3 - var5; var7 <= var3 + var5; ++var7) {
+ for(int var8 = var4 - var5; var8 <= var4 + var5; ++var8) {
+ var1.notifyBlocksOfNeighborChange(var6, var7, var8, var1.getBlockId(var6, var7, var8));
+ }
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/BlockStairs.java b/src/net/minecraft/src/BlockStairs.java
new file mode 100644
index 0000000..cab8167
--- /dev/null
+++ b/src/net/minecraft/src/BlockStairs.java
@@ -0,0 +1,157 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+public class BlockStairs extends Block {
+ private Block modelBlock;
+
+ protected BlockStairs(int var1, Block var2) {
+ super(var1, var2.blockIndexInTexture, var2.blockMaterial);
+ this.modelBlock = var2;
+ this.setHardness(var2.blockHardness);
+ this.setResistance(var2.blockResistance / 3.0F);
+ this.setStepSound(var2.stepSound);
+ this.setLightOpacity(255);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ if(var7 == 0) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 0.5F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ } else if(var7 == 1) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ } else if(var7 == 2) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 0.5F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ } else if(var7 == 3) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.5F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 0.5F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ }
+
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.modelBlock.onBlockClicked(var1, var2, var3, var4, var5);
+ }
+
+ public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) {
+ this.modelBlock.onBlockDestroyedByPlayer(var1, var2, var3, var4, var5);
+ }
+
+ public float getExplosionResistance(Entity var1) {
+ return this.modelBlock.getExplosionResistance(var1);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return this.modelBlock.idDropped(var1, var2);
+ }
+
+ public int quantityDropped(Random var1) {
+ return this.modelBlock.quantityDropped(var1);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return this.modelBlock.getBlockTextureFromSideAndMetadata(var1, var2);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.modelBlock.getBlockTextureFromSide(var1);
+ }
+
+ public int tickRate() {
+ return this.modelBlock.tickRate();
+ }
+
+ public void velocityToAddToEntity(World var1, int var2, int var3, int var4, Entity var5, Vec3D var6) {
+ this.modelBlock.velocityToAddToEntity(var1, var2, var3, var4, var5, var6);
+ }
+
+ public boolean isCollidable() {
+ return this.modelBlock.isCollidable();
+ }
+
+ public boolean canCollideCheck(int var1, boolean var2) {
+ return this.modelBlock.canCollideCheck(var1, var2);
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return this.modelBlock.canPlaceBlockAt(var1, var2, var3, var4);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ this.onNeighborBlockChange(var1, var2, var3, var4, 0);
+ this.modelBlock.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ this.modelBlock.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) {
+ this.modelBlock.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, var6);
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ this.modelBlock.onEntityWalking(var1, var2, var3, var4, var5);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ this.modelBlock.updateTick(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ return this.modelBlock.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ public void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) {
+ this.modelBlock.onBlockDestroyedByExplosion(var1, var2, var3, var4);
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+ if(var6 == 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 2);
+ }
+
+ if(var6 == 1) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ }
+
+ if(var6 == 2) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 3);
+ }
+
+ if(var6 == 3) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/BlockStationary.java b/src/net/minecraft/src/BlockStationary.java
new file mode 100644
index 0000000..9e63607
--- /dev/null
+++ b/src/net/minecraft/src/BlockStationary.java
@@ -0,0 +1,57 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockStationary extends BlockFluid {
+ protected BlockStationary(int var1, Material var2) {
+ super(var1, var2);
+ this.setTickOnLoad(false);
+ if(var2 == Material.lava) {
+ this.setTickOnLoad(true);
+ }
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ this.func_30005_i(var1, var2, var3, var4);
+ }
+
+ }
+
+ private void func_30005_i(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ var1.editingBlocks = true;
+ var1.setBlockAndMetadata(var2, var3, var4, this.blockID - 1, var5);
+ var1.markBlocksDirty(var2, var3, var4, var2, var3, var4);
+ var1.scheduleUpdateTick(var2, var3, var4, this.blockID - 1, this.tickRate());
+ var1.editingBlocks = false;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(this.blockMaterial == Material.lava) {
+ int var6 = var5.nextInt(3);
+
+ for(int var7 = 0; var7 < var6; ++var7) {
+ var2 += var5.nextInt(3) - 1;
+ ++var3;
+ var4 += var5.nextInt(3) - 1;
+ int var8 = var1.getBlockId(var2, var3, var4);
+ if(var8 == 0) {
+ if(this.func_4033_j(var1, var2 - 1, var3, var4) || this.func_4033_j(var1, var2 + 1, var3, var4) || this.func_4033_j(var1, var2, var3, var4 - 1) || this.func_4033_j(var1, var2, var3, var4 + 1) || this.func_4033_j(var1, var2, var3 - 1, var4) || this.func_4033_j(var1, var2, var3 + 1, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.fire.blockID);
+ return;
+ }
+ } else if(Block.blocksList[var8].blockMaterial.getIsSolid()) {
+ return;
+ }
+ }
+ }
+
+ }
+
+ private boolean func_4033_j(World var1, int var2, int var3, int var4) {
+ return var1.getBlockMaterial(var2, var3, var4).getBurning();
+ }
+}
diff --git a/src/net/minecraft/src/BlockStep.java b/src/net/minecraft/src/BlockStep.java
new file mode 100644
index 0000000..491ada9
--- /dev/null
+++ b/src/net/minecraft/src/BlockStep.java
@@ -0,0 +1,63 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockStep extends Block {
+ public static final String[] field_22027_a = new String[]{"stone", "sand", "wood", "cobble"};
+ private boolean blockType;
+
+ public BlockStep(int var1, boolean var2) {
+ super(var1, 6, Material.rock);
+ this.blockType = var2;
+ if(!var2) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
+ }
+
+ this.setLightOpacity(255);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var2 == 0 ? (var1 <= 1 ? 6 : 5) : (var2 == 1 ? (var1 == 0 ? 208 : (var1 == 1 ? 176 : 192)) : (var2 == 2 ? 4 : (var2 == 3 ? 16 : 6)));
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.getBlockTextureFromSideAndMetadata(var1, 0);
+ }
+
+ public boolean isOpaqueCube() {
+ return this.blockType;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(this != Block.stairSingle) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ int var5 = var1.getBlockId(var2, var3 - 1, var4);
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var1.getBlockMetadata(var2, var3 - 1, var4);
+ if(var6 == var7) {
+ if(var5 == stairSingle.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ var1.setBlockAndMetadataWithNotify(var2, var3 - 1, var4, Block.stairDouble.blockID, var6);
+ }
+
+ }
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.stairSingle.blockID;
+ }
+
+ public int quantityDropped(Random var1) {
+ return this.blockType ? 2 : 1;
+ }
+
+ protected int damageDropped(int var1) {
+ return var1;
+ }
+
+ public boolean isACube() {
+ return this.blockType;
+ }
+}
diff --git a/src/net/minecraft/src/BlockStone.java b/src/net/minecraft/src/BlockStone.java
new file mode 100644
index 0000000..eae4ecd
--- /dev/null
+++ b/src/net/minecraft/src/BlockStone.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockStone extends Block {
+ public BlockStone(int var1, int var2) {
+ super(var1, var2, Material.rock);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.cobblestone.blockID;
+ }
+}
diff --git a/src/net/minecraft/src/BlockTNT.java b/src/net/minecraft/src/BlockTNT.java
new file mode 100644
index 0000000..71cfa5f
--- /dev/null
+++ b/src/net/minecraft/src/BlockTNT.java
@@ -0,0 +1,65 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockTNT extends Block {
+ public BlockTNT(int var1, int var2) {
+ super(var1, var2, Material.tnt);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 0 ? this.blockIndexInTexture + 2 : (var1 == 1 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ if(var1.isBlockIndirectlyGettingPowered(var2, var3, var4)) {
+ this.onBlockDestroyedByPlayer(var1, var2, var3, var4, 1);
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(var5 > 0 && Block.blocksList[var5].canProvidePower() && var1.isBlockIndirectlyGettingPowered(var2, var3, var4)) {
+ this.onBlockDestroyedByPlayer(var1, var2, var3, var4, 1);
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) {
+ EntityTNTPrimed var5 = new EntityTNTPrimed(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F));
+ var5.fuse = var1.rand.nextInt(var5.fuse / 4) + var5.fuse / 8;
+ var1.entityJoinedWorld(var5);
+ }
+
+ public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) {
+ if(!var1.singleplayerWorld) {
+ if((var5 & 1) == 0) {
+ this.dropBlockAsItem_do(var1, var2, var3, var4, new ItemStack(Block.tnt.blockID, 1, 0));
+ } else {
+ EntityTNTPrimed var6 = new EntityTNTPrimed(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F));
+ var1.entityJoinedWorld(var6);
+ var1.playSoundAtEntity(var6, "random.fuse", 1.0F, 1.0F);
+ }
+
+ }
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(var5.getCurrentEquippedItem() != null && var5.getCurrentEquippedItem().itemID == Item.flintAndSteel.shiftedIndex) {
+ var1.setBlockMetadata(var2, var3, var4, 1);
+ }
+
+ super.onBlockClicked(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ return super.blockActivated(var1, var2, var3, var4, var5);
+ }
+}
diff --git a/src/net/minecraft/src/BlockTallGrass.java b/src/net/minecraft/src/BlockTallGrass.java
new file mode 100644
index 0000000..7dba401
--- /dev/null
+++ b/src/net/minecraft/src/BlockTallGrass.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockTallGrass extends BlockFlower {
+ protected BlockTallGrass(int var1, int var2) {
+ super(var1, var2);
+ float var3 = 0.4F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 0.8F, 0.5F + var3);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var2 == 1 ? this.blockIndexInTexture : (var2 == 2 ? this.blockIndexInTexture + 16 + 1 : (var2 == 0 ? this.blockIndexInTexture + 16 : this.blockIndexInTexture));
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return var2.nextInt(8) == 0 ? Item.seeds.shiftedIndex : -1;
+ }
+}
diff --git a/src/net/minecraft/src/BlockTorch.java b/src/net/minecraft/src/BlockTorch.java
new file mode 100644
index 0000000..7458a71
--- /dev/null
+++ b/src/net/minecraft/src/BlockTorch.java
@@ -0,0 +1,140 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockTorch extends Block {
+ protected BlockTorch(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ this.setTickOnLoad(true);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ private boolean func_31028_g(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2, var3, var4) || var1.getBlockId(var2, var3, var4) == Block.fence.blockID;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockNormalCube(var2 - 1, var3, var4) ? true : (var1.isBlockNormalCube(var2 + 1, var3, var4) ? true : (var1.isBlockNormalCube(var2, var3, var4 - 1) ? true : (var1.isBlockNormalCube(var2, var3, var4 + 1) ? true : this.func_31028_g(var1, var2, var3 - 1, var4))));
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var5 == 1 && this.func_31028_g(var1, var2, var3 - 1, var4)) {
+ var6 = 5;
+ }
+
+ if(var5 == 2 && var1.isBlockNormalCube(var2, var3, var4 + 1)) {
+ var6 = 4;
+ }
+
+ if(var5 == 3 && var1.isBlockNormalCube(var2, var3, var4 - 1)) {
+ var6 = 3;
+ }
+
+ if(var5 == 4 && var1.isBlockNormalCube(var2 + 1, var3, var4)) {
+ var6 = 2;
+ }
+
+ if(var5 == 5 && var1.isBlockNormalCube(var2 - 1, var3, var4)) {
+ var6 = 1;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ super.updateTick(var1, var2, var3, var4, var5);
+ if(var1.getBlockMetadata(var2, var3, var4) == 0) {
+ this.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(var1.isBlockNormalCube(var2 - 1, var3, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ } else if(var1.isBlockNormalCube(var2 + 1, var3, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 2);
+ } else if(var1.isBlockNormalCube(var2, var3, var4 - 1)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 3);
+ } else if(var1.isBlockNormalCube(var2, var3, var4 + 1)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 4);
+ } else if(this.func_31028_g(var1, var2, var3 - 1, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 5);
+ }
+
+ this.dropTorchIfCantStay(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(this.dropTorchIfCantStay(var1, var2, var3, var4)) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = false;
+ if(!var1.isBlockNormalCube(var2 - 1, var3, var4) && var6 == 1) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2 + 1, var3, var4) && var6 == 2) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2, var3, var4 - 1) && var6 == 3) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockNormalCube(var2, var3, var4 + 1) && var6 == 4) {
+ var7 = true;
+ }
+
+ if(!this.func_31028_g(var1, var2, var3 - 1, var4) && var6 == 5) {
+ var7 = true;
+ }
+
+ if(var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ }
+
+ private boolean dropTorchIfCantStay(World var1, int var2, int var3, int var4) {
+ if(!this.canPlaceBlockAt(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ float var8 = 0.15F;
+ if(var7 == 1) {
+ this.setBlockBounds(0.0F, 0.2F, 0.5F - var8, var8 * 2.0F, 0.8F, 0.5F + var8);
+ } else if(var7 == 2) {
+ this.setBlockBounds(1.0F - var8 * 2.0F, 0.2F, 0.5F - var8, 1.0F, 0.8F, 0.5F + var8);
+ } else if(var7 == 3) {
+ this.setBlockBounds(0.5F - var8, 0.2F, 0.0F, 0.5F + var8, 0.8F, var8 * 2.0F);
+ } else if(var7 == 4) {
+ this.setBlockBounds(0.5F - var8, 0.2F, 1.0F - var8 * 2.0F, 0.5F + var8, 0.8F, 1.0F);
+ } else {
+ var8 = 0.1F;
+ this.setBlockBounds(0.5F - var8, 0.0F, 0.5F - var8, 0.5F + var8, 0.6F, 0.5F + var8);
+ }
+
+ return super.collisionRayTrace(var1, var2, var3, var4, var5, var6);
+ }
+}
diff --git a/src/net/minecraft/src/BlockTrapDoor.java b/src/net/minecraft/src/BlockTrapDoor.java
new file mode 100644
index 0000000..b23b30a
--- /dev/null
+++ b/src/net/minecraft/src/BlockTrapDoor.java
@@ -0,0 +1,169 @@
+package net.minecraft.src;
+
+public class BlockTrapDoor extends Block {
+ protected BlockTrapDoor(int var1, Material var2) {
+ super(var1, var2);
+ this.blockIndexInTexture = 84;
+ if(var2 == Material.iron) {
+ ++this.blockIndexInTexture;
+ }
+
+ float var3 = 0.5F;
+ float var4 = 1.0F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var4, 0.5F + var3);
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ this.func_28039_c(var1.getBlockMetadata(var2, var3, var4));
+ }
+
+ public void func_28039_c(int var1) {
+ float var2 = 3.0F / 16.0F;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, var2, 1.0F);
+ if(func_28038_d(var1)) {
+ if((var1 & 3) == 0) {
+ this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F);
+ }
+
+ if((var1 & 3) == 1) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2);
+ }
+
+ if((var1 & 3) == 2) {
+ this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ if((var1 & 3) == 3) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F);
+ }
+ }
+
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(this.blockMaterial == Material.iron) {
+ return true;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 ^ 4);
+ var1.func_28101_a(var5, 1003, var2, var3, var4, 0);
+ return true;
+ }
+ }
+
+ public void func_28040_a(World var1, int var2, int var3, int var4, boolean var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = (var6 & 4) > 0;
+ if(var7 != var5) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 ^ 4);
+ var1.func_28101_a((EntityPlayer)null, 1003, var2, var3, var4, 0);
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!var1.singleplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var2;
+ int var8 = var4;
+ if((var6 & 3) == 0) {
+ var8 = var4 + 1;
+ }
+
+ if((var6 & 3) == 1) {
+ --var8;
+ }
+
+ if((var6 & 3) == 2) {
+ var7 = var2 + 1;
+ }
+
+ if((var6 & 3) == 3) {
+ --var7;
+ }
+
+ if(!var1.isBlockNormalCube(var7, var3, var8)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ this.dropBlockAsItem(var1, var2, var3, var4, var6);
+ }
+
+ if(var5 > 0 && Block.blocksList[var5].canProvidePower()) {
+ boolean var9 = var1.isBlockIndirectlyGettingPowered(var2, var3, var4);
+ this.func_28040_a(var1, var2, var3, var4, var9);
+ }
+
+ }
+ }
+
+ public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.collisionRayTrace(var1, var2, var3, var4, var5, var6);
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ byte var6 = 0;
+ if(var5 == 2) {
+ var6 = 0;
+ }
+
+ if(var5 == 3) {
+ var6 = 1;
+ }
+
+ if(var5 == 4) {
+ var6 = 2;
+ }
+
+ if(var5 == 5) {
+ var6 = 3;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ }
+
+ public boolean canPlaceBlockOnSide(World var1, int var2, int var3, int var4, int var5) {
+ if(var5 == 0) {
+ return false;
+ } else if(var5 == 1) {
+ return false;
+ } else {
+ if(var5 == 2) {
+ ++var4;
+ }
+
+ if(var5 == 3) {
+ --var4;
+ }
+
+ if(var5 == 4) {
+ ++var2;
+ }
+
+ if(var5 == 5) {
+ --var2;
+ }
+
+ return var1.isBlockNormalCube(var2, var3, var4);
+ }
+ }
+
+ public static boolean func_28038_d(int var0) {
+ return (var0 & 4) != 0;
+ }
+}
diff --git a/src/net/minecraft/src/BlockWeb.java b/src/net/minecraft/src/BlockWeb.java
new file mode 100644
index 0000000..2f84be4
--- /dev/null
+++ b/src/net/minecraft/src/BlockWeb.java
@@ -0,0 +1,29 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockWeb extends Block {
+ public BlockWeb(int var1, int var2) {
+ super(var1, var2, Material.web);
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ var5.field_27012_bb = true;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isACube() {
+ return false;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.silk.shiftedIndex;
+ }
+}
diff --git a/src/net/minecraft/src/BlockWorkbench.java b/src/net/minecraft/src/BlockWorkbench.java
new file mode 100644
index 0000000..716032c
--- /dev/null
+++ b/src/net/minecraft/src/BlockWorkbench.java
@@ -0,0 +1,21 @@
+package net.minecraft.src;
+
+public class BlockWorkbench extends Block {
+ protected BlockWorkbench(int var1) {
+ super(var1, Material.wood);
+ this.blockIndexInTexture = 59;
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture - 16 : (var1 == 0 ? Block.planks.getBlockTextureFromSide(0) : (var1 != 2 && var1 != 4 ? this.blockIndexInTexture : this.blockIndexInTexture + 1));
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(var1.singleplayerWorld) {
+ return true;
+ } else {
+ var5.displayWorkbenchGUI(var2, var3, var4);
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ChatAllowedCharacters.java b/src/net/minecraft/src/ChatAllowedCharacters.java
new file mode 100644
index 0000000..58e6947
--- /dev/null
+++ b/src/net/minecraft/src/ChatAllowedCharacters.java
@@ -0,0 +1,33 @@
+package net.minecraft.src;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+public class ChatAllowedCharacters {
+ public static final String allowedCharacters = getAllowedCharacters();
+ public static final char[] field_22175_b = new char[]{'/', '\n', '\r', '\t', '\u0000', '\f', '`', '?', '*', '\\', '<', '>', '|', '\"', ':'};
+
+ private static String getAllowedCharacters() {
+ String var0 = "";
+
+ try {
+ BufferedReader var1 = new BufferedReader(new InputStreamReader(ChatAllowedCharacters.class.getResourceAsStream("/font.txt"), "UTF-8"));
+ String var2 = "";
+
+ while(true) {
+ var2 = var1.readLine();
+ if(var2 == null) {
+ var1.close();
+ break;
+ }
+
+ if(!var2.startsWith("#")) {
+ var0 = var0 + var2;
+ }
+ }
+ } catch (Exception var3) {
+ }
+
+ return var0;
+ }
+}
diff --git a/src/net/minecraft/src/Chunk.java b/src/net/minecraft/src/Chunk.java
new file mode 100644
index 0000000..fb6fd5b
--- /dev/null
+++ b/src/net/minecraft/src/Chunk.java
@@ -0,0 +1,597 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+public class Chunk {
+ public static boolean isLit;
+ public byte[] blocks;
+ public boolean isChunkLoaded;
+ public World worldObj;
+ public NibbleArray data;
+ public NibbleArray skylightMap;
+ public NibbleArray blocklightMap;
+ public byte[] heightMap;
+ public int field_686_i;
+ public final int xPosition;
+ public final int zPosition;
+ public Map chunkTileEntityMap;
+ public List[] entities;
+ public boolean isTerrainPopulated;
+ public boolean isModified;
+ public boolean neverSave;
+ public boolean hasEntities;
+ public long lastSaveTime;
+
+ public Chunk(World var1, int var2, int var3) {
+ this.chunkTileEntityMap = new HashMap();
+ this.entities = new List[8];
+ this.isTerrainPopulated = false;
+ this.isModified = false;
+ this.hasEntities = false;
+ this.lastSaveTime = 0L;
+ this.worldObj = var1;
+ this.xPosition = var2;
+ this.zPosition = var3;
+ this.heightMap = new byte[256];
+
+ for(int var4 = 0; var4 < this.entities.length; ++var4) {
+ this.entities[var4] = new ArrayList();
+ }
+
+ }
+
+ public Chunk(World var1, byte[] var2, int var3, int var4) {
+ this(var1, var3, var4);
+ this.blocks = var2;
+ this.data = new NibbleArray(var2.length);
+ this.skylightMap = new NibbleArray(var2.length);
+ this.blocklightMap = new NibbleArray(var2.length);
+ }
+
+ public boolean isAtLocation(int var1, int var2) {
+ return var1 == this.xPosition && var2 == this.zPosition;
+ }
+
+ public int getHeightValue(int var1, int var2) {
+ return this.heightMap[var2 << 4 | var1] & 255;
+ }
+
+ public void func_348_a() {
+ }
+
+ public void func_353_b() {
+ int var1 = 127;
+
+ int var2;
+ int var3;
+ for(var2 = 0; var2 < 16; ++var2) {
+ for(var3 = 0; var3 < 16; ++var3) {
+ int var4 = 127;
+
+ int var5;
+ for(var5 = var2 << 11 | var3 << 7; var4 > 0 && Block.lightOpacity[this.blocks[var5 + var4 - 1] & 255] == 0; --var4) {
+ }
+
+ this.heightMap[var3 << 4 | var2] = (byte)var4;
+ if(var4 < var1) {
+ var1 = var4;
+ }
+
+ if(!this.worldObj.worldProvider.field_4306_c) {
+ int var6 = 15;
+ int var7 = 127;
+
+ do {
+ var6 -= Block.lightOpacity[this.blocks[var5 + var7] & 255];
+ if(var6 > 0) {
+ this.skylightMap.setNibble(var2, var7, var3, var6);
+ }
+
+ --var7;
+ } while(var7 > 0 && var6 > 0);
+ }
+ }
+ }
+
+ this.field_686_i = var1;
+
+ for(var2 = 0; var2 < 16; ++var2) {
+ for(var3 = 0; var3 < 16; ++var3) {
+ this.func_333_c(var2, var3);
+ }
+ }
+
+ this.isModified = true;
+ }
+
+ public void func_4053_c() {
+ }
+
+ private void func_333_c(int var1, int var2) {
+ int var3 = this.getHeightValue(var1, var2);
+ int var4 = this.xPosition * 16 + var1;
+ int var5 = this.zPosition * 16 + var2;
+ this.func_355_f(var4 - 1, var5, var3);
+ this.func_355_f(var4 + 1, var5, var3);
+ this.func_355_f(var4, var5 - 1, var3);
+ this.func_355_f(var4, var5 + 1, var3);
+ }
+
+ private void func_355_f(int var1, int var2, int var3) {
+ int var4 = this.worldObj.getHeightValue(var1, var2);
+ if(var4 > var3) {
+ this.worldObj.scheduleLightingUpdate(EnumSkyBlock.Sky, var1, var3, var2, var1, var4, var2);
+ this.isModified = true;
+ } else if(var4 < var3) {
+ this.worldObj.scheduleLightingUpdate(EnumSkyBlock.Sky, var1, var4, var2, var1, var3, var2);
+ this.isModified = true;
+ }
+
+ }
+
+ private void func_339_g(int var1, int var2, int var3) {
+ int var4 = this.heightMap[var3 << 4 | var1] & 255;
+ int var5 = var4;
+ if(var2 > var4) {
+ var5 = var2;
+ }
+
+ for(int var6 = var1 << 11 | var3 << 7; var5 > 0 && Block.lightOpacity[this.blocks[var6 + var5 - 1] & 255] == 0; --var5) {
+ }
+
+ if(var5 != var4) {
+ this.worldObj.markBlocksDirtyVertical(var1, var3, var5, var4);
+ this.heightMap[var3 << 4 | var1] = (byte)var5;
+ int var7;
+ int var8;
+ int var9;
+ if(var5 < this.field_686_i) {
+ this.field_686_i = var5;
+ } else {
+ var7 = 127;
+
+ for(var8 = 0; var8 < 16; ++var8) {
+ for(var9 = 0; var9 < 16; ++var9) {
+ if((this.heightMap[var9 << 4 | var8] & 255) < var7) {
+ var7 = this.heightMap[var9 << 4 | var8] & 255;
+ }
+ }
+ }
+
+ this.field_686_i = var7;
+ }
+
+ var7 = this.xPosition * 16 + var1;
+ var8 = this.zPosition * 16 + var3;
+ if(var5 < var4) {
+ for(var9 = var5; var9 < var4; ++var9) {
+ this.skylightMap.setNibble(var1, var9, var3, 15);
+ }
+ } else {
+ this.worldObj.scheduleLightingUpdate(EnumSkyBlock.Sky, var7, var4, var8, var7, var5, var8);
+
+ for(var9 = var4; var9 < var5; ++var9) {
+ this.skylightMap.setNibble(var1, var9, var3, 0);
+ }
+ }
+
+ var9 = 15;
+
+ int var10;
+ for(var10 = var5; var5 > 0 && var9 > 0; this.skylightMap.setNibble(var1, var5, var3, var9)) {
+ --var5;
+ int var11 = Block.lightOpacity[this.getBlockID(var1, var5, var3)];
+ if(var11 == 0) {
+ var11 = 1;
+ }
+
+ var9 -= var11;
+ if(var9 < 0) {
+ var9 = 0;
+ }
+ }
+
+ while(var5 > 0 && Block.lightOpacity[this.getBlockID(var1, var5 - 1, var3)] == 0) {
+ --var5;
+ }
+
+ if(var5 != var10) {
+ this.worldObj.scheduleLightingUpdate(EnumSkyBlock.Sky, var7 - 1, var5, var8 - 1, var7 + 1, var10, var8 + 1);
+ }
+
+ this.isModified = true;
+ }
+ }
+
+ public int getBlockID(int var1, int var2, int var3) {
+ return this.blocks[var1 << 11 | var3 << 7 | var2] & 255;
+ }
+
+ public boolean setBlockIDWithMetadata(int var1, int var2, int var3, int var4, int var5) {
+ byte var6 = (byte)var4;
+ int var7 = this.heightMap[var3 << 4 | var1] & 255;
+ int var8 = this.blocks[var1 << 11 | var3 << 7 | var2] & 255;
+ if(var8 == var4 && this.data.getNibble(var1, var2, var3) == var5) {
+ return false;
+ } else {
+ int var9 = this.xPosition * 16 + var1;
+ int var10 = this.zPosition * 16 + var3;
+ this.blocks[var1 << 11 | var3 << 7 | var2] = (byte)(var6 & 255);
+ if(var8 != 0 && !this.worldObj.singleplayerWorld) {
+ Block.blocksList[var8].onBlockRemoval(this.worldObj, var9, var2, var10);
+ }
+
+ this.data.setNibble(var1, var2, var3, var5);
+ if(!this.worldObj.worldProvider.field_4306_c) {
+ if(Block.lightOpacity[var6 & 255] != 0) {
+ if(var2 >= var7) {
+ this.func_339_g(var1, var2 + 1, var3);
+ }
+ } else if(var2 == var7 - 1) {
+ this.func_339_g(var1, var2, var3);
+ }
+
+ this.worldObj.scheduleLightingUpdate(EnumSkyBlock.Sky, var9, var2, var10, var9, var2, var10);
+ }
+
+ this.worldObj.scheduleLightingUpdate(EnumSkyBlock.Block, var9, var2, var10, var9, var2, var10);
+ this.func_333_c(var1, var3);
+ this.data.setNibble(var1, var2, var3, var5);
+ if(var4 != 0) {
+ Block.blocksList[var4].onBlockAdded(this.worldObj, var9, var2, var10);
+ }
+
+ this.isModified = true;
+ return true;
+ }
+ }
+
+ public boolean setBlockID(int var1, int var2, int var3, int var4) {
+ byte var5 = (byte)var4;
+ int var6 = this.heightMap[var3 << 4 | var1] & 255;
+ int var7 = this.blocks[var1 << 11 | var3 << 7 | var2] & 255;
+ if(var7 == var4) {
+ return false;
+ } else {
+ int var8 = this.xPosition * 16 + var1;
+ int var9 = this.zPosition * 16 + var3;
+ this.blocks[var1 << 11 | var3 << 7 | var2] = (byte)(var5 & 255);
+ if(var7 != 0) {
+ Block.blocksList[var7].onBlockRemoval(this.worldObj, var8, var2, var9);
+ }
+
+ this.data.setNibble(var1, var2, var3, 0);
+ if(Block.lightOpacity[var5 & 255] != 0) {
+ if(var2 >= var6) {
+ this.func_339_g(var1, var2 + 1, var3);
+ }
+ } else if(var2 == var6 - 1) {
+ this.func_339_g(var1, var2, var3);
+ }
+
+ this.worldObj.scheduleLightingUpdate(EnumSkyBlock.Sky, var8, var2, var9, var8, var2, var9);
+ this.worldObj.scheduleLightingUpdate(EnumSkyBlock.Block, var8, var2, var9, var8, var2, var9);
+ this.func_333_c(var1, var3);
+ if(var4 != 0 && !this.worldObj.singleplayerWorld) {
+ Block.blocksList[var4].onBlockAdded(this.worldObj, var8, var2, var9);
+ }
+
+ this.isModified = true;
+ return true;
+ }
+ }
+
+ public int getBlockMetadata(int var1, int var2, int var3) {
+ return this.data.getNibble(var1, var2, var3);
+ }
+
+ public void setBlockMetadata(int var1, int var2, int var3, int var4) {
+ this.isModified = true;
+ this.data.setNibble(var1, var2, var3, var4);
+ }
+
+ public int getSavedLightValue(EnumSkyBlock var1, int var2, int var3, int var4) {
+ return var1 == EnumSkyBlock.Sky ? this.skylightMap.getNibble(var2, var3, var4) : (var1 == EnumSkyBlock.Block ? this.blocklightMap.getNibble(var2, var3, var4) : 0);
+ }
+
+ public void setLightValue(EnumSkyBlock var1, int var2, int var3, int var4, int var5) {
+ this.isModified = true;
+ if(var1 == EnumSkyBlock.Sky) {
+ this.skylightMap.setNibble(var2, var3, var4, var5);
+ } else {
+ if(var1 != EnumSkyBlock.Block) {
+ return;
+ }
+
+ this.blocklightMap.setNibble(var2, var3, var4, var5);
+ }
+
+ }
+
+ public int getBlockLightValue(int var1, int var2, int var3, int var4) {
+ int var5 = this.skylightMap.getNibble(var1, var2, var3);
+ if(var5 > 0) {
+ isLit = true;
+ }
+
+ var5 -= var4;
+ int var6 = this.blocklightMap.getNibble(var1, var2, var3);
+ if(var6 > var5) {
+ var5 = var6;
+ }
+
+ return var5;
+ }
+
+ public void addEntity(Entity var1) {
+ this.hasEntities = true;
+ int var2 = MathHelper.floor_double(var1.posX / 16.0D);
+ int var3 = MathHelper.floor_double(var1.posZ / 16.0D);
+ if(var2 != this.xPosition || var3 != this.zPosition) {
+ System.out.println("Wrong location! " + var1);
+ Thread.dumpStack();
+ }
+
+ int var4 = MathHelper.floor_double(var1.posY / 16.0D);
+ if(var4 < 0) {
+ var4 = 0;
+ }
+
+ if(var4 >= this.entities.length) {
+ var4 = this.entities.length - 1;
+ }
+
+ var1.addedToChunk = true;
+ var1.chunkCoordX = this.xPosition;
+ var1.chunkCoordY = var4;
+ var1.chunkCoordZ = this.zPosition;
+ this.entities[var4].add(var1);
+ }
+
+ public void removeEntity(Entity var1) {
+ this.removeEntityAtIndex(var1, var1.chunkCoordY);
+ }
+
+ public void removeEntityAtIndex(Entity var1, int var2) {
+ if(var2 < 0) {
+ var2 = 0;
+ }
+
+ if(var2 >= this.entities.length) {
+ var2 = this.entities.length - 1;
+ }
+
+ this.entities[var2].remove(var1);
+ }
+
+ public boolean canBlockSeeTheSky(int var1, int var2, int var3) {
+ return var2 >= (this.heightMap[var3 << 4 | var1] & 255);
+ }
+
+ public TileEntity getChunkBlockTileEntity(int var1, int var2, int var3) {
+ ChunkPosition var4 = new ChunkPosition(var1, var2, var3);
+ TileEntity var5 = (TileEntity)this.chunkTileEntityMap.get(var4);
+ if(var5 == null) {
+ int var6 = this.getBlockID(var1, var2, var3);
+ if(!Block.isBlockContainer[var6]) {
+ return null;
+ }
+
+ BlockContainer var7 = (BlockContainer)Block.blocksList[var6];
+ var7.onBlockAdded(this.worldObj, this.xPosition * 16 + var1, var2, this.zPosition * 16 + var3);
+ var5 = (TileEntity)this.chunkTileEntityMap.get(var4);
+ }
+
+ if(var5 != null && var5.isInvalid()) {
+ this.chunkTileEntityMap.remove(var4);
+ return null;
+ } else {
+ return var5;
+ }
+ }
+
+ public void addTileEntity(TileEntity var1) {
+ int var2 = var1.xCoord - this.xPosition * 16;
+ int var3 = var1.yCoord;
+ int var4 = var1.zCoord - this.zPosition * 16;
+ this.setChunkBlockTileEntity(var2, var3, var4, var1);
+ if(this.isChunkLoaded) {
+ this.worldObj.loadedTileEntityList.add(var1);
+ }
+
+ }
+
+ public void setChunkBlockTileEntity(int var1, int var2, int var3, TileEntity var4) {
+ ChunkPosition var5 = new ChunkPosition(var1, var2, var3);
+ var4.worldObj = this.worldObj;
+ var4.xCoord = this.xPosition * 16 + var1;
+ var4.yCoord = var2;
+ var4.zCoord = this.zPosition * 16 + var3;
+ if(this.getBlockID(var1, var2, var3) != 0 && Block.blocksList[this.getBlockID(var1, var2, var3)] instanceof BlockContainer) {
+ var4.validate();
+ this.chunkTileEntityMap.put(var5, var4);
+ } else {
+ System.out.println("Attempted to place a tile entity where there was no entity tile!");
+ }
+ }
+
+ public void removeChunkBlockTileEntity(int var1, int var2, int var3) {
+ ChunkPosition var4 = new ChunkPosition(var1, var2, var3);
+ if(this.isChunkLoaded) {
+ TileEntity var5 = (TileEntity)this.chunkTileEntityMap.remove(var4);
+ if(var5 != null) {
+ var5.invalidate();
+ }
+ }
+
+ }
+
+ public void onChunkLoad() {
+ this.isChunkLoaded = true;
+ this.worldObj.func_31047_a(this.chunkTileEntityMap.values());
+
+ for(int var1 = 0; var1 < this.entities.length; ++var1) {
+ this.worldObj.addLoadedEntities(this.entities[var1]);
+ }
+
+ }
+
+ public void onChunkUnload() {
+ this.isChunkLoaded = false;
+ Iterator var1 = this.chunkTileEntityMap.values().iterator();
+
+ while(var1.hasNext()) {
+ TileEntity var2 = (TileEntity)var1.next();
+ var2.invalidate();
+ }
+
+ for(int var3 = 0; var3 < this.entities.length; ++var3) {
+ this.worldObj.addUnloadedEntities(this.entities[var3]);
+ }
+
+ }
+
+ public void setChunkModified() {
+ this.isModified = true;
+ }
+
+ public void getEntitiesWithinAABBForEntity(Entity var1, AxisAlignedBB var2, List var3) {
+ int var4 = MathHelper.floor_double((var2.minY - 2.0D) / 16.0D);
+ int var5 = MathHelper.floor_double((var2.maxY + 2.0D) / 16.0D);
+ if(var4 < 0) {
+ var4 = 0;
+ }
+
+ if(var5 >= this.entities.length) {
+ var5 = this.entities.length - 1;
+ }
+
+ for(int var6 = var4; var6 <= var5; ++var6) {
+ List var7 = this.entities[var6];
+
+ for(int var8 = 0; var8 < var7.size(); ++var8) {
+ Entity var9 = (Entity)var7.get(var8);
+ if(var9 != var1 && var9.boundingBox.intersectsWith(var2)) {
+ var3.add(var9);
+ }
+ }
+ }
+
+ }
+
+ public void getEntitiesOfTypeWithinAAAB(Class var1, AxisAlignedBB var2, List var3) {
+ int var4 = MathHelper.floor_double((var2.minY - 2.0D) / 16.0D);
+ int var5 = MathHelper.floor_double((var2.maxY + 2.0D) / 16.0D);
+ if(var4 < 0) {
+ var4 = 0;
+ }
+
+ if(var5 >= this.entities.length) {
+ var5 = this.entities.length - 1;
+ }
+
+ for(int var6 = var4; var6 <= var5; ++var6) {
+ List var7 = this.entities[var6];
+
+ for(int var8 = 0; var8 < var7.size(); ++var8) {
+ Entity var9 = (Entity)var7.get(var8);
+ if(var1.isAssignableFrom(var9.getClass()) && var9.boundingBox.intersectsWith(var2)) {
+ var3.add(var9);
+ }
+ }
+ }
+
+ }
+
+ public boolean needsSaving(boolean var1) {
+ if(this.neverSave) {
+ return false;
+ } else {
+ if(var1) {
+ if(this.hasEntities && this.worldObj.getWorldTime() != this.lastSaveTime) {
+ return true;
+ }
+ } else if(this.hasEntities && this.worldObj.getWorldTime() >= this.lastSaveTime + 600L) {
+ return true;
+ }
+
+ return this.isModified;
+ }
+ }
+
+ public int getChunkData(byte[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) {
+ int var9 = var5 - var2;
+ int var10 = var6 - var3;
+ int var11 = var7 - var4;
+ if(var9 * var10 * var11 == this.blocks.length) {
+ System.arraycopy(this.blocks, 0, var1, var8, this.blocks.length);
+ var8 += this.blocks.length;
+ System.arraycopy(this.data.data, 0, var1, var8, this.data.data.length);
+ var8 += this.data.data.length;
+ System.arraycopy(this.blocklightMap.data, 0, var1, var8, this.blocklightMap.data.length);
+ var8 += this.blocklightMap.data.length;
+ System.arraycopy(this.skylightMap.data, 0, var1, var8, this.skylightMap.data.length);
+ var8 += this.skylightMap.data.length;
+ return var8;
+ } else {
+ int var12;
+ int var13;
+ int var14;
+ int var15;
+ for(var12 = var2; var12 < var5; ++var12) {
+ for(var13 = var4; var13 < var7; ++var13) {
+ var14 = var12 << 11 | var13 << 7 | var3;
+ var15 = var6 - var3;
+ System.arraycopy(this.blocks, var14, var1, var8, var15);
+ var8 += var15;
+ }
+ }
+
+ for(var12 = var2; var12 < var5; ++var12) {
+ for(var13 = var4; var13 < var7; ++var13) {
+ var14 = (var12 << 11 | var13 << 7 | var3) >> 1;
+ var15 = (var6 - var3) / 2;
+ System.arraycopy(this.data.data, var14, var1, var8, var15);
+ var8 += var15;
+ }
+ }
+
+ for(var12 = var2; var12 < var5; ++var12) {
+ for(var13 = var4; var13 < var7; ++var13) {
+ var14 = (var12 << 11 | var13 << 7 | var3) >> 1;
+ var15 = (var6 - var3) / 2;
+ System.arraycopy(this.blocklightMap.data, var14, var1, var8, var15);
+ var8 += var15;
+ }
+ }
+
+ for(var12 = var2; var12 < var5; ++var12) {
+ for(var13 = var4; var13 < var7; ++var13) {
+ var14 = (var12 << 11 | var13 << 7 | var3) >> 1;
+ var15 = (var6 - var3) / 2;
+ System.arraycopy(this.skylightMap.data, var14, var1, var8, var15);
+ var8 += var15;
+ }
+ }
+
+ return var8;
+ }
+ }
+
+ public Random func_334_a(long var1) {
+ return new Random(this.worldObj.getRandomSeed() + (long)(this.xPosition * this.xPosition * 4987142) + (long)(this.xPosition * 5947611) + (long)(this.zPosition * this.zPosition) * 4392871L + (long)(this.zPosition * 389711) ^ var1);
+ }
+
+ public boolean func_21101_g() {
+ return false;
+ }
+
+ public void func_25083_h() {
+ ChunkBlockMap.func_26001_a(this.blocks);
+ }
+}
diff --git a/src/net/minecraft/src/ChunkBlockMap.java b/src/net/minecraft/src/ChunkBlockMap.java
new file mode 100644
index 0000000..8baa4bb
--- /dev/null
+++ b/src/net/minecraft/src/ChunkBlockMap.java
@@ -0,0 +1,28 @@
+package net.minecraft.src;
+
+public class ChunkBlockMap {
+ private static byte[] field_26002_a = new byte[256];
+
+ public static void func_26001_a(byte[] var0) {
+ for(int var1 = 0; var1 < var0.length; ++var1) {
+ var0[var1] = field_26002_a[var0[var1] & 255];
+ }
+
+ }
+
+ static {
+ try {
+ for(int var0 = 0; var0 < 256; ++var0) {
+ byte var1 = (byte)var0;
+ if(var1 != 0 && Block.blocksList[var1 & 255] == null) {
+ var1 = 0;
+ }
+
+ field_26002_a[var0] = var1;
+ }
+ } catch (Exception var2) {
+ var2.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/ChunkCache.java b/src/net/minecraft/src/ChunkCache.java
new file mode 100644
index 0000000..e82ac60
--- /dev/null
+++ b/src/net/minecraft/src/ChunkCache.java
@@ -0,0 +1,69 @@
+package net.minecraft.src;
+
+public class ChunkCache implements IBlockAccess {
+ private int chunkX;
+ private int chunkZ;
+ private Chunk[][] chunkArray;
+ private World worldObj;
+
+ public ChunkCache(World var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ this.worldObj = var1;
+ this.chunkX = var2 >> 4;
+ this.chunkZ = var4 >> 4;
+ int var8 = var5 >> 4;
+ int var9 = var7 >> 4;
+ this.chunkArray = new Chunk[var8 - this.chunkX + 1][var9 - this.chunkZ + 1];
+
+ for(int var10 = this.chunkX; var10 <= var8; ++var10) {
+ for(int var11 = this.chunkZ; var11 <= var9; ++var11) {
+ this.chunkArray[var10 - this.chunkX][var11 - this.chunkZ] = var1.getChunkFromChunkCoords(var10, var11);
+ }
+ }
+
+ }
+
+ public int getBlockId(int var1, int var2, int var3) {
+ if(var2 < 0) {
+ return 0;
+ } else if(var2 >= 128) {
+ return 0;
+ } else {
+ int var4 = (var1 >> 4) - this.chunkX;
+ int var5 = (var3 >> 4) - this.chunkZ;
+ if(var4 >= 0 && var4 < this.chunkArray.length && var5 >= 0 && var5 < this.chunkArray[var4].length) {
+ Chunk var6 = this.chunkArray[var4][var5];
+ return var6 == null ? 0 : var6.getBlockID(var1 & 15, var2, var3 & 15);
+ } else {
+ return 0;
+ }
+ }
+ }
+
+ public TileEntity getBlockTileEntity(int var1, int var2, int var3) {
+ int var4 = (var1 >> 4) - this.chunkX;
+ int var5 = (var3 >> 4) - this.chunkZ;
+ return this.chunkArray[var4][var5].getChunkBlockTileEntity(var1 & 15, var2, var3 & 15);
+ }
+
+ public int getBlockMetadata(int var1, int var2, int var3) {
+ if(var2 < 0) {
+ return 0;
+ } else if(var2 >= 128) {
+ return 0;
+ } else {
+ int var4 = (var1 >> 4) - this.chunkX;
+ int var5 = (var3 >> 4) - this.chunkZ;
+ return this.chunkArray[var4][var5].getBlockMetadata(var1 & 15, var2, var3 & 15);
+ }
+ }
+
+ public Material getBlockMaterial(int var1, int var2, int var3) {
+ int var4 = this.getBlockId(var1, var2, var3);
+ return var4 == 0 ? Material.air : Block.blocksList[var4].blockMaterial;
+ }
+
+ public boolean isBlockNormalCube(int var1, int var2, int var3) {
+ Block var4 = Block.blocksList[this.getBlockId(var1, var2, var3)];
+ return var4 == null ? false : var4.blockMaterial.getIsSolid() && var4.isACube();
+ }
+}
diff --git a/src/net/minecraft/src/ChunkCoordIntPair.java b/src/net/minecraft/src/ChunkCoordIntPair.java
new file mode 100644
index 0000000..b58d019
--- /dev/null
+++ b/src/net/minecraft/src/ChunkCoordIntPair.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+public class ChunkCoordIntPair {
+ public final int chunkXPos;
+ public final int chunkZPos;
+
+ public ChunkCoordIntPair(int var1, int var2) {
+ this.chunkXPos = var1;
+ this.chunkZPos = var2;
+ }
+
+ public static int chunkXZ2Int(int var0, int var1) {
+ return (var0 < 0 ? Integer.MIN_VALUE : 0) | (var0 & Short.MAX_VALUE) << 16 | (var1 < 0 ? -Short.MIN_VALUE : 0) | var1 & Short.MAX_VALUE;
+ }
+
+ public int hashCode() {
+ return chunkXZ2Int(this.chunkXPos, this.chunkZPos);
+ }
+
+ public boolean equals(Object var1) {
+ ChunkCoordIntPair var2 = (ChunkCoordIntPair)var1;
+ return var2.chunkXPos == this.chunkXPos && var2.chunkZPos == this.chunkZPos;
+ }
+}
diff --git a/src/net/minecraft/src/ChunkCoordinates.java b/src/net/minecraft/src/ChunkCoordinates.java
new file mode 100644
index 0000000..989ca8f
--- /dev/null
+++ b/src/net/minecraft/src/ChunkCoordinates.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+public class ChunkCoordinates implements Comparable {
+ public int posX;
+ public int posY;
+ public int posZ;
+
+ public ChunkCoordinates() {
+ }
+
+ public ChunkCoordinates(int var1, int var2, int var3) {
+ this.posX = var1;
+ this.posY = var2;
+ this.posZ = var3;
+ }
+
+ public ChunkCoordinates(ChunkCoordinates var1) {
+ this.posX = var1.posX;
+ this.posY = var1.posY;
+ this.posZ = var1.posZ;
+ }
+
+ public boolean equals(Object var1) {
+ if(!(var1 instanceof ChunkCoordinates)) {
+ return false;
+ } else {
+ ChunkCoordinates var2 = (ChunkCoordinates)var1;
+ return this.posX == var2.posX && this.posY == var2.posY && this.posZ == var2.posZ;
+ }
+ }
+
+ public int hashCode() {
+ return this.posX + this.posZ << 8 + this.posY << 16;
+ }
+
+ public int compareChunkCoordinate(ChunkCoordinates var1) {
+ return this.posY == var1.posY ? (this.posZ == var1.posZ ? this.posX - var1.posX : this.posZ - var1.posZ) : this.posY - var1.posY;
+ }
+
+ public double getSqDistanceTo(int var1, int var2, int var3) {
+ int var4 = this.posX - var1;
+ int var5 = this.posY - var2;
+ int var6 = this.posZ - var3;
+ return Math.sqrt((double)(var4 * var4 + var5 * var5 + var6 * var6));
+ }
+
+ public int compareTo(Object var1) {
+ return this.compareChunkCoordinate((ChunkCoordinates)var1);
+ }
+}
diff --git a/src/net/minecraft/src/ChunkFile.java b/src/net/minecraft/src/ChunkFile.java
new file mode 100644
index 0000000..0000b0b
--- /dev/null
+++ b/src/net/minecraft/src/ChunkFile.java
@@ -0,0 +1,51 @@
+package net.minecraft.src;
+
+import java.io.File;
+import java.util.regex.Matcher;
+
+class ChunkFile implements Comparable {
+ private final File field_22209_a;
+ private final int field_22208_b;
+ private final int field_22210_c;
+
+ public ChunkFile(File var1) {
+ this.field_22209_a = var1;
+ Matcher var2 = ChunkFilePattern.field_22119_a.matcher(var1.getName());
+ if(var2.matches()) {
+ this.field_22208_b = Integer.parseInt(var2.group(1), 36);
+ this.field_22210_c = Integer.parseInt(var2.group(2), 36);
+ } else {
+ this.field_22208_b = 0;
+ this.field_22210_c = 0;
+ }
+
+ }
+
+ public int func_22206_a(ChunkFile var1) {
+ int var2 = this.field_22208_b >> 5;
+ int var3 = var1.field_22208_b >> 5;
+ if(var2 == var3) {
+ int var4 = this.field_22210_c >> 5;
+ int var5 = var1.field_22210_c >> 5;
+ return var4 - var5;
+ } else {
+ return var2 - var3;
+ }
+ }
+
+ public File func_22207_a() {
+ return this.field_22209_a;
+ }
+
+ public int func_22205_b() {
+ return this.field_22208_b;
+ }
+
+ public int func_22204_c() {
+ return this.field_22210_c;
+ }
+
+ public int compareTo(Object var1) {
+ return this.func_22206_a((ChunkFile)var1);
+ }
+}
diff --git a/src/net/minecraft/src/ChunkFilePattern.java b/src/net/minecraft/src/ChunkFilePattern.java
new file mode 100644
index 0000000..0f7860c
--- /dev/null
+++ b/src/net/minecraft/src/ChunkFilePattern.java
@@ -0,0 +1,22 @@
+package net.minecraft.src;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+class ChunkFilePattern implements FilenameFilter {
+ public static final Pattern field_22119_a = Pattern.compile("c\\.(-?[0-9a-z]+)\\.(-?[0-9a-z]+)\\.dat");
+
+ private ChunkFilePattern() {
+ }
+
+ public boolean accept(File var1, String var2) {
+ Matcher var3 = field_22119_a.matcher(var2);
+ return var3.matches();
+ }
+
+ ChunkFilePattern(Empty2 var1) {
+ this();
+ }
+}
diff --git a/src/net/minecraft/src/ChunkFolderPattern.java b/src/net/minecraft/src/ChunkFolderPattern.java
new file mode 100644
index 0000000..3a0a4fd
--- /dev/null
+++ b/src/net/minecraft/src/ChunkFolderPattern.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+class ChunkFolderPattern implements FileFilter {
+ public static final Pattern field_22214_a = Pattern.compile("[0-9a-z]|([0-9a-z][0-9a-z])");
+
+ private ChunkFolderPattern() {
+ }
+
+ public boolean accept(File var1) {
+ if(var1.isDirectory()) {
+ Matcher var2 = field_22214_a.matcher(var1.getName());
+ return var2.matches();
+ } else {
+ return false;
+ }
+ }
+
+ ChunkFolderPattern(Empty2 var1) {
+ this();
+ }
+}
diff --git a/src/net/minecraft/src/ChunkLoader.java b/src/net/minecraft/src/ChunkLoader.java
new file mode 100644
index 0000000..cef7390
--- /dev/null
+++ b/src/net/minecraft/src/ChunkLoader.java
@@ -0,0 +1,210 @@
+package net.minecraft.src;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+
+public class ChunkLoader implements IChunkLoader {
+ private File saveDir;
+ private boolean createIfNecessary;
+
+ public ChunkLoader(File var1, boolean var2) {
+ this.saveDir = var1;
+ this.createIfNecessary = var2;
+ }
+
+ private File chunkFileForXZ(int var1, int var2) {
+ String var3 = "c." + Integer.toString(var1, 36) + "." + Integer.toString(var2, 36) + ".dat";
+ String var4 = Integer.toString(var1 & 63, 36);
+ String var5 = Integer.toString(var2 & 63, 36);
+ File var6 = new File(this.saveDir, var4);
+ if(!var6.exists()) {
+ if(!this.createIfNecessary) {
+ return null;
+ }
+
+ var6.mkdir();
+ }
+
+ var6 = new File(var6, var5);
+ if(!var6.exists()) {
+ if(!this.createIfNecessary) {
+ return null;
+ }
+
+ var6.mkdir();
+ }
+
+ var6 = new File(var6, var3);
+ return !var6.exists() && !this.createIfNecessary ? null : var6;
+ }
+
+ public Chunk loadChunk(World var1, int var2, int var3) throws IOException {
+ File var4 = this.chunkFileForXZ(var2, var3);
+ if(var4 != null && var4.exists()) {
+ try {
+ FileInputStream var5 = new FileInputStream(var4);
+ NBTTagCompound var6 = CompressedStreamTools.func_770_a(var5);
+ if(!var6.hasKey("Level")) {
+ System.out.println("Chunk file at " + var2 + "," + var3 + " is missing level data, skipping");
+ return null;
+ }
+
+ if(!var6.getCompoundTag("Level").hasKey("Blocks")) {
+ System.out.println("Chunk file at " + var2 + "," + var3 + " is missing block data, skipping");
+ return null;
+ }
+
+ Chunk var7 = loadChunkIntoWorldFromCompound(var1, var6.getCompoundTag("Level"));
+ if(!var7.isAtLocation(var2, var3)) {
+ System.out.println("Chunk file at " + var2 + "," + var3 + " is in the wrong location; relocating. (Expected " + var2 + ", " + var3 + ", got " + var7.xPosition + ", " + var7.zPosition + ")");
+ var6.setInteger("xPos", var2);
+ var6.setInteger("zPos", var3);
+ var7 = loadChunkIntoWorldFromCompound(var1, var6.getCompoundTag("Level"));
+ }
+
+ var7.func_25083_h();
+ return var7;
+ } catch (Exception var8) {
+ var8.printStackTrace();
+ }
+ }
+
+ return null;
+ }
+
+ public void saveChunk(World var1, Chunk var2) throws IOException {
+ var1.checkSessionLock();
+ File var3 = this.chunkFileForXZ(var2.xPosition, var2.zPosition);
+ if(var3.exists()) {
+ WorldInfo var4 = var1.getWorldInfo();
+ var4.setSizeOnDisk(var4.getSizeOnDisk() - var3.length());
+ }
+
+ try {
+ File var10 = new File(this.saveDir, "tmp_chunk.dat");
+ FileOutputStream var5 = new FileOutputStream(var10);
+ NBTTagCompound var6 = new NBTTagCompound();
+ NBTTagCompound var7 = new NBTTagCompound();
+ var6.setTag("Level", var7);
+ storeChunkInCompound(var2, var1, var7);
+ CompressedStreamTools.writeGzippedCompoundToOutputStream(var6, var5);
+ var5.close();
+ if(var3.exists()) {
+ var3.delete();
+ }
+
+ var10.renameTo(var3);
+ WorldInfo var8 = var1.getWorldInfo();
+ var8.setSizeOnDisk(var8.getSizeOnDisk() + var3.length());
+ } catch (Exception var9) {
+ var9.printStackTrace();
+ }
+
+ }
+
+ public static void storeChunkInCompound(Chunk var0, World var1, NBTTagCompound var2) {
+ var1.checkSessionLock();
+ var2.setInteger("xPos", var0.xPosition);
+ var2.setInteger("zPos", var0.zPosition);
+ var2.setLong("LastUpdate", var1.getWorldTime());
+ var2.setByteArray("Blocks", var0.blocks);
+ var2.setByteArray("Data", var0.data.data);
+ var2.setByteArray("SkyLight", var0.skylightMap.data);
+ var2.setByteArray("BlockLight", var0.blocklightMap.data);
+ var2.setByteArray("HeightMap", var0.heightMap);
+ var2.setBoolean("TerrainPopulated", var0.isTerrainPopulated);
+ var0.hasEntities = false;
+ NBTTagList var3 = new NBTTagList();
+
+ Iterator var5;
+ NBTTagCompound var7;
+ for(int var4 = 0; var4 < var0.entities.length; ++var4) {
+ var5 = var0.entities[var4].iterator();
+
+ while(var5.hasNext()) {
+ Entity var6 = (Entity)var5.next();
+ var0.hasEntities = true;
+ var7 = new NBTTagCompound();
+ if(var6.addEntityID(var7)) {
+ var3.setTag(var7);
+ }
+ }
+ }
+
+ var2.setTag("Entities", var3);
+ NBTTagList var8 = new NBTTagList();
+ var5 = var0.chunkTileEntityMap.values().iterator();
+
+ while(var5.hasNext()) {
+ TileEntity var9 = (TileEntity)var5.next();
+ var7 = new NBTTagCompound();
+ var9.writeToNBT(var7);
+ var8.setTag(var7);
+ }
+
+ var2.setTag("TileEntities", var8);
+ }
+
+ public static Chunk loadChunkIntoWorldFromCompound(World var0, NBTTagCompound var1) {
+ int var2 = var1.getInteger("xPos");
+ int var3 = var1.getInteger("zPos");
+ Chunk var4 = new Chunk(var0, var2, var3);
+ var4.blocks = var1.getByteArray("Blocks");
+ var4.data = new NibbleArray(var1.getByteArray("Data"));
+ var4.skylightMap = new NibbleArray(var1.getByteArray("SkyLight"));
+ var4.blocklightMap = new NibbleArray(var1.getByteArray("BlockLight"));
+ var4.heightMap = var1.getByteArray("HeightMap");
+ var4.isTerrainPopulated = var1.getBoolean("TerrainPopulated");
+ if(!var4.data.isValid()) {
+ var4.data = new NibbleArray(var4.blocks.length);
+ }
+
+ if(var4.heightMap == null || !var4.skylightMap.isValid()) {
+ var4.heightMap = new byte[256];
+ var4.skylightMap = new NibbleArray(var4.blocks.length);
+ var4.func_353_b();
+ }
+
+ if(!var4.blocklightMap.isValid()) {
+ var4.blocklightMap = new NibbleArray(var4.blocks.length);
+ var4.func_348_a();
+ }
+
+ NBTTagList var5 = var1.getTagList("Entities");
+ if(var5 != null) {
+ for(int var6 = 0; var6 < var5.tagCount(); ++var6) {
+ NBTTagCompound var7 = (NBTTagCompound)var5.tagAt(var6);
+ Entity var8 = EntityList.createEntityFromNBT(var7, var0);
+ var4.hasEntities = true;
+ if(var8 != null) {
+ var4.addEntity(var8);
+ }
+ }
+ }
+
+ NBTTagList var10 = var1.getTagList("TileEntities");
+ if(var10 != null) {
+ for(int var11 = 0; var11 < var10.tagCount(); ++var11) {
+ NBTTagCompound var12 = (NBTTagCompound)var10.tagAt(var11);
+ TileEntity var9 = TileEntity.createAndLoadEntity(var12);
+ if(var9 != null) {
+ var4.addTileEntity(var9);
+ }
+ }
+ }
+
+ return var4;
+ }
+
+ public void func_661_a() {
+ }
+
+ public void saveExtraData() {
+ }
+
+ public void saveExtraChunkData(World var1, Chunk var2) throws IOException {
+ }
+}
diff --git a/src/net/minecraft/src/ChunkPosition.java b/src/net/minecraft/src/ChunkPosition.java
new file mode 100644
index 0000000..8b19854
--- /dev/null
+++ b/src/net/minecraft/src/ChunkPosition.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public class ChunkPosition {
+ public final int x;
+ public final int y;
+ public final int z;
+
+ public ChunkPosition(int var1, int var2, int var3) {
+ this.x = var1;
+ this.y = var2;
+ this.z = var3;
+ }
+
+ public boolean equals(Object var1) {
+ if(!(var1 instanceof ChunkPosition)) {
+ return false;
+ } else {
+ ChunkPosition var2 = (ChunkPosition)var1;
+ return var2.x == this.x && var2.y == this.y && var2.z == this.z;
+ }
+ }
+
+ public int hashCode() {
+ return this.x * 8976890 + this.y * 981131 + this.z;
+ }
+}
diff --git a/src/net/minecraft/src/ChunkProvider.java b/src/net/minecraft/src/ChunkProvider.java
new file mode 100644
index 0000000..e142731
--- /dev/null
+++ b/src/net/minecraft/src/ChunkProvider.java
@@ -0,0 +1,184 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class ChunkProvider implements IChunkProvider {
+ private Set field_28062_a = new HashSet();
+ private Chunk field_28061_b;
+ private IChunkProvider chunkGenerator;
+ private IChunkLoader field_28066_d;
+ private Map field_28065_e = new HashMap();
+ private List field_28064_f = new ArrayList();
+ private World worldObj;
+
+ public ChunkProvider(World var1, IChunkLoader var2, IChunkProvider var3) {
+ this.field_28061_b = new EmptyChunk(var1, new byte[-Short.MIN_VALUE], 0, 0);
+ this.worldObj = var1;
+ this.field_28066_d = var2;
+ this.chunkGenerator = var3;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ return this.field_28065_e.containsKey(Integer.valueOf(ChunkCoordIntPair.chunkXZ2Int(var1, var2)));
+ }
+
+ public Chunk loadChunk(int var1, int var2) {
+ int var3 = ChunkCoordIntPair.chunkXZ2Int(var1, var2);
+ this.field_28062_a.remove(Integer.valueOf(var3));
+ Chunk var4 = (Chunk)this.field_28065_e.get(Integer.valueOf(var3));
+ if(var4 == null) {
+ var4 = this.func_28058_d(var1, var2);
+ if(var4 == null) {
+ if(this.chunkGenerator == null) {
+ var4 = this.field_28061_b;
+ } else {
+ var4 = this.chunkGenerator.provideChunk(var1, var2);
+ }
+ }
+
+ this.field_28065_e.put(Integer.valueOf(var3), var4);
+ this.field_28064_f.add(var4);
+ if(var4 != null) {
+ var4.func_4053_c();
+ var4.onChunkLoad();
+ }
+
+ if(!var4.isTerrainPopulated && this.chunkExists(var1 + 1, var2 + 1) && this.chunkExists(var1, var2 + 1) && this.chunkExists(var1 + 1, var2)) {
+ this.populate(this, var1, var2);
+ }
+
+ if(this.chunkExists(var1 - 1, var2) && !this.provideChunk(var1 - 1, var2).isTerrainPopulated && this.chunkExists(var1 - 1, var2 + 1) && this.chunkExists(var1, var2 + 1) && this.chunkExists(var1 - 1, var2)) {
+ this.populate(this, var1 - 1, var2);
+ }
+
+ if(this.chunkExists(var1, var2 - 1) && !this.provideChunk(var1, var2 - 1).isTerrainPopulated && this.chunkExists(var1 + 1, var2 - 1) && this.chunkExists(var1, var2 - 1) && this.chunkExists(var1 + 1, var2)) {
+ this.populate(this, var1, var2 - 1);
+ }
+
+ if(this.chunkExists(var1 - 1, var2 - 1) && !this.provideChunk(var1 - 1, var2 - 1).isTerrainPopulated && this.chunkExists(var1 - 1, var2 - 1) && this.chunkExists(var1, var2 - 1) && this.chunkExists(var1 - 1, var2)) {
+ this.populate(this, var1 - 1, var2 - 1);
+ }
+ }
+
+ return var4;
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ Chunk var3 = (Chunk)this.field_28065_e.get(Integer.valueOf(ChunkCoordIntPair.chunkXZ2Int(var1, var2)));
+ return var3 == null ? this.loadChunk(var1, var2) : var3;
+ }
+
+ private Chunk func_28058_d(int var1, int var2) {
+ if(this.field_28066_d == null) {
+ return null;
+ } else {
+ try {
+ Chunk var3 = this.field_28066_d.loadChunk(this.worldObj, var1, var2);
+ if(var3 != null) {
+ var3.lastSaveTime = this.worldObj.getWorldTime();
+ }
+
+ return var3;
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ return null;
+ }
+ }
+ }
+
+ private void func_28060_a(Chunk var1) {
+ if(this.field_28066_d != null) {
+ try {
+ this.field_28066_d.saveExtraChunkData(this.worldObj, var1);
+ } catch (Exception var3) {
+ var3.printStackTrace();
+ }
+
+ }
+ }
+
+ private void func_28059_b(Chunk var1) {
+ if(this.field_28066_d != null) {
+ try {
+ var1.lastSaveTime = this.worldObj.getWorldTime();
+ this.field_28066_d.saveChunk(this.worldObj, var1);
+ } catch (IOException var3) {
+ var3.printStackTrace();
+ }
+
+ }
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ Chunk var4 = this.provideChunk(var2, var3);
+ if(!var4.isTerrainPopulated) {
+ var4.isTerrainPopulated = true;
+ if(this.chunkGenerator != null) {
+ this.chunkGenerator.populate(var1, var2, var3);
+ var4.setChunkModified();
+ }
+ }
+
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ int var3 = 0;
+
+ for(int var4 = 0; var4 < this.field_28064_f.size(); ++var4) {
+ Chunk var5 = (Chunk)this.field_28064_f.get(var4);
+ if(var1 && !var5.neverSave) {
+ this.func_28060_a(var5);
+ }
+
+ if(var5.needsSaving(var1)) {
+ this.func_28059_b(var5);
+ var5.isModified = false;
+ ++var3;
+ if(var3 == 24 && !var1) {
+ return false;
+ }
+ }
+ }
+
+ if(var1) {
+ if(this.field_28066_d == null) {
+ return true;
+ }
+
+ this.field_28066_d.saveExtraData();
+ }
+
+ return true;
+ }
+
+ public boolean func_361_a() {
+ for(int var1 = 0; var1 < 100; ++var1) {
+ if(!this.field_28062_a.isEmpty()) {
+ Integer var2 = (Integer)this.field_28062_a.iterator().next();
+ Chunk var3 = (Chunk)this.field_28065_e.get(var2);
+ var3.onChunkUnload();
+ this.func_28059_b(var3);
+ this.func_28060_a(var3);
+ this.field_28062_a.remove(var2);
+ this.field_28065_e.remove(var2);
+ this.field_28064_f.remove(var3);
+ }
+ }
+
+ if(this.field_28066_d != null) {
+ this.field_28066_d.func_661_a();
+ }
+
+ return this.chunkGenerator.func_361_a();
+ }
+
+ public boolean func_364_b() {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/ChunkProviderGenerate.java b/src/net/minecraft/src/ChunkProviderGenerate.java
new file mode 100644
index 0000000..9be605a
--- /dev/null
+++ b/src/net/minecraft/src/ChunkProviderGenerate.java
@@ -0,0 +1,616 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class ChunkProviderGenerate implements IChunkProvider {
+ private Random rand;
+ private NoiseGeneratorOctaves field_705_k;
+ private NoiseGeneratorOctaves field_704_l;
+ private NoiseGeneratorOctaves field_703_m;
+ private NoiseGeneratorOctaves field_702_n;
+ private NoiseGeneratorOctaves field_701_o;
+ public NoiseGeneratorOctaves field_715_a;
+ public NoiseGeneratorOctaves field_714_b;
+ public NoiseGeneratorOctaves mobSpawnerNoise;
+ private World worldObj;
+ private double[] field_4224_q;
+ private double[] sandNoise = new double[256];
+ private double[] gravelNoise = new double[256];
+ private double[] stoneNoise = new double[256];
+ private MapGenBase field_695_u = new MapGenCaves();
+ private BiomeGenBase[] biomesForGeneration;
+ double[] field_4229_d;
+ double[] field_4228_e;
+ double[] field_4227_f;
+ double[] field_4226_g;
+ double[] field_4225_h;
+ int[][] field_707_i = new int[32][32];
+ private double[] generatedTemperatures;
+
+ public ChunkProviderGenerate(World var1, long var2) {
+ this.worldObj = var1;
+ this.rand = new Random(var2);
+ this.field_705_k = new NoiseGeneratorOctaves(this.rand, 16);
+ this.field_704_l = new NoiseGeneratorOctaves(this.rand, 16);
+ this.field_703_m = new NoiseGeneratorOctaves(this.rand, 8);
+ this.field_702_n = new NoiseGeneratorOctaves(this.rand, 4);
+ this.field_701_o = new NoiseGeneratorOctaves(this.rand, 4);
+ this.field_715_a = new NoiseGeneratorOctaves(this.rand, 10);
+ this.field_714_b = new NoiseGeneratorOctaves(this.rand, 16);
+ this.mobSpawnerNoise = new NoiseGeneratorOctaves(this.rand, 8);
+ }
+
+ public void generateTerrain(int var1, int var2, byte[] var3, BiomeGenBase[] var4, double[] var5) {
+ byte var6 = 4;
+ byte var7 = 64;
+ int var8 = var6 + 1;
+ byte var9 = 17;
+ int var10 = var6 + 1;
+ this.field_4224_q = this.func_4058_a(this.field_4224_q, var1 * var6, 0, var2 * var6, var8, var9, var10);
+
+ for(int var11 = 0; var11 < var6; ++var11) {
+ for(int var12 = 0; var12 < var6; ++var12) {
+ for(int var13 = 0; var13 < 16; ++var13) {
+ double var14 = 0.125D;
+ double var16 = this.field_4224_q[((var11 + 0) * var10 + var12 + 0) * var9 + var13 + 0];
+ double var18 = this.field_4224_q[((var11 + 0) * var10 + var12 + 1) * var9 + var13 + 0];
+ double var20 = this.field_4224_q[((var11 + 1) * var10 + var12 + 0) * var9 + var13 + 0];
+ double var22 = this.field_4224_q[((var11 + 1) * var10 + var12 + 1) * var9 + var13 + 0];
+ double var24 = (this.field_4224_q[((var11 + 0) * var10 + var12 + 0) * var9 + var13 + 1] - var16) * var14;
+ double var26 = (this.field_4224_q[((var11 + 0) * var10 + var12 + 1) * var9 + var13 + 1] - var18) * var14;
+ double var28 = (this.field_4224_q[((var11 + 1) * var10 + var12 + 0) * var9 + var13 + 1] - var20) * var14;
+ double var30 = (this.field_4224_q[((var11 + 1) * var10 + var12 + 1) * var9 + var13 + 1] - var22) * var14;
+
+ for(int var32 = 0; var32 < 8; ++var32) {
+ double var33 = 0.25D;
+ double var35 = var16;
+ double var37 = var18;
+ double var39 = (var20 - var16) * var33;
+ double var41 = (var22 - var18) * var33;
+
+ for(int var43 = 0; var43 < 4; ++var43) {
+ int var44 = var43 + var11 * 4 << 11 | 0 + var12 * 4 << 7 | var13 * 8 + var32;
+ short var45 = 128;
+ double var46 = 0.25D;
+ double var48 = var35;
+ double var50 = (var37 - var35) * var46;
+
+ for(int var52 = 0; var52 < 4; ++var52) {
+ double var53 = var5[(var11 * 4 + var43) * 16 + var12 * 4 + var52];
+ int var55 = 0;
+ if(var13 * 8 + var32 < var7) {
+ if(var53 < 0.5D && var13 * 8 + var32 >= var7 - 1) {
+ var55 = Block.ice.blockID;
+ } else {
+ var55 = Block.waterStill.blockID;
+ }
+ }
+
+ if(var48 > 0.0D) {
+ var55 = Block.stone.blockID;
+ }
+
+ var3[var44] = (byte)var55;
+ var44 += var45;
+ var48 += var50;
+ }
+
+ var35 += var39;
+ var37 += var41;
+ }
+
+ var16 += var24;
+ var18 += var26;
+ var20 += var28;
+ var22 += var30;
+ }
+ }
+ }
+ }
+
+ }
+
+ public void replaceBlocksForBiome(int var1, int var2, byte[] var3, BiomeGenBase[] var4) {
+ byte var5 = 64;
+ double var6 = 1.0D / 32.0D;
+ this.sandNoise = this.field_702_n.generateNoiseOctaves(this.sandNoise, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var6, var6, 1.0D);
+ this.gravelNoise = this.field_702_n.generateNoiseOctaves(this.gravelNoise, (double)(var1 * 16), 109.0134D, (double)(var2 * 16), 16, 1, 16, var6, 1.0D, var6);
+ this.stoneNoise = this.field_701_o.generateNoiseOctaves(this.stoneNoise, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var6 * 2.0D, var6 * 2.0D, var6 * 2.0D);
+
+ for(int var8 = 0; var8 < 16; ++var8) {
+ for(int var9 = 0; var9 < 16; ++var9) {
+ BiomeGenBase var10 = var4[var8 + var9 * 16];
+ boolean var11 = this.sandNoise[var8 + var9 * 16] + this.rand.nextDouble() * 0.2D > 0.0D;
+ boolean var12 = this.gravelNoise[var8 + var9 * 16] + this.rand.nextDouble() * 0.2D > 3.0D;
+ int var13 = (int)(this.stoneNoise[var8 + var9 * 16] / 3.0D + 3.0D + this.rand.nextDouble() * 0.25D);
+ int var14 = -1;
+ byte var15 = var10.topBlock;
+ byte var16 = var10.fillerBlock;
+
+ for(int var17 = 127; var17 >= 0; --var17) {
+ int var18 = (var9 * 16 + var8) * 128 + var17;
+ if(var17 <= 0 + this.rand.nextInt(5)) {
+ var3[var18] = (byte)Block.bedrock.blockID;
+ } else {
+ byte var19 = var3[var18];
+ if(var19 == 0) {
+ var14 = -1;
+ } else if(var19 == Block.stone.blockID) {
+ if(var14 == -1) {
+ if(var13 <= 0) {
+ var15 = 0;
+ var16 = (byte)Block.stone.blockID;
+ } else if(var17 >= var5 - 4 && var17 <= var5 + 1) {
+ var15 = var10.topBlock;
+ var16 = var10.fillerBlock;
+ if(var12) {
+ var15 = 0;
+ }
+
+ if(var12) {
+ var16 = (byte)Block.gravel.blockID;
+ }
+
+ if(var11) {
+ var15 = (byte)Block.sand.blockID;
+ }
+
+ if(var11) {
+ var16 = (byte)Block.sand.blockID;
+ }
+ }
+
+ if(var17 < var5 && var15 == 0) {
+ var15 = (byte)Block.waterStill.blockID;
+ }
+
+ var14 = var13;
+ if(var17 >= var5 - 1) {
+ var3[var18] = var15;
+ } else {
+ var3[var18] = var16;
+ }
+ } else if(var14 > 0) {
+ --var14;
+ var3[var18] = var16;
+ if(var14 == 0 && var16 == Block.sand.blockID) {
+ var14 = this.rand.nextInt(4);
+ var16 = (byte)Block.sandStone.blockID;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ public Chunk loadChunk(int var1, int var2) {
+ return this.provideChunk(var1, var2);
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ this.rand.setSeed((long)var1 * 341873128712L + (long)var2 * 132897987541L);
+ byte[] var3 = new byte[-Short.MIN_VALUE];
+ Chunk var4 = new Chunk(this.worldObj, var3, var1, var2);
+ this.biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, var1 * 16, var2 * 16, 16, 16);
+ double[] var5 = this.worldObj.getWorldChunkManager().temperature;
+ this.generateTerrain(var1, var2, var3, this.biomesForGeneration, var5);
+ this.replaceBlocksForBiome(var1, var2, var3, this.biomesForGeneration);
+ this.field_695_u.func_667_a(this, this.worldObj, var1, var2, var3);
+ var4.func_353_b();
+ return var4;
+ }
+
+ private double[] func_4058_a(double[] var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ if(var1 == null) {
+ var1 = new double[var5 * var6 * var7];
+ }
+
+ double var8 = 684.412D;
+ double var10 = 684.412D;
+ double[] var12 = this.worldObj.getWorldChunkManager().temperature;
+ double[] var13 = this.worldObj.getWorldChunkManager().humidity;
+ this.field_4226_g = this.field_715_a.func_4103_a(this.field_4226_g, var2, var4, var5, var7, 1.121D, 1.121D, 0.5D);
+ this.field_4225_h = this.field_714_b.func_4103_a(this.field_4225_h, var2, var4, var5, var7, 200.0D, 200.0D, 0.5D);
+ this.field_4229_d = this.field_703_m.generateNoiseOctaves(this.field_4229_d, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8 / 80.0D, var10 / 160.0D, var8 / 80.0D);
+ this.field_4228_e = this.field_705_k.generateNoiseOctaves(this.field_4228_e, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ this.field_4227_f = this.field_704_l.generateNoiseOctaves(this.field_4227_f, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ int var14 = 0;
+ int var15 = 0;
+ int var16 = 16 / var5;
+
+ for(int var17 = 0; var17 < var5; ++var17) {
+ int var18 = var17 * var16 + var16 / 2;
+
+ for(int var19 = 0; var19 < var7; ++var19) {
+ int var20 = var19 * var16 + var16 / 2;
+ double var21 = var12[var18 * 16 + var20];
+ double var23 = var13[var18 * 16 + var20] * var21;
+ double var25 = 1.0D - var23;
+ var25 *= var25;
+ var25 *= var25;
+ var25 = 1.0D - var25;
+ double var27 = (this.field_4226_g[var15] + 256.0D) / 512.0D;
+ var27 *= var25;
+ if(var27 > 1.0D) {
+ var27 = 1.0D;
+ }
+
+ double var29 = this.field_4225_h[var15] / 8000.0D;
+ if(var29 < 0.0D) {
+ var29 = -var29 * 0.3D;
+ }
+
+ var29 = var29 * 3.0D - 2.0D;
+ if(var29 < 0.0D) {
+ var29 /= 2.0D;
+ if(var29 < -1.0D) {
+ var29 = -1.0D;
+ }
+
+ var29 /= 1.4D;
+ var29 /= 2.0D;
+ var27 = 0.0D;
+ } else {
+ if(var29 > 1.0D) {
+ var29 = 1.0D;
+ }
+
+ var29 /= 8.0D;
+ }
+
+ if(var27 < 0.0D) {
+ var27 = 0.0D;
+ }
+
+ var27 += 0.5D;
+ var29 = var29 * (double)var6 / 16.0D;
+ double var31 = (double)var6 / 2.0D + var29 * 4.0D;
+ ++var15;
+
+ for(int var33 = 0; var33 < var6; ++var33) {
+ double var34 = 0.0D;
+ double var36 = ((double)var33 - var31) * 12.0D / var27;
+ if(var36 < 0.0D) {
+ var36 *= 4.0D;
+ }
+
+ double var38 = this.field_4228_e[var14] / 512.0D;
+ double var40 = this.field_4227_f[var14] / 512.0D;
+ double var42 = (this.field_4229_d[var14] / 10.0D + 1.0D) / 2.0D;
+ if(var42 < 0.0D) {
+ var34 = var38;
+ } else if(var42 > 1.0D) {
+ var34 = var40;
+ } else {
+ var34 = var38 + (var40 - var38) * var42;
+ }
+
+ var34 -= var36;
+ if(var33 > var6 - 4) {
+ double var44 = (double)((float)(var33 - (var6 - 4)) / 3.0F);
+ var34 = var34 * (1.0D - var44) + -10.0D * var44;
+ }
+
+ var1[var14] = var34;
+ ++var14;
+ }
+ }
+ }
+
+ return var1;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ return true;
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ BlockSand.fallInstantly = true;
+ int var4 = var2 * 16;
+ int var5 = var3 * 16;
+ BiomeGenBase var6 = this.worldObj.getWorldChunkManager().getBiomeGenAt(var4 + 16, var5 + 16);
+ this.rand.setSeed(this.worldObj.getRandomSeed());
+ long var7 = this.rand.nextLong() / 2L * 2L + 1L;
+ long var9 = this.rand.nextLong() / 2L * 2L + 1L;
+ this.rand.setSeed((long)var2 * var7 + (long)var3 * var9 ^ this.worldObj.getRandomSeed());
+ double var11 = 0.25D;
+ int var13;
+ int var14;
+ int var15;
+ if(this.rand.nextInt(4) == 0) {
+ var13 = var4 + this.rand.nextInt(16) + 8;
+ var14 = this.rand.nextInt(128);
+ var15 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenLakes(Block.waterStill.blockID)).generate(this.worldObj, this.rand, var13, var14, var15);
+ }
+
+ if(this.rand.nextInt(8) == 0) {
+ var13 = var4 + this.rand.nextInt(16) + 8;
+ var14 = this.rand.nextInt(this.rand.nextInt(120) + 8);
+ var15 = var5 + this.rand.nextInt(16) + 8;
+ if(var14 < 64 || this.rand.nextInt(10) == 0) {
+ (new WorldGenLakes(Block.lavaStill.blockID)).generate(this.worldObj, this.rand, var13, var14, var15);
+ }
+ }
+
+ int var16;
+ for(var13 = 0; var13 < 8; ++var13) {
+ var14 = var4 + this.rand.nextInt(16) + 8;
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenDungeons()).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 10; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenClay(32)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 20; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.dirt.blockID, 32)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 10; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.gravel.blockID, 32)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 20; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreCoal.blockID, 16)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 20; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(64);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreIron.blockID, 8)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 2; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(32);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreGold.blockID, 8)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 8; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(16);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreRedstone.blockID, 7)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 1; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(16);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreDiamond.blockID, 7)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 1; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(16) + this.rand.nextInt(16);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreLapis.blockID, 6)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ var11 = 0.5D;
+ var13 = (int)((this.mobSpawnerNoise.func_647_a((double)var4 * var11, (double)var5 * var11) / 8.0D + this.rand.nextDouble() * 4.0D + 4.0D) / 3.0D);
+ var14 = 0;
+ if(this.rand.nextInt(10) == 0) {
+ ++var14;
+ }
+
+ if(var6 == BiomeGenBase.forest) {
+ var14 += var13 + 5;
+ }
+
+ if(var6 == BiomeGenBase.rainforest) {
+ var14 += var13 + 5;
+ }
+
+ if(var6 == BiomeGenBase.seasonalForest) {
+ var14 += var13 + 2;
+ }
+
+ if(var6 == BiomeGenBase.taiga) {
+ var14 += var13 + 5;
+ }
+
+ if(var6 == BiomeGenBase.desert) {
+ var14 -= 20;
+ }
+
+ if(var6 == BiomeGenBase.tundra) {
+ var14 -= 20;
+ }
+
+ if(var6 == BiomeGenBase.plains) {
+ var14 -= 20;
+ }
+
+ int var17;
+ for(var15 = 0; var15 < var14; ++var15) {
+ var16 = var4 + this.rand.nextInt(16) + 8;
+ var17 = var5 + this.rand.nextInt(16) + 8;
+ WorldGenerator var18 = var6.getRandomWorldGenForTrees(this.rand);
+ var18.func_420_a(1.0D, 1.0D, 1.0D);
+ var18.generate(this.worldObj, this.rand, var16, this.worldObj.getHeightValue(var16, var17), var17);
+ }
+
+ byte var27 = 0;
+ if(var6 == BiomeGenBase.forest) {
+ var27 = 2;
+ }
+
+ if(var6 == BiomeGenBase.seasonalForest) {
+ var27 = 4;
+ }
+
+ if(var6 == BiomeGenBase.taiga) {
+ var27 = 2;
+ }
+
+ if(var6 == BiomeGenBase.plains) {
+ var27 = 3;
+ }
+
+ int var19;
+ int var25;
+ for(var16 = 0; var16 < var27; ++var16) {
+ var17 = var4 + this.rand.nextInt(16) + 8;
+ var25 = this.rand.nextInt(128);
+ var19 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.plantYellow.blockID)).generate(this.worldObj, this.rand, var17, var25, var19);
+ }
+
+ byte var28 = 0;
+ if(var6 == BiomeGenBase.forest) {
+ var28 = 2;
+ }
+
+ if(var6 == BiomeGenBase.rainforest) {
+ var28 = 10;
+ }
+
+ if(var6 == BiomeGenBase.seasonalForest) {
+ var28 = 2;
+ }
+
+ if(var6 == BiomeGenBase.taiga) {
+ var28 = 1;
+ }
+
+ if(var6 == BiomeGenBase.plains) {
+ var28 = 10;
+ }
+
+ int var20;
+ int var21;
+ for(var17 = 0; var17 < var28; ++var17) {
+ byte var26 = 1;
+ if(var6 == BiomeGenBase.rainforest && this.rand.nextInt(3) != 0) {
+ var26 = 2;
+ }
+
+ var19 = var4 + this.rand.nextInt(16) + 8;
+ var20 = this.rand.nextInt(128);
+ var21 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenTallGrass(Block.tallGrass.blockID, var26)).generate(this.worldObj, this.rand, var19, var20, var21);
+ }
+
+ var28 = 0;
+ if(var6 == BiomeGenBase.desert) {
+ var28 = 2;
+ }
+
+ for(var17 = 0; var17 < var28; ++var17) {
+ var25 = var4 + this.rand.nextInt(16) + 8;
+ var19 = this.rand.nextInt(128);
+ var20 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenDeadBush(Block.deadBush.blockID)).generate(this.worldObj, this.rand, var25, var19, var20);
+ }
+
+ if(this.rand.nextInt(2) == 0) {
+ var17 = var4 + this.rand.nextInt(16) + 8;
+ var25 = this.rand.nextInt(128);
+ var19 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.plantRed.blockID)).generate(this.worldObj, this.rand, var17, var25, var19);
+ }
+
+ if(this.rand.nextInt(4) == 0) {
+ var17 = var4 + this.rand.nextInt(16) + 8;
+ var25 = this.rand.nextInt(128);
+ var19 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomBrown.blockID)).generate(this.worldObj, this.rand, var17, var25, var19);
+ }
+
+ if(this.rand.nextInt(8) == 0) {
+ var17 = var4 + this.rand.nextInt(16) + 8;
+ var25 = this.rand.nextInt(128);
+ var19 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomRed.blockID)).generate(this.worldObj, this.rand, var17, var25, var19);
+ }
+
+ for(var17 = 0; var17 < 10; ++var17) {
+ var25 = var4 + this.rand.nextInt(16) + 8;
+ var19 = this.rand.nextInt(128);
+ var20 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenReed()).generate(this.worldObj, this.rand, var25, var19, var20);
+ }
+
+ if(this.rand.nextInt(32) == 0) {
+ var17 = var4 + this.rand.nextInt(16) + 8;
+ var25 = this.rand.nextInt(128);
+ var19 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenPumpkin()).generate(this.worldObj, this.rand, var17, var25, var19);
+ }
+
+ var17 = 0;
+ if(var6 == BiomeGenBase.desert) {
+ var17 += 10;
+ }
+
+ for(var25 = 0; var25 < var17; ++var25) {
+ var19 = var4 + this.rand.nextInt(16) + 8;
+ var20 = this.rand.nextInt(128);
+ var21 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenCactus()).generate(this.worldObj, this.rand, var19, var20, var21);
+ }
+
+ for(var25 = 0; var25 < 50; ++var25) {
+ var19 = var4 + this.rand.nextInt(16) + 8;
+ var20 = this.rand.nextInt(this.rand.nextInt(120) + 8);
+ var21 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenLiquids(Block.waterMoving.blockID)).generate(this.worldObj, this.rand, var19, var20, var21);
+ }
+
+ for(var25 = 0; var25 < 20; ++var25) {
+ var19 = var4 + this.rand.nextInt(16) + 8;
+ var20 = this.rand.nextInt(this.rand.nextInt(this.rand.nextInt(112) + 8) + 8);
+ var21 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenLiquids(Block.lavaMoving.blockID)).generate(this.worldObj, this.rand, var19, var20, var21);
+ }
+
+ this.generatedTemperatures = this.worldObj.getWorldChunkManager().getTemperatures(this.generatedTemperatures, var4 + 8, var5 + 8, 16, 16);
+
+ for(var25 = var4 + 8; var25 < var4 + 8 + 16; ++var25) {
+ for(var19 = var5 + 8; var19 < var5 + 8 + 16; ++var19) {
+ var20 = var25 - (var4 + 8);
+ var21 = var19 - (var5 + 8);
+ int var22 = this.worldObj.getTopSolidOrLiquidBlock(var25, var19);
+ double var23 = this.generatedTemperatures[var20 * 16 + var21] - (double)(var22 - 64) / 64.0D * 0.3D;
+ if(var23 < 0.5D && var22 > 0 && var22 < 128 && this.worldObj.isAirBlock(var25, var22, var19) && this.worldObj.getBlockMaterial(var25, var22 - 1, var19).getIsSolid() && this.worldObj.getBlockMaterial(var25, var22 - 1, var19) != Material.ice) {
+ this.worldObj.setBlockWithNotify(var25, var22, var19, Block.snow.blockID);
+ }
+ }
+ }
+
+ BlockSand.fallInstantly = false;
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ return true;
+ }
+
+ public boolean func_361_a() {
+ return false;
+ }
+
+ public boolean func_364_b() {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/ChunkProviderHell.java b/src/net/minecraft/src/ChunkProviderHell.java
new file mode 100644
index 0000000..b79effc
--- /dev/null
+++ b/src/net/minecraft/src/ChunkProviderHell.java
@@ -0,0 +1,372 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class ChunkProviderHell implements IChunkProvider {
+ private Random hellRNG;
+ private NoiseGeneratorOctaves field_4240_i;
+ private NoiseGeneratorOctaves field_4239_j;
+ private NoiseGeneratorOctaves field_4238_k;
+ private NoiseGeneratorOctaves field_4237_l;
+ private NoiseGeneratorOctaves field_4236_m;
+ public NoiseGeneratorOctaves field_4248_a;
+ public NoiseGeneratorOctaves field_4247_b;
+ private World field_4235_n;
+ private double[] field_4234_o;
+ private double[] field_4233_p = new double[256];
+ private double[] field_4232_q = new double[256];
+ private double[] field_4231_r = new double[256];
+ private MapGenBase field_4230_s = new MapGenCavesHell();
+ double[] field_4246_c;
+ double[] field_4245_d;
+ double[] field_4244_e;
+ double[] field_4243_f;
+ double[] field_4242_g;
+
+ public ChunkProviderHell(World var1, long var2) {
+ this.field_4235_n = var1;
+ this.hellRNG = new Random(var2);
+ this.field_4240_i = new NoiseGeneratorOctaves(this.hellRNG, 16);
+ this.field_4239_j = new NoiseGeneratorOctaves(this.hellRNG, 16);
+ this.field_4238_k = new NoiseGeneratorOctaves(this.hellRNG, 8);
+ this.field_4237_l = new NoiseGeneratorOctaves(this.hellRNG, 4);
+ this.field_4236_m = new NoiseGeneratorOctaves(this.hellRNG, 4);
+ this.field_4248_a = new NoiseGeneratorOctaves(this.hellRNG, 10);
+ this.field_4247_b = new NoiseGeneratorOctaves(this.hellRNG, 16);
+ }
+
+ public void func_4062_a(int var1, int var2, byte[] var3) {
+ byte var4 = 4;
+ byte var5 = 32;
+ int var6 = var4 + 1;
+ byte var7 = 17;
+ int var8 = var4 + 1;
+ this.field_4234_o = this.func_4060_a(this.field_4234_o, var1 * var4, 0, var2 * var4, var6, var7, var8);
+
+ for(int var9 = 0; var9 < var4; ++var9) {
+ for(int var10 = 0; var10 < var4; ++var10) {
+ for(int var11 = 0; var11 < 16; ++var11) {
+ double var12 = 0.125D;
+ double var14 = this.field_4234_o[((var9 + 0) * var8 + var10 + 0) * var7 + var11 + 0];
+ double var16 = this.field_4234_o[((var9 + 0) * var8 + var10 + 1) * var7 + var11 + 0];
+ double var18 = this.field_4234_o[((var9 + 1) * var8 + var10 + 0) * var7 + var11 + 0];
+ double var20 = this.field_4234_o[((var9 + 1) * var8 + var10 + 1) * var7 + var11 + 0];
+ double var22 = (this.field_4234_o[((var9 + 0) * var8 + var10 + 0) * var7 + var11 + 1] - var14) * var12;
+ double var24 = (this.field_4234_o[((var9 + 0) * var8 + var10 + 1) * var7 + var11 + 1] - var16) * var12;
+ double var26 = (this.field_4234_o[((var9 + 1) * var8 + var10 + 0) * var7 + var11 + 1] - var18) * var12;
+ double var28 = (this.field_4234_o[((var9 + 1) * var8 + var10 + 1) * var7 + var11 + 1] - var20) * var12;
+
+ for(int var30 = 0; var30 < 8; ++var30) {
+ double var31 = 0.25D;
+ double var33 = var14;
+ double var35 = var16;
+ double var37 = (var18 - var14) * var31;
+ double var39 = (var20 - var16) * var31;
+
+ for(int var41 = 0; var41 < 4; ++var41) {
+ int var42 = var41 + var9 * 4 << 11 | 0 + var10 * 4 << 7 | var11 * 8 + var30;
+ short var43 = 128;
+ double var44 = 0.25D;
+ double var46 = var33;
+ double var48 = (var35 - var33) * var44;
+
+ for(int var50 = 0; var50 < 4; ++var50) {
+ int var51 = 0;
+ if(var11 * 8 + var30 < var5) {
+ var51 = Block.lavaStill.blockID;
+ }
+
+ if(var46 > 0.0D) {
+ var51 = Block.bloodStone.blockID;
+ }
+
+ var3[var42] = (byte)var51;
+ var42 += var43;
+ var46 += var48;
+ }
+
+ var33 += var37;
+ var35 += var39;
+ }
+
+ var14 += var22;
+ var16 += var24;
+ var18 += var26;
+ var20 += var28;
+ }
+ }
+ }
+ }
+
+ }
+
+ public void func_4061_b(int var1, int var2, byte[] var3) {
+ byte var4 = 64;
+ double var5 = 1.0D / 32.0D;
+ this.field_4233_p = this.field_4237_l.generateNoiseOctaves(this.field_4233_p, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var5, var5, 1.0D);
+ this.field_4232_q = this.field_4237_l.generateNoiseOctaves(this.field_4232_q, (double)(var1 * 16), 109.0134D, (double)(var2 * 16), 16, 1, 16, var5, 1.0D, var5);
+ this.field_4231_r = this.field_4236_m.generateNoiseOctaves(this.field_4231_r, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var5 * 2.0D, var5 * 2.0D, var5 * 2.0D);
+
+ for(int var7 = 0; var7 < 16; ++var7) {
+ for(int var8 = 0; var8 < 16; ++var8) {
+ boolean var9 = this.field_4233_p[var7 + var8 * 16] + this.hellRNG.nextDouble() * 0.2D > 0.0D;
+ boolean var10 = this.field_4232_q[var7 + var8 * 16] + this.hellRNG.nextDouble() * 0.2D > 0.0D;
+ int var11 = (int)(this.field_4231_r[var7 + var8 * 16] / 3.0D + 3.0D + this.hellRNG.nextDouble() * 0.25D);
+ int var12 = -1;
+ byte var13 = (byte)Block.bloodStone.blockID;
+ byte var14 = (byte)Block.bloodStone.blockID;
+
+ for(int var15 = 127; var15 >= 0; --var15) {
+ int var16 = (var8 * 16 + var7) * 128 + var15;
+ if(var15 >= 127 - this.hellRNG.nextInt(5)) {
+ var3[var16] = (byte)Block.bedrock.blockID;
+ } else if(var15 <= 0 + this.hellRNG.nextInt(5)) {
+ var3[var16] = (byte)Block.bedrock.blockID;
+ } else {
+ byte var17 = var3[var16];
+ if(var17 == 0) {
+ var12 = -1;
+ } else if(var17 == Block.bloodStone.blockID) {
+ if(var12 == -1) {
+ if(var11 <= 0) {
+ var13 = 0;
+ var14 = (byte)Block.bloodStone.blockID;
+ } else if(var15 >= var4 - 4 && var15 <= var4 + 1) {
+ var13 = (byte)Block.bloodStone.blockID;
+ var14 = (byte)Block.bloodStone.blockID;
+ if(var10) {
+ var13 = (byte)Block.gravel.blockID;
+ }
+
+ if(var10) {
+ var14 = (byte)Block.bloodStone.blockID;
+ }
+
+ if(var9) {
+ var13 = (byte)Block.slowSand.blockID;
+ }
+
+ if(var9) {
+ var14 = (byte)Block.slowSand.blockID;
+ }
+ }
+
+ if(var15 < var4 && var13 == 0) {
+ var13 = (byte)Block.lavaStill.blockID;
+ }
+
+ var12 = var11;
+ if(var15 >= var4 - 1) {
+ var3[var16] = var13;
+ } else {
+ var3[var16] = var14;
+ }
+ } else if(var12 > 0) {
+ --var12;
+ var3[var16] = var14;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ public Chunk loadChunk(int var1, int var2) {
+ return this.provideChunk(var1, var2);
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ this.hellRNG.setSeed((long)var1 * 341873128712L + (long)var2 * 132897987541L);
+ byte[] var3 = new byte[-Short.MIN_VALUE];
+ this.func_4062_a(var1, var2, var3);
+ this.func_4061_b(var1, var2, var3);
+ this.field_4230_s.func_667_a(this, this.field_4235_n, var1, var2, var3);
+ Chunk var4 = new Chunk(this.field_4235_n, var3, var1, var2);
+ return var4;
+ }
+
+ private double[] func_4060_a(double[] var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ if(var1 == null) {
+ var1 = new double[var5 * var6 * var7];
+ }
+
+ double var8 = 684.412D;
+ double var10 = 2053.236D;
+ this.field_4243_f = this.field_4248_a.generateNoiseOctaves(this.field_4243_f, (double)var2, (double)var3, (double)var4, var5, 1, var7, 1.0D, 0.0D, 1.0D);
+ this.field_4242_g = this.field_4247_b.generateNoiseOctaves(this.field_4242_g, (double)var2, (double)var3, (double)var4, var5, 1, var7, 100.0D, 0.0D, 100.0D);
+ this.field_4246_c = this.field_4238_k.generateNoiseOctaves(this.field_4246_c, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8 / 80.0D, var10 / 60.0D, var8 / 80.0D);
+ this.field_4245_d = this.field_4240_i.generateNoiseOctaves(this.field_4245_d, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ this.field_4244_e = this.field_4239_j.generateNoiseOctaves(this.field_4244_e, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ int var12 = 0;
+ int var13 = 0;
+ double[] var14 = new double[var6];
+
+ int var15;
+ for(var15 = 0; var15 < var6; ++var15) {
+ var14[var15] = Math.cos((double)var15 * Math.PI * 6.0D / (double)var6) * 2.0D;
+ double var16 = (double)var15;
+ if(var15 > var6 / 2) {
+ var16 = (double)(var6 - 1 - var15);
+ }
+
+ if(var16 < 4.0D) {
+ var16 = 4.0D - var16;
+ var14[var15] -= var16 * var16 * var16 * 10.0D;
+ }
+ }
+
+ for(var15 = 0; var15 < var5; ++var15) {
+ for(int var36 = 0; var36 < var7; ++var36) {
+ double var17 = (this.field_4243_f[var13] + 256.0D) / 512.0D;
+ if(var17 > 1.0D) {
+ var17 = 1.0D;
+ }
+
+ double var19 = 0.0D;
+ double var21 = this.field_4242_g[var13] / 8000.0D;
+ if(var21 < 0.0D) {
+ var21 = -var21;
+ }
+
+ var21 = var21 * 3.0D - 3.0D;
+ if(var21 < 0.0D) {
+ var21 /= 2.0D;
+ if(var21 < -1.0D) {
+ var21 = -1.0D;
+ }
+
+ var21 /= 1.4D;
+ var21 /= 2.0D;
+ var17 = 0.0D;
+ } else {
+ if(var21 > 1.0D) {
+ var21 = 1.0D;
+ }
+
+ var21 /= 6.0D;
+ }
+
+ var17 += 0.5D;
+ var21 = var21 * (double)var6 / 16.0D;
+ ++var13;
+
+ for(int var23 = 0; var23 < var6; ++var23) {
+ double var24 = 0.0D;
+ double var26 = var14[var23];
+ double var28 = this.field_4245_d[var12] / 512.0D;
+ double var30 = this.field_4244_e[var12] / 512.0D;
+ double var32 = (this.field_4246_c[var12] / 10.0D + 1.0D) / 2.0D;
+ if(var32 < 0.0D) {
+ var24 = var28;
+ } else if(var32 > 1.0D) {
+ var24 = var30;
+ } else {
+ var24 = var28 + (var30 - var28) * var32;
+ }
+
+ var24 -= var26;
+ double var34;
+ if(var23 > var6 - 4) {
+ var34 = (double)((float)(var23 - (var6 - 4)) / 3.0F);
+ var24 = var24 * (1.0D - var34) + -10.0D * var34;
+ }
+
+ if((double)var23 < var19) {
+ var34 = (var19 - (double)var23) / 4.0D;
+ if(var34 < 0.0D) {
+ var34 = 0.0D;
+ }
+
+ if(var34 > 1.0D) {
+ var34 = 1.0D;
+ }
+
+ var24 = var24 * (1.0D - var34) + -10.0D * var34;
+ }
+
+ var1[var12] = var24;
+ ++var12;
+ }
+ }
+ }
+
+ return var1;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ return true;
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ BlockSand.fallInstantly = true;
+ int var4 = var2 * 16;
+ int var5 = var3 * 16;
+
+ int var6;
+ int var7;
+ int var8;
+ int var9;
+ for(var6 = 0; var6 < 8; ++var6) {
+ var7 = var4 + this.hellRNG.nextInt(16) + 8;
+ var8 = this.hellRNG.nextInt(120) + 4;
+ var9 = var5 + this.hellRNG.nextInt(16) + 8;
+ (new WorldGenHellLava(Block.lavaMoving.blockID)).generate(this.field_4235_n, this.hellRNG, var7, var8, var9);
+ }
+
+ var6 = this.hellRNG.nextInt(this.hellRNG.nextInt(10) + 1) + 1;
+
+ int var10;
+ for(var7 = 0; var7 < var6; ++var7) {
+ var8 = var4 + this.hellRNG.nextInt(16) + 8;
+ var9 = this.hellRNG.nextInt(120) + 4;
+ var10 = var5 + this.hellRNG.nextInt(16) + 8;
+ (new WorldGenFire()).generate(this.field_4235_n, this.hellRNG, var8, var9, var10);
+ }
+
+ var6 = this.hellRNG.nextInt(this.hellRNG.nextInt(10) + 1);
+
+ for(var7 = 0; var7 < var6; ++var7) {
+ var8 = var4 + this.hellRNG.nextInt(16) + 8;
+ var9 = this.hellRNG.nextInt(120) + 4;
+ var10 = var5 + this.hellRNG.nextInt(16) + 8;
+ (new WorldGenGlowStone1()).generate(this.field_4235_n, this.hellRNG, var8, var9, var10);
+ }
+
+ for(var7 = 0; var7 < 10; ++var7) {
+ var8 = var4 + this.hellRNG.nextInt(16) + 8;
+ var9 = this.hellRNG.nextInt(128);
+ var10 = var5 + this.hellRNG.nextInt(16) + 8;
+ (new WorldGenGlowStone2()).generate(this.field_4235_n, this.hellRNG, var8, var9, var10);
+ }
+
+ if(this.hellRNG.nextInt(1) == 0) {
+ var7 = var4 + this.hellRNG.nextInt(16) + 8;
+ var8 = this.hellRNG.nextInt(128);
+ var9 = var5 + this.hellRNG.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomBrown.blockID)).generate(this.field_4235_n, this.hellRNG, var7, var8, var9);
+ }
+
+ if(this.hellRNG.nextInt(1) == 0) {
+ var7 = var4 + this.hellRNG.nextInt(16) + 8;
+ var8 = this.hellRNG.nextInt(128);
+ var9 = var5 + this.hellRNG.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomRed.blockID)).generate(this.field_4235_n, this.hellRNG, var7, var8, var9);
+ }
+
+ BlockSand.fallInstantly = false;
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ return true;
+ }
+
+ public boolean func_361_a() {
+ return false;
+ }
+
+ public boolean func_364_b() {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/ChunkProviderServer.java b/src/net/minecraft/src/ChunkProviderServer.java
new file mode 100644
index 0000000..99e55c8
--- /dev/null
+++ b/src/net/minecraft/src/ChunkProviderServer.java
@@ -0,0 +1,198 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class ChunkProviderServer implements IChunkProvider {
+ private Set field_725_a = new HashSet();
+ private Chunk dummyChunk;
+ private IChunkProvider serverChunkGenerator;
+ private IChunkLoader field_729_d;
+ public boolean chunkLoadOverride = false;
+ private Map id2ChunkMap = new HashMap();
+ private List field_727_f = new ArrayList();
+ private WorldServer world;
+
+ public ChunkProviderServer(WorldServer var1, IChunkLoader var2, IChunkProvider var3) {
+ this.dummyChunk = new EmptyChunk(var1, new byte[-Short.MIN_VALUE], 0, 0);
+ this.world = var1;
+ this.field_729_d = var2;
+ this.serverChunkGenerator = var3;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ return this.id2ChunkMap.containsKey(Integer.valueOf(ChunkCoordIntPair.chunkXZ2Int(var1, var2)));
+ }
+
+ public void func_374_c(int var1, int var2) {
+ ChunkCoordinates var3 = this.world.getSpawnPoint();
+ int var4 = var1 * 16 + 8 - var3.posX;
+ int var5 = var2 * 16 + 8 - var3.posZ;
+ short var6 = 128;
+ if(var4 < -var6 || var4 > var6 || var5 < -var6 || var5 > var6) {
+ this.field_725_a.add(Integer.valueOf(ChunkCoordIntPair.chunkXZ2Int(var1, var2)));
+ }
+
+ }
+
+ public Chunk loadChunk(int var1, int var2) {
+ int var3 = ChunkCoordIntPair.chunkXZ2Int(var1, var2);
+ this.field_725_a.remove(Integer.valueOf(var3));
+ Chunk var4 = (Chunk)this.id2ChunkMap.get(Integer.valueOf(var3));
+ if(var4 == null) {
+ var4 = this.func_4063_e(var1, var2);
+ if(var4 == null) {
+ if(this.serverChunkGenerator == null) {
+ var4 = this.dummyChunk;
+ } else {
+ var4 = this.serverChunkGenerator.provideChunk(var1, var2);
+ }
+ }
+
+ this.id2ChunkMap.put(Integer.valueOf(var3), var4);
+ this.field_727_f.add(var4);
+ if(var4 != null) {
+ var4.func_4053_c();
+ var4.onChunkLoad();
+ }
+
+ if(!var4.isTerrainPopulated && this.chunkExists(var1 + 1, var2 + 1) && this.chunkExists(var1, var2 + 1) && this.chunkExists(var1 + 1, var2)) {
+ this.populate(this, var1, var2);
+ }
+
+ if(this.chunkExists(var1 - 1, var2) && !this.provideChunk(var1 - 1, var2).isTerrainPopulated && this.chunkExists(var1 - 1, var2 + 1) && this.chunkExists(var1, var2 + 1) && this.chunkExists(var1 - 1, var2)) {
+ this.populate(this, var1 - 1, var2);
+ }
+
+ if(this.chunkExists(var1, var2 - 1) && !this.provideChunk(var1, var2 - 1).isTerrainPopulated && this.chunkExists(var1 + 1, var2 - 1) && this.chunkExists(var1, var2 - 1) && this.chunkExists(var1 + 1, var2)) {
+ this.populate(this, var1, var2 - 1);
+ }
+
+ if(this.chunkExists(var1 - 1, var2 - 1) && !this.provideChunk(var1 - 1, var2 - 1).isTerrainPopulated && this.chunkExists(var1 - 1, var2 - 1) && this.chunkExists(var1, var2 - 1) && this.chunkExists(var1 - 1, var2)) {
+ this.populate(this, var1 - 1, var2 - 1);
+ }
+ }
+
+ return var4;
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ Chunk var3 = (Chunk)this.id2ChunkMap.get(Integer.valueOf(ChunkCoordIntPair.chunkXZ2Int(var1, var2)));
+ return var3 == null ? (!this.world.worldChunkLoadOverride && !this.chunkLoadOverride ? this.dummyChunk : this.loadChunk(var1, var2)) : var3;
+ }
+
+ private Chunk func_4063_e(int var1, int var2) {
+ if(this.field_729_d == null) {
+ return null;
+ } else {
+ try {
+ Chunk var3 = this.field_729_d.loadChunk(this.world, var1, var2);
+ if(var3 != null) {
+ var3.lastSaveTime = this.world.getWorldTime();
+ }
+
+ return var3;
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ return null;
+ }
+ }
+ }
+
+ private void func_375_a(Chunk var1) {
+ if(this.field_729_d != null) {
+ try {
+ this.field_729_d.saveExtraChunkData(this.world, var1);
+ } catch (Exception var3) {
+ var3.printStackTrace();
+ }
+
+ }
+ }
+
+ private void func_373_b(Chunk var1) {
+ if(this.field_729_d != null) {
+ try {
+ var1.lastSaveTime = this.world.getWorldTime();
+ this.field_729_d.saveChunk(this.world, var1);
+ } catch (IOException var3) {
+ var3.printStackTrace();
+ }
+
+ }
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ Chunk var4 = this.provideChunk(var2, var3);
+ if(!var4.isTerrainPopulated) {
+ var4.isTerrainPopulated = true;
+ if(this.serverChunkGenerator != null) {
+ this.serverChunkGenerator.populate(var1, var2, var3);
+ var4.setChunkModified();
+ }
+ }
+
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ int var3 = 0;
+
+ for(int var4 = 0; var4 < this.field_727_f.size(); ++var4) {
+ Chunk var5 = (Chunk)this.field_727_f.get(var4);
+ if(var1 && !var5.neverSave) {
+ this.func_375_a(var5);
+ }
+
+ if(var5.needsSaving(var1)) {
+ this.func_373_b(var5);
+ var5.isModified = false;
+ ++var3;
+ if(var3 == 24 && !var1) {
+ return false;
+ }
+ }
+ }
+
+ if(var1) {
+ if(this.field_729_d == null) {
+ return true;
+ }
+
+ this.field_729_d.saveExtraData();
+ }
+
+ return true;
+ }
+
+ public boolean func_361_a() {
+ if(!this.world.levelSaving) {
+ for(int var1 = 0; var1 < 100; ++var1) {
+ if(!this.field_725_a.isEmpty()) {
+ Integer var2 = (Integer)this.field_725_a.iterator().next();
+ Chunk var3 = (Chunk)this.id2ChunkMap.get(var2);
+ var3.onChunkUnload();
+ this.func_373_b(var3);
+ this.func_375_a(var3);
+ this.field_725_a.remove(var2);
+ this.id2ChunkMap.remove(var2);
+ this.field_727_f.remove(var3);
+ }
+ }
+
+ if(this.field_729_d != null) {
+ this.field_729_d.func_661_a();
+ }
+ }
+
+ return this.serverChunkGenerator.func_361_a();
+ }
+
+ public boolean func_364_b() {
+ return !this.world.levelSaving;
+ }
+}
diff --git a/src/net/minecraft/src/ChunkProviderSky.java b/src/net/minecraft/src/ChunkProviderSky.java
new file mode 100644
index 0000000..0200e28
--- /dev/null
+++ b/src/net/minecraft/src/ChunkProviderSky.java
@@ -0,0 +1,511 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class ChunkProviderSky implements IChunkProvider {
+ private Random field_28085_j;
+ private NoiseGeneratorOctaves field_28084_k;
+ private NoiseGeneratorOctaves field_28083_l;
+ private NoiseGeneratorOctaves field_28082_m;
+ private NoiseGeneratorOctaves field_28081_n;
+ private NoiseGeneratorOctaves field_28080_o;
+ public NoiseGeneratorOctaves field_28094_a;
+ public NoiseGeneratorOctaves field_28093_b;
+ public NoiseGeneratorOctaves field_28092_c;
+ private World field_28079_p;
+ private double[] field_28078_q;
+ private double[] field_28077_r = new double[256];
+ private double[] field_28076_s = new double[256];
+ private double[] field_28075_t = new double[256];
+ private MapGenBase field_28074_u = new MapGenCaves();
+ private BiomeGenBase[] field_28073_v;
+ double[] field_28091_d;
+ double[] field_28090_e;
+ double[] field_28089_f;
+ double[] field_28088_g;
+ double[] field_28087_h;
+ int[][] field_28086_i = new int[32][32];
+ private double[] field_28072_w;
+
+ public ChunkProviderSky(World var1, long var2) {
+ this.field_28079_p = var1;
+ this.field_28085_j = new Random(var2);
+ this.field_28084_k = new NoiseGeneratorOctaves(this.field_28085_j, 16);
+ this.field_28083_l = new NoiseGeneratorOctaves(this.field_28085_j, 16);
+ this.field_28082_m = new NoiseGeneratorOctaves(this.field_28085_j, 8);
+ this.field_28081_n = new NoiseGeneratorOctaves(this.field_28085_j, 4);
+ this.field_28080_o = new NoiseGeneratorOctaves(this.field_28085_j, 4);
+ this.field_28094_a = new NoiseGeneratorOctaves(this.field_28085_j, 10);
+ this.field_28093_b = new NoiseGeneratorOctaves(this.field_28085_j, 16);
+ this.field_28092_c = new NoiseGeneratorOctaves(this.field_28085_j, 8);
+ }
+
+ public void func_28070_a(int var1, int var2, byte[] var3, BiomeGenBase[] var4, double[] var5) {
+ byte var6 = 2;
+ int var7 = var6 + 1;
+ byte var8 = 33;
+ int var9 = var6 + 1;
+ this.field_28078_q = this.func_28071_a(this.field_28078_q, var1 * var6, 0, var2 * var6, var7, var8, var9);
+
+ for(int var10 = 0; var10 < var6; ++var10) {
+ for(int var11 = 0; var11 < var6; ++var11) {
+ for(int var12 = 0; var12 < 32; ++var12) {
+ double var13 = 0.25D;
+ double var15 = this.field_28078_q[((var10 + 0) * var9 + var11 + 0) * var8 + var12 + 0];
+ double var17 = this.field_28078_q[((var10 + 0) * var9 + var11 + 1) * var8 + var12 + 0];
+ double var19 = this.field_28078_q[((var10 + 1) * var9 + var11 + 0) * var8 + var12 + 0];
+ double var21 = this.field_28078_q[((var10 + 1) * var9 + var11 + 1) * var8 + var12 + 0];
+ double var23 = (this.field_28078_q[((var10 + 0) * var9 + var11 + 0) * var8 + var12 + 1] - var15) * var13;
+ double var25 = (this.field_28078_q[((var10 + 0) * var9 + var11 + 1) * var8 + var12 + 1] - var17) * var13;
+ double var27 = (this.field_28078_q[((var10 + 1) * var9 + var11 + 0) * var8 + var12 + 1] - var19) * var13;
+ double var29 = (this.field_28078_q[((var10 + 1) * var9 + var11 + 1) * var8 + var12 + 1] - var21) * var13;
+
+ for(int var31 = 0; var31 < 4; ++var31) {
+ double var32 = 0.125D;
+ double var34 = var15;
+ double var36 = var17;
+ double var38 = (var19 - var15) * var32;
+ double var40 = (var21 - var17) * var32;
+
+ for(int var42 = 0; var42 < 8; ++var42) {
+ int var43 = var42 + var10 * 8 << 11 | 0 + var11 * 8 << 7 | var12 * 4 + var31;
+ short var44 = 128;
+ double var45 = 0.125D;
+ double var47 = var34;
+ double var49 = (var36 - var34) * var45;
+
+ for(int var51 = 0; var51 < 8; ++var51) {
+ int var52 = 0;
+ if(var47 > 0.0D) {
+ var52 = Block.stone.blockID;
+ }
+
+ var3[var43] = (byte)var52;
+ var43 += var44;
+ var47 += var49;
+ }
+
+ var34 += var38;
+ var36 += var40;
+ }
+
+ var15 += var23;
+ var17 += var25;
+ var19 += var27;
+ var21 += var29;
+ }
+ }
+ }
+ }
+
+ }
+
+ public void func_28069_a(int var1, int var2, byte[] var3, BiomeGenBase[] var4) {
+ double var5 = 1.0D / 32.0D;
+ this.field_28077_r = this.field_28081_n.generateNoiseOctaves(this.field_28077_r, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var5, var5, 1.0D);
+ this.field_28076_s = this.field_28081_n.generateNoiseOctaves(this.field_28076_s, (double)(var1 * 16), 109.0134D, (double)(var2 * 16), 16, 1, 16, var5, 1.0D, var5);
+ this.field_28075_t = this.field_28080_o.generateNoiseOctaves(this.field_28075_t, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var5 * 2.0D, var5 * 2.0D, var5 * 2.0D);
+
+ for(int var7 = 0; var7 < 16; ++var7) {
+ for(int var8 = 0; var8 < 16; ++var8) {
+ BiomeGenBase var9 = var4[var7 + var8 * 16];
+ int var10 = (int)(this.field_28075_t[var7 + var8 * 16] / 3.0D + 3.0D + this.field_28085_j.nextDouble() * 0.25D);
+ int var11 = -1;
+ byte var12 = var9.topBlock;
+ byte var13 = var9.fillerBlock;
+
+ for(int var14 = 127; var14 >= 0; --var14) {
+ int var15 = (var8 * 16 + var7) * 128 + var14;
+ byte var16 = var3[var15];
+ if(var16 == 0) {
+ var11 = -1;
+ } else if(var16 == Block.stone.blockID) {
+ if(var11 == -1) {
+ if(var10 <= 0) {
+ var12 = 0;
+ var13 = (byte)Block.stone.blockID;
+ }
+
+ var11 = var10;
+ if(var14 >= 0) {
+ var3[var15] = var12;
+ } else {
+ var3[var15] = var13;
+ }
+ } else if(var11 > 0) {
+ --var11;
+ var3[var15] = var13;
+ if(var11 == 0 && var13 == Block.sand.blockID) {
+ var11 = this.field_28085_j.nextInt(4);
+ var13 = (byte)Block.sandStone.blockID;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ public Chunk loadChunk(int var1, int var2) {
+ return this.provideChunk(var1, var2);
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ this.field_28085_j.setSeed((long)var1 * 341873128712L + (long)var2 * 132897987541L);
+ byte[] var3 = new byte[-Short.MIN_VALUE];
+ Chunk var4 = new Chunk(this.field_28079_p, var3, var1, var2);
+ this.field_28073_v = this.field_28079_p.getWorldChunkManager().loadBlockGeneratorData(this.field_28073_v, var1 * 16, var2 * 16, 16, 16);
+ double[] var5 = this.field_28079_p.getWorldChunkManager().temperature;
+ this.func_28070_a(var1, var2, var3, this.field_28073_v, var5);
+ this.func_28069_a(var1, var2, var3, this.field_28073_v);
+ this.field_28074_u.func_667_a(this, this.field_28079_p, var1, var2, var3);
+ var4.func_353_b();
+ return var4;
+ }
+
+ private double[] func_28071_a(double[] var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ if(var1 == null) {
+ var1 = new double[var5 * var6 * var7];
+ }
+
+ double var8 = 684.412D;
+ double var10 = 684.412D;
+ double[] var12 = this.field_28079_p.getWorldChunkManager().temperature;
+ double[] var13 = this.field_28079_p.getWorldChunkManager().humidity;
+ this.field_28088_g = this.field_28094_a.func_4103_a(this.field_28088_g, var2, var4, var5, var7, 1.121D, 1.121D, 0.5D);
+ this.field_28087_h = this.field_28093_b.func_4103_a(this.field_28087_h, var2, var4, var5, var7, 200.0D, 200.0D, 0.5D);
+ var8 *= 2.0D;
+ this.field_28091_d = this.field_28082_m.generateNoiseOctaves(this.field_28091_d, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8 / 80.0D, var10 / 160.0D, var8 / 80.0D);
+ this.field_28090_e = this.field_28084_k.generateNoiseOctaves(this.field_28090_e, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ this.field_28089_f = this.field_28083_l.generateNoiseOctaves(this.field_28089_f, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ int var14 = 0;
+ int var15 = 0;
+ int var16 = 16 / var5;
+
+ for(int var17 = 0; var17 < var5; ++var17) {
+ int var18 = var17 * var16 + var16 / 2;
+
+ for(int var19 = 0; var19 < var7; ++var19) {
+ int var20 = var19 * var16 + var16 / 2;
+ double var21 = var12[var18 * 16 + var20];
+ double var23 = var13[var18 * 16 + var20] * var21;
+ double var25 = 1.0D - var23;
+ var25 *= var25;
+ var25 *= var25;
+ var25 = 1.0D - var25;
+ double var27 = (this.field_28088_g[var15] + 256.0D) / 512.0D;
+ var27 *= var25;
+ if(var27 > 1.0D) {
+ var27 = 1.0D;
+ }
+
+ double var29 = this.field_28087_h[var15] / 8000.0D;
+ if(var29 < 0.0D) {
+ var29 = -var29 * 0.3D;
+ }
+
+ var29 = var29 * 3.0D - 2.0D;
+ if(var29 > 1.0D) {
+ var29 = 1.0D;
+ }
+
+ var29 /= 8.0D;
+ var29 = 0.0D;
+ if(var27 < 0.0D) {
+ var27 = 0.0D;
+ }
+
+ var27 += 0.5D;
+ var29 = var29 * (double)var6 / 16.0D;
+ ++var15;
+ double var31 = (double)var6 / 2.0D;
+
+ for(int var33 = 0; var33 < var6; ++var33) {
+ double var34 = 0.0D;
+ double var36 = ((double)var33 - var31) * 8.0D / var27;
+ if(var36 < 0.0D) {
+ var36 *= -1.0D;
+ }
+
+ double var38 = this.field_28090_e[var14] / 512.0D;
+ double var40 = this.field_28089_f[var14] / 512.0D;
+ double var42 = (this.field_28091_d[var14] / 10.0D + 1.0D) / 2.0D;
+ if(var42 < 0.0D) {
+ var34 = var38;
+ } else if(var42 > 1.0D) {
+ var34 = var40;
+ } else {
+ var34 = var38 + (var40 - var38) * var42;
+ }
+
+ var34 -= 8.0D;
+ byte var44 = 32;
+ double var45;
+ if(var33 > var6 - var44) {
+ var45 = (double)((float)(var33 - (var6 - var44)) / ((float)var44 - 1.0F));
+ var34 = var34 * (1.0D - var45) + -30.0D * var45;
+ }
+
+ var44 = 8;
+ if(var33 < var44) {
+ var45 = (double)((float)(var44 - var33) / ((float)var44 - 1.0F));
+ var34 = var34 * (1.0D - var45) + -30.0D * var45;
+ }
+
+ var1[var14] = var34;
+ ++var14;
+ }
+ }
+ }
+
+ return var1;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ return true;
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ BlockSand.fallInstantly = true;
+ int var4 = var2 * 16;
+ int var5 = var3 * 16;
+ BiomeGenBase var6 = this.field_28079_p.getWorldChunkManager().getBiomeGenAt(var4 + 16, var5 + 16);
+ this.field_28085_j.setSeed(this.field_28079_p.getRandomSeed());
+ long var7 = this.field_28085_j.nextLong() / 2L * 2L + 1L;
+ long var9 = this.field_28085_j.nextLong() / 2L * 2L + 1L;
+ this.field_28085_j.setSeed((long)var2 * var7 + (long)var3 * var9 ^ this.field_28079_p.getRandomSeed());
+ double var11 = 0.25D;
+ int var13;
+ int var14;
+ int var15;
+ if(this.field_28085_j.nextInt(4) == 0) {
+ var13 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var14 = this.field_28085_j.nextInt(128);
+ var15 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenLakes(Block.waterStill.blockID)).generate(this.field_28079_p, this.field_28085_j, var13, var14, var15);
+ }
+
+ if(this.field_28085_j.nextInt(8) == 0) {
+ var13 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var14 = this.field_28085_j.nextInt(this.field_28085_j.nextInt(120) + 8);
+ var15 = var5 + this.field_28085_j.nextInt(16) + 8;
+ if(var14 < 64 || this.field_28085_j.nextInt(10) == 0) {
+ (new WorldGenLakes(Block.lavaStill.blockID)).generate(this.field_28079_p, this.field_28085_j, var13, var14, var15);
+ }
+ }
+
+ int var16;
+ for(var13 = 0; var13 < 8; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var15 = this.field_28085_j.nextInt(128);
+ var16 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenDungeons()).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 10; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16);
+ var15 = this.field_28085_j.nextInt(128);
+ var16 = var5 + this.field_28085_j.nextInt(16);
+ (new WorldGenClay(32)).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 20; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16);
+ var15 = this.field_28085_j.nextInt(128);
+ var16 = var5 + this.field_28085_j.nextInt(16);
+ (new WorldGenMinable(Block.dirt.blockID, 32)).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 10; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16);
+ var15 = this.field_28085_j.nextInt(128);
+ var16 = var5 + this.field_28085_j.nextInt(16);
+ (new WorldGenMinable(Block.gravel.blockID, 32)).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 20; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16);
+ var15 = this.field_28085_j.nextInt(128);
+ var16 = var5 + this.field_28085_j.nextInt(16);
+ (new WorldGenMinable(Block.oreCoal.blockID, 16)).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 20; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16);
+ var15 = this.field_28085_j.nextInt(64);
+ var16 = var5 + this.field_28085_j.nextInt(16);
+ (new WorldGenMinable(Block.oreIron.blockID, 8)).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 2; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16);
+ var15 = this.field_28085_j.nextInt(32);
+ var16 = var5 + this.field_28085_j.nextInt(16);
+ (new WorldGenMinable(Block.oreGold.blockID, 8)).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 8; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16);
+ var15 = this.field_28085_j.nextInt(16);
+ var16 = var5 + this.field_28085_j.nextInt(16);
+ (new WorldGenMinable(Block.oreRedstone.blockID, 7)).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 1; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16);
+ var15 = this.field_28085_j.nextInt(16);
+ var16 = var5 + this.field_28085_j.nextInt(16);
+ (new WorldGenMinable(Block.oreDiamond.blockID, 7)).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 1; ++var13) {
+ var14 = var4 + this.field_28085_j.nextInt(16);
+ var15 = this.field_28085_j.nextInt(16) + this.field_28085_j.nextInt(16);
+ var16 = var5 + this.field_28085_j.nextInt(16);
+ (new WorldGenMinable(Block.oreLapis.blockID, 6)).generate(this.field_28079_p, this.field_28085_j, var14, var15, var16);
+ }
+
+ var11 = 0.5D;
+ var13 = (int)((this.field_28092_c.func_647_a((double)var4 * var11, (double)var5 * var11) / 8.0D + this.field_28085_j.nextDouble() * 4.0D + 4.0D) / 3.0D);
+ var14 = 0;
+ if(this.field_28085_j.nextInt(10) == 0) {
+ ++var14;
+ }
+
+ if(var6 == BiomeGenBase.forest) {
+ var14 += var13 + 5;
+ }
+
+ if(var6 == BiomeGenBase.rainforest) {
+ var14 += var13 + 5;
+ }
+
+ if(var6 == BiomeGenBase.seasonalForest) {
+ var14 += var13 + 2;
+ }
+
+ if(var6 == BiomeGenBase.taiga) {
+ var14 += var13 + 5;
+ }
+
+ if(var6 == BiomeGenBase.desert) {
+ var14 -= 20;
+ }
+
+ if(var6 == BiomeGenBase.tundra) {
+ var14 -= 20;
+ }
+
+ if(var6 == BiomeGenBase.plains) {
+ var14 -= 20;
+ }
+
+ int var17;
+ for(var15 = 0; var15 < var14; ++var15) {
+ var16 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var17 = var5 + this.field_28085_j.nextInt(16) + 8;
+ WorldGenerator var18 = var6.getRandomWorldGenForTrees(this.field_28085_j);
+ var18.func_420_a(1.0D, 1.0D, 1.0D);
+ var18.generate(this.field_28079_p, this.field_28085_j, var16, this.field_28079_p.getHeightValue(var16, var17), var17);
+ }
+
+ int var23;
+ for(var15 = 0; var15 < 2; ++var15) {
+ var16 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var17 = this.field_28085_j.nextInt(128);
+ var23 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.plantYellow.blockID)).generate(this.field_28079_p, this.field_28085_j, var16, var17, var23);
+ }
+
+ if(this.field_28085_j.nextInt(2) == 0) {
+ var15 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var16 = this.field_28085_j.nextInt(128);
+ var17 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.plantRed.blockID)).generate(this.field_28079_p, this.field_28085_j, var15, var16, var17);
+ }
+
+ if(this.field_28085_j.nextInt(4) == 0) {
+ var15 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var16 = this.field_28085_j.nextInt(128);
+ var17 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomBrown.blockID)).generate(this.field_28079_p, this.field_28085_j, var15, var16, var17);
+ }
+
+ if(this.field_28085_j.nextInt(8) == 0) {
+ var15 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var16 = this.field_28085_j.nextInt(128);
+ var17 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomRed.blockID)).generate(this.field_28079_p, this.field_28085_j, var15, var16, var17);
+ }
+
+ for(var15 = 0; var15 < 10; ++var15) {
+ var16 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var17 = this.field_28085_j.nextInt(128);
+ var23 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenReed()).generate(this.field_28079_p, this.field_28085_j, var16, var17, var23);
+ }
+
+ if(this.field_28085_j.nextInt(32) == 0) {
+ var15 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var16 = this.field_28085_j.nextInt(128);
+ var17 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenPumpkin()).generate(this.field_28079_p, this.field_28085_j, var15, var16, var17);
+ }
+
+ var15 = 0;
+ if(var6 == BiomeGenBase.desert) {
+ var15 += 10;
+ }
+
+ int var19;
+ for(var16 = 0; var16 < var15; ++var16) {
+ var17 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var23 = this.field_28085_j.nextInt(128);
+ var19 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenCactus()).generate(this.field_28079_p, this.field_28085_j, var17, var23, var19);
+ }
+
+ for(var16 = 0; var16 < 50; ++var16) {
+ var17 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var23 = this.field_28085_j.nextInt(this.field_28085_j.nextInt(120) + 8);
+ var19 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenLiquids(Block.waterMoving.blockID)).generate(this.field_28079_p, this.field_28085_j, var17, var23, var19);
+ }
+
+ for(var16 = 0; var16 < 20; ++var16) {
+ var17 = var4 + this.field_28085_j.nextInt(16) + 8;
+ var23 = this.field_28085_j.nextInt(this.field_28085_j.nextInt(this.field_28085_j.nextInt(112) + 8) + 8);
+ var19 = var5 + this.field_28085_j.nextInt(16) + 8;
+ (new WorldGenLiquids(Block.lavaMoving.blockID)).generate(this.field_28079_p, this.field_28085_j, var17, var23, var19);
+ }
+
+ this.field_28072_w = this.field_28079_p.getWorldChunkManager().getTemperatures(this.field_28072_w, var4 + 8, var5 + 8, 16, 16);
+
+ for(var16 = var4 + 8; var16 < var4 + 8 + 16; ++var16) {
+ for(var17 = var5 + 8; var17 < var5 + 8 + 16; ++var17) {
+ var23 = var16 - (var4 + 8);
+ var19 = var17 - (var5 + 8);
+ int var20 = this.field_28079_p.getTopSolidOrLiquidBlock(var16, var17);
+ double var21 = this.field_28072_w[var23 * 16 + var19] - (double)(var20 - 64) / 64.0D * 0.3D;
+ if(var21 < 0.5D && var20 > 0 && var20 < 128 && this.field_28079_p.isAirBlock(var16, var20, var17) && this.field_28079_p.getBlockMaterial(var16, var20 - 1, var17).getIsSolid() && this.field_28079_p.getBlockMaterial(var16, var20 - 1, var17) != Material.ice) {
+ this.field_28079_p.setBlockWithNotify(var16, var20, var17, Block.snow.blockID);
+ }
+ }
+ }
+
+ BlockSand.fallInstantly = false;
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ return true;
+ }
+
+ public boolean func_361_a() {
+ return false;
+ }
+
+ public boolean func_364_b() {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/CompressedStreamTools.java b/src/net/minecraft/src/CompressedStreamTools.java
new file mode 100644
index 0000000..b09db98
--- /dev/null
+++ b/src/net/minecraft/src/CompressedStreamTools.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.io.DataOutput;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+public class CompressedStreamTools {
+ public static NBTTagCompound func_770_a(InputStream var0) throws IOException {
+ DataInputStream var1 = new DataInputStream(new GZIPInputStream(var0));
+
+ NBTTagCompound var2;
+ try {
+ var2 = func_774_a(var1);
+ } finally {
+ var1.close();
+ }
+
+ return var2;
+ }
+
+ public static void writeGzippedCompoundToOutputStream(NBTTagCompound var0, OutputStream var1) throws IOException {
+ DataOutputStream var2 = new DataOutputStream(new GZIPOutputStream(var1));
+
+ try {
+ func_771_a(var0, var2);
+ } finally {
+ var2.close();
+ }
+
+ }
+
+ public static NBTTagCompound func_774_a(DataInput var0) throws IOException {
+ NBTBase var1 = NBTBase.readTag(var0);
+ if(var1 instanceof NBTTagCompound) {
+ return (NBTTagCompound)var1;
+ } else {
+ throw new IOException("Root tag must be a named compound tag");
+ }
+ }
+
+ public static void func_771_a(NBTTagCompound var0, DataOutput var1) throws IOException {
+ NBTBase.writeTag(var0, var1);
+ }
+}
diff --git a/src/net/minecraft/src/ConsoleCommandHandler.java b/src/net/minecraft/src/ConsoleCommandHandler.java
new file mode 100644
index 0000000..4d1483e
--- /dev/null
+++ b/src/net/minecraft/src/ConsoleCommandHandler.java
@@ -0,0 +1,309 @@
+package net.minecraft.src;
+
+import java.util.Iterator;
+import java.util.Set;
+import java.util.logging.Logger;
+import net.minecraft.server.MinecraftServer;
+
+public class ConsoleCommandHandler {
+ private static Logger minecraftLogger = Logger.getLogger("Minecraft");
+ private MinecraftServer minecraftServer;
+
+ public ConsoleCommandHandler(MinecraftServer var1) {
+ this.minecraftServer = var1;
+ }
+
+ public void handleCommand(ServerCommand var1) {
+ String var2 = var1.command;
+ ICommandListener var3 = var1.commandListener;
+ String var4 = var3.getUsername();
+ ServerConfigurationManager var5 = this.minecraftServer.configManager;
+ if(!var2.toLowerCase().startsWith("help") && !var2.toLowerCase().startsWith("?")) {
+ if(var2.toLowerCase().startsWith("list")) {
+ var3.log("Connected players: " + var5.getPlayerList());
+ } else if(var2.toLowerCase().startsWith("stop")) {
+ this.sendNoticeToOps(var4, "Stopping the server..");
+ this.minecraftServer.initiateShutdown();
+ } else {
+ int var6;
+ WorldServer var7;
+ if(var2.toLowerCase().startsWith("save-all")) {
+ this.sendNoticeToOps(var4, "Forcing save..");
+ if(var5 != null) {
+ var5.savePlayerStates();
+ }
+
+ for(var6 = 0; var6 < this.minecraftServer.worldMngr.length; ++var6) {
+ var7 = this.minecraftServer.worldMngr[var6];
+ var7.saveWorld(true, (IProgressUpdate)null);
+ }
+
+ this.sendNoticeToOps(var4, "Save complete.");
+ } else if(var2.toLowerCase().startsWith("save-off")) {
+ this.sendNoticeToOps(var4, "Disabling level saving..");
+
+ for(var6 = 0; var6 < this.minecraftServer.worldMngr.length; ++var6) {
+ var7 = this.minecraftServer.worldMngr[var6];
+ var7.levelSaving = true;
+ }
+ } else if(var2.toLowerCase().startsWith("save-on")) {
+ this.sendNoticeToOps(var4, "Enabling level saving..");
+
+ for(var6 = 0; var6 < this.minecraftServer.worldMngr.length; ++var6) {
+ var7 = this.minecraftServer.worldMngr[var6];
+ var7.levelSaving = false;
+ }
+ } else {
+ String var13;
+ if(var2.toLowerCase().startsWith("op ")) {
+ var13 = var2.substring(var2.indexOf(" ")).trim();
+ var5.opPlayer(var13);
+ this.sendNoticeToOps(var4, "Opping " + var13);
+ var5.sendChatMessageToPlayer(var13, "\u00a7eYou are now op!");
+ } else if(var2.toLowerCase().startsWith("deop ")) {
+ var13 = var2.substring(var2.indexOf(" ")).trim();
+ var5.deopPlayer(var13);
+ var5.sendChatMessageToPlayer(var13, "\u00a7eYou are no longer op!");
+ this.sendNoticeToOps(var4, "De-opping " + var13);
+ } else if(var2.toLowerCase().startsWith("ban-ip ")) {
+ var13 = var2.substring(var2.indexOf(" ")).trim();
+ var5.banIP(var13);
+ this.sendNoticeToOps(var4, "Banning ip " + var13);
+ } else if(var2.toLowerCase().startsWith("pardon-ip ")) {
+ var13 = var2.substring(var2.indexOf(" ")).trim();
+ var5.pardonIP(var13);
+ this.sendNoticeToOps(var4, "Pardoning ip " + var13);
+ } else {
+ EntityPlayerMP var14;
+ if(var2.toLowerCase().startsWith("ban ")) {
+ var13 = var2.substring(var2.indexOf(" ")).trim();
+ var5.banPlayer(var13);
+ this.sendNoticeToOps(var4, "Banning " + var13);
+ var14 = var5.getPlayerEntity(var13);
+ if(var14 != null) {
+ var14.playerNetServerHandler.kickPlayer("Banned by admin");
+ }
+ } else if(var2.toLowerCase().startsWith("pardon ")) {
+ var13 = var2.substring(var2.indexOf(" ")).trim();
+ var5.pardonPlayer(var13);
+ this.sendNoticeToOps(var4, "Pardoning " + var13);
+ } else {
+ int var8;
+ if(var2.toLowerCase().startsWith("kick ")) {
+ var13 = var2.substring(var2.indexOf(" ")).trim();
+ var14 = null;
+
+ for(var8 = 0; var8 < var5.playerEntities.size(); ++var8) {
+ EntityPlayerMP var9 = (EntityPlayerMP)var5.playerEntities.get(var8);
+ if(var9.username.equalsIgnoreCase(var13)) {
+ var14 = var9;
+ }
+ }
+
+ if(var14 != null) {
+ var14.playerNetServerHandler.kickPlayer("Kicked by admin");
+ this.sendNoticeToOps(var4, "Kicking " + var14.username);
+ } else {
+ var3.log("Can\'t find user " + var13 + ". No kick.");
+ }
+ } else {
+ EntityPlayerMP var15;
+ String[] var18;
+ if(var2.toLowerCase().startsWith("tp ")) {
+ var18 = var2.split(" ");
+ if(var18.length == 3) {
+ var14 = var5.getPlayerEntity(var18[1]);
+ var15 = var5.getPlayerEntity(var18[2]);
+ if(var14 == null) {
+ var3.log("Can\'t find user " + var18[1] + ". No tp.");
+ } else if(var15 == null) {
+ var3.log("Can\'t find user " + var18[2] + ". No tp.");
+ } else if(var14.dimension != var15.dimension) {
+ var3.log("User " + var18[1] + " and " + var18[2] + " are in different dimensions. No tp.");
+ } else {
+ var14.playerNetServerHandler.teleportTo(var15.posX, var15.posY, var15.posZ, var15.rotationYaw, var15.rotationPitch);
+ this.sendNoticeToOps(var4, "Teleporting " + var18[1] + " to " + var18[2] + ".");
+ }
+ } else {
+ var3.log("Syntax error, please provice a source and a target.");
+ }
+ } else {
+ String var16;
+ int var17;
+ if(var2.toLowerCase().startsWith("give ")) {
+ var18 = var2.split(" ");
+ if(var18.length != 3 && var18.length != 4) {
+ return;
+ }
+
+ var16 = var18[1];
+ var15 = var5.getPlayerEntity(var16);
+ if(var15 != null) {
+ try {
+ var17 = Integer.parseInt(var18[2]);
+ if(Item.itemsList[var17] != null) {
+ this.sendNoticeToOps(var4, "Giving " + var15.username + " some " + var17);
+ int var10 = 1;
+ if(var18.length > 3) {
+ var10 = this.tryParse(var18[3], 1);
+ }
+
+ if(var10 < 1) {
+ var10 = 1;
+ }
+
+ if(var10 > 64) {
+ var10 = 64;
+ }
+
+ var15.dropPlayerItem(new ItemStack(var17, var10, 0));
+ } else {
+ var3.log("There\'s no item with id " + var17);
+ }
+ } catch (NumberFormatException var11) {
+ var3.log("There\'s no item with id " + var18[2]);
+ }
+ } else {
+ var3.log("Can\'t find user " + var16);
+ }
+ } else if(var2.toLowerCase().startsWith("time ")) {
+ var18 = var2.split(" ");
+ if(var18.length != 3) {
+ return;
+ }
+
+ var16 = var18[1];
+
+ try {
+ var8 = Integer.parseInt(var18[2]);
+ WorldServer var19;
+ if("add".equalsIgnoreCase(var16)) {
+ for(var17 = 0; var17 < this.minecraftServer.worldMngr.length; ++var17) {
+ var19 = this.minecraftServer.worldMngr[var17];
+ var19.func_32005_b(var19.getWorldTime() + (long)var8);
+ }
+
+ this.sendNoticeToOps(var4, "Added " + var8 + " to time");
+ } else if("set".equalsIgnoreCase(var16)) {
+ for(var17 = 0; var17 < this.minecraftServer.worldMngr.length; ++var17) {
+ var19 = this.minecraftServer.worldMngr[var17];
+ var19.func_32005_b((long)var8);
+ }
+
+ this.sendNoticeToOps(var4, "Set time to " + var8);
+ } else {
+ var3.log("Unknown method, use either \"add\" or \"set\"");
+ }
+ } catch (NumberFormatException var12) {
+ var3.log("Unable to convert time value, " + var18[2]);
+ }
+ } else if(var2.toLowerCase().startsWith("say ")) {
+ var2 = var2.substring(var2.indexOf(" ")).trim();
+ minecraftLogger.info("[" + var4 + "] " + var2);
+ var5.sendPacketToAllPlayers(new Packet3Chat("\u00a7d[Server] " + var2));
+ } else if(var2.toLowerCase().startsWith("tell ")) {
+ var18 = var2.split(" ");
+ if(var18.length >= 3) {
+ var2 = var2.substring(var2.indexOf(" ")).trim();
+ var2 = var2.substring(var2.indexOf(" ")).trim();
+ minecraftLogger.info("[" + var4 + "->" + var18[1] + "] " + var2);
+ var2 = "\u00a77" + var4 + " whispers " + var2;
+ minecraftLogger.info(var2);
+ if(!var5.sendPacketToPlayer(var18[1], new Packet3Chat(var2))) {
+ var3.log("There\'s no player by that name online.");
+ }
+ }
+ } else if(var2.toLowerCase().startsWith("whitelist ")) {
+ this.handleWhitelist(var4, var2, var3);
+ } else {
+ minecraftLogger.info("Unknown console command. Type \"help\" for help.");
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ this.printHelp(var3);
+ }
+
+ }
+
+ private void handleWhitelist(String var1, String var2, ICommandListener var3) {
+ String[] var4 = var2.split(" ");
+ if(var4.length >= 2) {
+ String var5 = var4[1].toLowerCase();
+ if("on".equals(var5)) {
+ this.sendNoticeToOps(var1, "Turned on white-listing");
+ this.minecraftServer.propertyManagerObj.setProperty("white-list", true);
+ } else if("off".equals(var5)) {
+ this.sendNoticeToOps(var1, "Turned off white-listing");
+ this.minecraftServer.propertyManagerObj.setProperty("white-list", false);
+ } else if("list".equals(var5)) {
+ Set var6 = this.minecraftServer.configManager.getWhiteListedIPs();
+ String var7 = "";
+
+ String var9;
+ for(Iterator var8 = var6.iterator(); var8.hasNext(); var7 = var7 + var9 + " ") {
+ var9 = (String)var8.next();
+ }
+
+ var3.log("White-listed players: " + var7);
+ } else {
+ String var10;
+ if("add".equals(var5) && var4.length == 3) {
+ var10 = var4[2].toLowerCase();
+ this.minecraftServer.configManager.addToWhiteList(var10);
+ this.sendNoticeToOps(var1, "Added " + var10 + " to white-list");
+ } else if("remove".equals(var5) && var4.length == 3) {
+ var10 = var4[2].toLowerCase();
+ this.minecraftServer.configManager.removeFromWhiteList(var10);
+ this.sendNoticeToOps(var1, "Removed " + var10 + " from white-list");
+ } else if("reload".equals(var5)) {
+ this.minecraftServer.configManager.reloadWhiteList();
+ this.sendNoticeToOps(var1, "Reloaded white-list from file");
+ }
+ }
+
+ }
+ }
+
+ private void printHelp(ICommandListener var1) {
+ var1.log("To run the server without a gui, start it like this:");
+ var1.log(" java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui");
+ var1.log("Console commands:");
+ var1.log(" help or ? shows this message");
+ var1.log(" kick removes a player from the server");
+ var1.log(" ban bans a player from the server");
+ var1.log(" pardon pardons a banned player so that they can connect again");
+ var1.log(" ban-ip bans an IP address from the server");
+ var1.log(" pardon-ip pardons a banned IP address so that they can connect again");
+ var1.log(" op turns a player into an op");
+ var1.log(" deop removes op status from a player");
+ var1.log(" tp moves one player to the same location as another player");
+ var1.log(" give [num] gives a player a resource");
+ var1.log(" tell sends a private message to a player");
+ var1.log(" stop gracefully stops the server");
+ var1.log(" save-all forces a server-wide level save");
+ var1.log(" save-off disables terrain saving (useful for backup scripts)");
+ var1.log(" save-on re-enables terrain saving");
+ var1.log(" list lists all currently connected players");
+ var1.log(" say broadcasts a message to all players");
+ var1.log(" time adds to or sets the world time (0-24000)");
+ }
+
+ private void sendNoticeToOps(String var1, String var2) {
+ String var3 = var1 + ": " + var2;
+ this.minecraftServer.configManager.sendChatMessageToAllOps("\u00a77(" + var3 + ")");
+ minecraftLogger.info(var3);
+ }
+
+ private int tryParse(String var1, int var2) {
+ try {
+ return Integer.parseInt(var1);
+ } catch (NumberFormatException var4) {
+ return var2;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ConsoleLogFormatter.java b/src/net/minecraft/src/ConsoleLogFormatter.java
new file mode 100644
index 0000000..67b463a
--- /dev/null
+++ b/src/net/minecraft/src/ConsoleLogFormatter.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.SimpleDateFormat;
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+final class ConsoleLogFormatter extends Formatter {
+ private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ public String format(LogRecord var1) {
+ StringBuilder var2 = new StringBuilder();
+ var2.append(this.dateFormat.format(Long.valueOf(var1.getMillis())));
+ Level var3 = var1.getLevel();
+ if(var3 == Level.FINEST) {
+ var2.append(" [FINEST] ");
+ } else if(var3 == Level.FINER) {
+ var2.append(" [FINER] ");
+ } else if(var3 == Level.FINE) {
+ var2.append(" [FINE] ");
+ } else if(var3 == Level.INFO) {
+ var2.append(" [INFO] ");
+ } else if(var3 == Level.WARNING) {
+ var2.append(" [WARNING] ");
+ } else if(var3 == Level.SEVERE) {
+ var2.append(" [SEVERE] ");
+ } else if(var3 == Level.SEVERE) {
+ var2.append(" [" + var3.getLocalizedName() + "] ");
+ }
+
+ var2.append(var1.getMessage());
+ var2.append('\n');
+ Throwable var4 = var1.getThrown();
+ if(var4 != null) {
+ StringWriter var5 = new StringWriter();
+ var4.printStackTrace(new PrintWriter(var5));
+ var2.append(var5.toString());
+ }
+
+ return var2.toString();
+ }
+}
diff --git a/src/net/minecraft/src/ConsoleLogManager.java b/src/net/minecraft/src/ConsoleLogManager.java
new file mode 100644
index 0000000..0da1e62
--- /dev/null
+++ b/src/net/minecraft/src/ConsoleLogManager.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+import java.util.logging.ConsoleHandler;
+import java.util.logging.FileHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class ConsoleLogManager {
+ public static Logger logger = Logger.getLogger("Minecraft");
+
+ public static void init() {
+ ConsoleLogFormatter var0 = new ConsoleLogFormatter();
+ logger.setUseParentHandlers(false);
+ ConsoleHandler var1 = new ConsoleHandler();
+ var1.setFormatter(var0);
+ logger.addHandler(var1);
+
+ try {
+ FileHandler var2 = new FileHandler("server.log", true);
+ var2.setFormatter(var0);
+ logger.addHandler(var2);
+ } catch (Exception var3) {
+ logger.log(Level.WARNING, "Failed to log to server.log", var3);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/Container.java b/src/net/minecraft/src/Container.java
new file mode 100644
index 0000000..33b5c62
--- /dev/null
+++ b/src/net/minecraft/src/Container.java
@@ -0,0 +1,272 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public abstract class Container {
+ public List inventoryItemStacks = new ArrayList();
+ public List inventorySlots = new ArrayList();
+ public int windowId = 0;
+ private short field_20132_a = 0;
+ protected List crafters = new ArrayList();
+ private Set field_20131_b = new HashSet();
+
+ protected void addSlot(Slot var1) {
+ var1.id = this.inventorySlots.size();
+ this.inventorySlots.add(var1);
+ this.inventoryItemStacks.add((Object)null);
+ }
+
+ public void onCraftGuiOpened(ICrafting var1) {
+ if(this.crafters.contains(var1)) {
+ throw new IllegalArgumentException("Listener already listening");
+ } else {
+ this.crafters.add(var1);
+ var1.updateCraftingInventory(this, this.func_28127_b());
+ this.updateCraftingMatrix();
+ }
+ }
+
+ public List func_28127_b() {
+ ArrayList var1 = new ArrayList();
+
+ for(int var2 = 0; var2 < this.inventorySlots.size(); ++var2) {
+ var1.add(((Slot)this.inventorySlots.get(var2)).getStack());
+ }
+
+ return var1;
+ }
+
+ public void updateCraftingMatrix() {
+ for(int var1 = 0; var1 < this.inventorySlots.size(); ++var1) {
+ ItemStack var2 = ((Slot)this.inventorySlots.get(var1)).getStack();
+ ItemStack var3 = (ItemStack)this.inventoryItemStacks.get(var1);
+ if(!ItemStack.areItemStacksEqual(var3, var2)) {
+ var3 = var2 == null ? null : var2.copy();
+ this.inventoryItemStacks.set(var1, var3);
+
+ for(int var4 = 0; var4 < this.crafters.size(); ++var4) {
+ ((ICrafting)this.crafters.get(var4)).updateCraftingInventorySlot(this, var1, var3);
+ }
+ }
+ }
+
+ }
+
+ public Slot func_20127_a(IInventory var1, int var2) {
+ for(int var3 = 0; var3 < this.inventorySlots.size(); ++var3) {
+ Slot var4 = (Slot)this.inventorySlots.get(var3);
+ if(var4.isHere(var1, var2)) {
+ return var4;
+ }
+ }
+
+ return null;
+ }
+
+ public Slot getSlot(int var1) {
+ return (Slot)this.inventorySlots.get(var1);
+ }
+
+ public ItemStack func_27086_a(int var1) {
+ Slot var2 = (Slot)this.inventorySlots.get(var1);
+ return var2 != null ? var2.getStack() : null;
+ }
+
+ public ItemStack func_27085_a(int var1, int var2, boolean var3, EntityPlayer var4) {
+ ItemStack var5 = null;
+ if(var2 == 0 || var2 == 1) {
+ InventoryPlayer var6 = var4.inventory;
+ if(var1 == -999) {
+ if(var6.getItemStack() != null && var1 == -999) {
+ if(var2 == 0) {
+ var4.dropPlayerItem(var6.getItemStack());
+ var6.setItemStack((ItemStack)null);
+ }
+
+ if(var2 == 1) {
+ var4.dropPlayerItem(var6.getItemStack().splitStack(1));
+ if(var6.getItemStack().stackSize == 0) {
+ var6.setItemStack((ItemStack)null);
+ }
+ }
+ }
+ } else {
+ int var10;
+ if(var3) {
+ ItemStack var7 = this.func_27086_a(var1);
+ if(var7 != null) {
+ int var8 = var7.stackSize;
+ var5 = var7.copy();
+ Slot var9 = (Slot)this.inventorySlots.get(var1);
+ if(var9 != null && var9.getStack() != null) {
+ var10 = var9.getStack().stackSize;
+ if(var10 < var8) {
+ this.func_27085_a(var1, var2, var3, var4);
+ }
+ }
+ }
+ } else {
+ Slot var12 = (Slot)this.inventorySlots.get(var1);
+ if(var12 != null) {
+ var12.onSlotChanged();
+ ItemStack var13 = var12.getStack();
+ ItemStack var14 = var6.getItemStack();
+ if(var13 != null) {
+ var5 = var13.copy();
+ }
+
+ if(var13 == null) {
+ if(var14 != null && var12.isItemValid(var14)) {
+ var10 = var2 == 0 ? var14.stackSize : 1;
+ if(var10 > var12.getSlotStackLimit()) {
+ var10 = var12.getSlotStackLimit();
+ }
+
+ var12.putStack(var14.splitStack(var10));
+ if(var14.stackSize == 0) {
+ var6.setItemStack((ItemStack)null);
+ }
+ }
+ } else if(var14 == null) {
+ var10 = var2 == 0 ? var13.stackSize : (var13.stackSize + 1) / 2;
+ ItemStack var11 = var12.decrStackSize(var10);
+ var6.setItemStack(var11);
+ if(var13.stackSize == 0) {
+ var12.putStack((ItemStack)null);
+ }
+
+ var12.onPickupFromSlot(var6.getItemStack());
+ } else if(var12.isItemValid(var14)) {
+ if(var13.itemID != var14.itemID || var13.getHasSubtypes() && var13.getItemDamage() != var14.getItemDamage()) {
+ if(var14.stackSize <= var12.getSlotStackLimit()) {
+ var12.putStack(var14);
+ var6.setItemStack(var13);
+ }
+ } else {
+ var10 = var2 == 0 ? var14.stackSize : 1;
+ if(var10 > var12.getSlotStackLimit() - var13.stackSize) {
+ var10 = var12.getSlotStackLimit() - var13.stackSize;
+ }
+
+ if(var10 > var14.getMaxStackSize() - var13.stackSize) {
+ var10 = var14.getMaxStackSize() - var13.stackSize;
+ }
+
+ var14.splitStack(var10);
+ if(var14.stackSize == 0) {
+ var6.setItemStack((ItemStack)null);
+ }
+
+ var13.stackSize += var10;
+ }
+ } else if(var13.itemID == var14.itemID && var14.getMaxStackSize() > 1 && (!var13.getHasSubtypes() || var13.getItemDamage() == var14.getItemDamage())) {
+ var10 = var13.stackSize;
+ if(var10 > 0 && var10 + var14.stackSize <= var14.getMaxStackSize()) {
+ var14.stackSize += var10;
+ var13.splitStack(var10);
+ if(var13.stackSize == 0) {
+ var12.putStack((ItemStack)null);
+ }
+
+ var12.onPickupFromSlot(var6.getItemStack());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return var5;
+ }
+
+ public void onCraftGuiClosed(EntityPlayer var1) {
+ InventoryPlayer var2 = var1.inventory;
+ if(var2.getItemStack() != null) {
+ var1.dropPlayerItem(var2.getItemStack());
+ var2.setItemStack((ItemStack)null);
+ }
+
+ }
+
+ public void onCraftMatrixChanged(IInventory var1) {
+ this.updateCraftingMatrix();
+ }
+
+ public boolean getCanCraft(EntityPlayer var1) {
+ return !this.field_20131_b.contains(var1);
+ }
+
+ public void setCanCraft(EntityPlayer var1, boolean var2) {
+ if(var2) {
+ this.field_20131_b.remove(var1);
+ } else {
+ this.field_20131_b.add(var1);
+ }
+
+ }
+
+ public abstract boolean canInteractWith(EntityPlayer var1);
+
+ protected void func_28126_a(ItemStack var1, int var2, int var3, boolean var4) {
+ int var5 = var2;
+ if(var4) {
+ var5 = var3 - 1;
+ }
+
+ Slot var6;
+ ItemStack var7;
+ if(var1.func_21132_c()) {
+ while(var1.stackSize > 0 && (!var4 && var5 < var3 || var4 && var5 >= var2)) {
+ var6 = (Slot)this.inventorySlots.get(var5);
+ var7 = var6.getStack();
+ if(var7 != null && var7.itemID == var1.itemID && (!var1.getHasSubtypes() || var1.getItemDamage() == var7.getItemDamage())) {
+ int var8 = var7.stackSize + var1.stackSize;
+ if(var8 <= var1.getMaxStackSize()) {
+ var1.stackSize = 0;
+ var7.stackSize = var8;
+ var6.onSlotChanged();
+ } else if(var7.stackSize < var1.getMaxStackSize()) {
+ var1.stackSize -= var1.getMaxStackSize() - var7.stackSize;
+ var7.stackSize = var1.getMaxStackSize();
+ var6.onSlotChanged();
+ }
+ }
+
+ if(var4) {
+ --var5;
+ } else {
+ ++var5;
+ }
+ }
+ }
+
+ if(var1.stackSize > 0) {
+ if(var4) {
+ var5 = var3 - 1;
+ } else {
+ var5 = var2;
+ }
+
+ while(!var4 && var5 < var3 || var4 && var5 >= var2) {
+ var6 = (Slot)this.inventorySlots.get(var5);
+ var7 = var6.getStack();
+ if(var7 == null) {
+ var6.putStack(var1.copy());
+ var6.onSlotChanged();
+ var1.stackSize = 0;
+ break;
+ }
+
+ if(var4) {
+ --var5;
+ } else {
+ ++var5;
+ }
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/ContainerChest.java b/src/net/minecraft/src/ContainerChest.java
new file mode 100644
index 0000000..1cc9adf
--- /dev/null
+++ b/src/net/minecraft/src/ContainerChest.java
@@ -0,0 +1,57 @@
+package net.minecraft.src;
+
+public class ContainerChest extends Container {
+ private IInventory field_20137_a;
+ private int field_27088_b;
+
+ public ContainerChest(IInventory var1, IInventory var2) {
+ this.field_20137_a = var2;
+ this.field_27088_b = var2.getSizeInventory() / 9;
+ int var3 = (this.field_27088_b - 4) * 18;
+
+ int var4;
+ int var5;
+ for(var4 = 0; var4 < this.field_27088_b; ++var4) {
+ for(var5 = 0; var5 < 9; ++var5) {
+ this.addSlot(new Slot(var2, var5 + var4 * 9, 8 + var5 * 18, 18 + var4 * 18));
+ }
+ }
+
+ for(var4 = 0; var4 < 3; ++var4) {
+ for(var5 = 0; var5 < 9; ++var5) {
+ this.addSlot(new Slot(var1, var5 + var4 * 9 + 9, 8 + var5 * 18, 103 + var4 * 18 + var3));
+ }
+ }
+
+ for(var4 = 0; var4 < 9; ++var4) {
+ this.addSlot(new Slot(var1, var4, 8 + var4 * 18, 161 + var3));
+ }
+
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.field_20137_a.canInteractWith(var1);
+ }
+
+ public ItemStack func_27086_a(int var1) {
+ ItemStack var2 = null;
+ Slot var3 = (Slot)this.inventorySlots.get(var1);
+ if(var3 != null && var3.func_27006_b()) {
+ ItemStack var4 = var3.getStack();
+ var2 = var4.copy();
+ if(var1 < this.field_27088_b * 9) {
+ this.func_28126_a(var4, this.field_27088_b * 9, this.inventorySlots.size(), true);
+ } else {
+ this.func_28126_a(var4, 0, this.field_27088_b * 9, false);
+ }
+
+ if(var4.stackSize == 0) {
+ var3.putStack((ItemStack)null);
+ } else {
+ var3.onSlotChanged();
+ }
+ }
+
+ return var2;
+ }
+}
diff --git a/src/net/minecraft/src/ContainerDispenser.java b/src/net/minecraft/src/ContainerDispenser.java
new file mode 100644
index 0000000..2a250e2
--- /dev/null
+++ b/src/net/minecraft/src/ContainerDispenser.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+public class ContainerDispenser extends Container {
+ private TileEntityDispenser field_21133_a;
+
+ public ContainerDispenser(IInventory var1, TileEntityDispenser var2) {
+ this.field_21133_a = var2;
+
+ int var3;
+ int var4;
+ for(var3 = 0; var3 < 3; ++var3) {
+ for(var4 = 0; var4 < 3; ++var4) {
+ this.addSlot(new Slot(var2, var4 + var3 * 3, 62 + var4 * 18, 17 + var3 * 18));
+ }
+ }
+
+ for(var3 = 0; var3 < 3; ++var3) {
+ for(var4 = 0; var4 < 9; ++var4) {
+ this.addSlot(new Slot(var1, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18));
+ }
+ }
+
+ for(var3 = 0; var3 < 9; ++var3) {
+ this.addSlot(new Slot(var1, var3, 8 + var3 * 18, 142));
+ }
+
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.field_21133_a.canInteractWith(var1);
+ }
+}
diff --git a/src/net/minecraft/src/ContainerFurnace.java b/src/net/minecraft/src/ContainerFurnace.java
new file mode 100644
index 0000000..4c3a06c
--- /dev/null
+++ b/src/net/minecraft/src/ContainerFurnace.java
@@ -0,0 +1,93 @@
+package net.minecraft.src;
+
+public class ContainerFurnace extends Container {
+ private TileEntityFurnace furnace;
+ private int lastCookTime = 0;
+ private int lastBurnTime = 0;
+ private int lastItemBurnTime = 0;
+
+ public ContainerFurnace(InventoryPlayer var1, TileEntityFurnace var2) {
+ this.furnace = var2;
+ this.addSlot(new Slot(var2, 0, 56, 17));
+ this.addSlot(new Slot(var2, 1, 56, 53));
+ this.addSlot(new SlotFurnace(var1.player, var2, 2, 116, 35));
+
+ int var3;
+ for(var3 = 0; var3 < 3; ++var3) {
+ for(int var4 = 0; var4 < 9; ++var4) {
+ this.addSlot(new Slot(var1, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18));
+ }
+ }
+
+ for(var3 = 0; var3 < 9; ++var3) {
+ this.addSlot(new Slot(var1, var3, 8 + var3 * 18, 142));
+ }
+
+ }
+
+ public void onCraftGuiOpened(ICrafting var1) {
+ super.onCraftGuiOpened(var1);
+ var1.updateCraftingInventoryInfo(this, 0, this.furnace.furnaceCookTime);
+ var1.updateCraftingInventoryInfo(this, 1, this.furnace.furnaceBurnTime);
+ var1.updateCraftingInventoryInfo(this, 2, this.furnace.currentItemBurnTime);
+ }
+
+ public void updateCraftingMatrix() {
+ super.updateCraftingMatrix();
+
+ for(int var1 = 0; var1 < this.crafters.size(); ++var1) {
+ ICrafting var2 = (ICrafting)this.crafters.get(var1);
+ if(this.lastCookTime != this.furnace.furnaceCookTime) {
+ var2.updateCraftingInventoryInfo(this, 0, this.furnace.furnaceCookTime);
+ }
+
+ if(this.lastBurnTime != this.furnace.furnaceBurnTime) {
+ var2.updateCraftingInventoryInfo(this, 1, this.furnace.furnaceBurnTime);
+ }
+
+ if(this.lastItemBurnTime != this.furnace.currentItemBurnTime) {
+ var2.updateCraftingInventoryInfo(this, 2, this.furnace.currentItemBurnTime);
+ }
+ }
+
+ this.lastCookTime = this.furnace.furnaceCookTime;
+ this.lastBurnTime = this.furnace.furnaceBurnTime;
+ this.lastItemBurnTime = this.furnace.currentItemBurnTime;
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.furnace.canInteractWith(var1);
+ }
+
+ public ItemStack func_27086_a(int var1) {
+ ItemStack var2 = null;
+ Slot var3 = (Slot)this.inventorySlots.get(var1);
+ if(var3 != null && var3.func_27006_b()) {
+ ItemStack var4 = var3.getStack();
+ var2 = var4.copy();
+ if(var1 == 2) {
+ this.func_28126_a(var4, 3, 39, true);
+ } else if(var1 >= 3 && var1 < 30) {
+ this.func_28126_a(var4, 30, 39, false);
+ } else if(var1 >= 30 && var1 < 39) {
+ this.func_28126_a(var4, 3, 30, false);
+ } else {
+ this.func_28126_a(var4, 3, 39, false);
+ }
+
+ if(var4.stackSize == 0) {
+ var3.putStack((ItemStack)null);
+ } else {
+ var3.onSlotChanged();
+ }
+
+ if(var4.stackSize == var2.stackSize) {
+ return null;
+ }
+
+ var3.onPickupFromSlot(var4);
+ }
+
+ return var2;
+ }
+}
diff --git a/src/net/minecraft/src/ContainerPlayer.java b/src/net/minecraft/src/ContainerPlayer.java
new file mode 100644
index 0000000..db9cc13
--- /dev/null
+++ b/src/net/minecraft/src/ContainerPlayer.java
@@ -0,0 +1,96 @@
+package net.minecraft.src;
+
+public class ContainerPlayer extends Container {
+ public InventoryCrafting craftMatrix;
+ public IInventory craftResult;
+ public boolean isMP;
+
+ public ContainerPlayer(InventoryPlayer var1) {
+ this(var1, true);
+ }
+
+ public ContainerPlayer(InventoryPlayer var1, boolean var2) {
+ this.craftMatrix = new InventoryCrafting(this, 2, 2);
+ this.craftResult = new InventoryCraftResult();
+ this.isMP = false;
+ this.isMP = var2;
+ this.addSlot(new SlotCrafting(var1.player, this.craftMatrix, this.craftResult, 0, 144, 36));
+
+ int var3;
+ int var4;
+ for(var3 = 0; var3 < 2; ++var3) {
+ for(var4 = 0; var4 < 2; ++var4) {
+ this.addSlot(new Slot(this.craftMatrix, var4 + var3 * 2, 88 + var4 * 18, 26 + var3 * 18));
+ }
+ }
+
+ for(var3 = 0; var3 < 4; ++var3) {
+ this.addSlot(new SlotArmor(this, var1, var1.getSizeInventory() - 1 - var3, 8, 8 + var3 * 18, var3));
+ }
+
+ for(var3 = 0; var3 < 3; ++var3) {
+ for(var4 = 0; var4 < 9; ++var4) {
+ this.addSlot(new Slot(var1, var4 + (var3 + 1) * 9, 8 + var4 * 18, 84 + var3 * 18));
+ }
+ }
+
+ for(var3 = 0; var3 < 9; ++var3) {
+ this.addSlot(new Slot(var1, var3, 8 + var3 * 18, 142));
+ }
+
+ this.onCraftMatrixChanged(this.craftMatrix);
+ }
+
+ public void onCraftMatrixChanged(IInventory var1) {
+ this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.craftMatrix));
+ }
+
+ public void onCraftGuiClosed(EntityPlayer var1) {
+ super.onCraftGuiClosed(var1);
+
+ for(int var2 = 0; var2 < 4; ++var2) {
+ ItemStack var3 = this.craftMatrix.getStackInSlot(var2);
+ if(var3 != null) {
+ var1.dropPlayerItem(var3);
+ this.craftMatrix.setInventorySlotContents(var2, (ItemStack)null);
+ }
+ }
+
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return true;
+ }
+
+ public ItemStack func_27086_a(int var1) {
+ ItemStack var2 = null;
+ Slot var3 = (Slot)this.inventorySlots.get(var1);
+ if(var3 != null && var3.func_27006_b()) {
+ ItemStack var4 = var3.getStack();
+ var2 = var4.copy();
+ if(var1 == 0) {
+ this.func_28126_a(var4, 9, 45, true);
+ } else if(var1 >= 9 && var1 < 36) {
+ this.func_28126_a(var4, 36, 45, false);
+ } else if(var1 >= 36 && var1 < 45) {
+ this.func_28126_a(var4, 9, 36, false);
+ } else {
+ this.func_28126_a(var4, 9, 45, false);
+ }
+
+ if(var4.stackSize == 0) {
+ var3.putStack((ItemStack)null);
+ } else {
+ var3.onSlotChanged();
+ }
+
+ if(var4.stackSize == var2.stackSize) {
+ return null;
+ }
+
+ var3.onPickupFromSlot(var4);
+ }
+
+ return var2;
+ }
+}
diff --git a/src/net/minecraft/src/ContainerWorkbench.java b/src/net/minecraft/src/ContainerWorkbench.java
new file mode 100644
index 0000000..8192407
--- /dev/null
+++ b/src/net/minecraft/src/ContainerWorkbench.java
@@ -0,0 +1,91 @@
+package net.minecraft.src;
+
+public class ContainerWorkbench extends Container {
+ public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3);
+ public IInventory craftResult = new InventoryCraftResult();
+ private World field_20150_c;
+ private int field_20149_h;
+ private int field_20148_i;
+ private int field_20147_j;
+
+ public ContainerWorkbench(InventoryPlayer var1, World var2, int var3, int var4, int var5) {
+ this.field_20150_c = var2;
+ this.field_20149_h = var3;
+ this.field_20148_i = var4;
+ this.field_20147_j = var5;
+ this.addSlot(new SlotCrafting(var1.player, this.craftMatrix, this.craftResult, 0, 124, 35));
+
+ int var6;
+ int var7;
+ for(var6 = 0; var6 < 3; ++var6) {
+ for(var7 = 0; var7 < 3; ++var7) {
+ this.addSlot(new Slot(this.craftMatrix, var7 + var6 * 3, 30 + var7 * 18, 17 + var6 * 18));
+ }
+ }
+
+ for(var6 = 0; var6 < 3; ++var6) {
+ for(var7 = 0; var7 < 9; ++var7) {
+ this.addSlot(new Slot(var1, var7 + var6 * 9 + 9, 8 + var7 * 18, 84 + var6 * 18));
+ }
+ }
+
+ for(var6 = 0; var6 < 9; ++var6) {
+ this.addSlot(new Slot(var1, var6, 8 + var6 * 18, 142));
+ }
+
+ this.onCraftMatrixChanged(this.craftMatrix);
+ }
+
+ public void onCraftMatrixChanged(IInventory var1) {
+ this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().findMatchingRecipe(this.craftMatrix));
+ }
+
+ public void onCraftGuiClosed(EntityPlayer var1) {
+ super.onCraftGuiClosed(var1);
+ if(!this.field_20150_c.singleplayerWorld) {
+ for(int var2 = 0; var2 < 9; ++var2) {
+ ItemStack var3 = this.craftMatrix.getStackInSlot(var2);
+ if(var3 != null) {
+ var1.dropPlayerItem(var3);
+ }
+ }
+
+ }
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.field_20150_c.getBlockId(this.field_20149_h, this.field_20148_i, this.field_20147_j) != Block.workbench.blockID ? false : var1.getDistanceSq((double)this.field_20149_h + 0.5D, (double)this.field_20148_i + 0.5D, (double)this.field_20147_j + 0.5D) <= 64.0D;
+ }
+
+ public ItemStack func_27086_a(int var1) {
+ ItemStack var2 = null;
+ Slot var3 = (Slot)this.inventorySlots.get(var1);
+ if(var3 != null && var3.func_27006_b()) {
+ ItemStack var4 = var3.getStack();
+ var2 = var4.copy();
+ if(var1 == 0) {
+ this.func_28126_a(var4, 10, 46, true);
+ } else if(var1 >= 10 && var1 < 37) {
+ this.func_28126_a(var4, 37, 46, false);
+ } else if(var1 >= 37 && var1 < 46) {
+ this.func_28126_a(var4, 10, 37, false);
+ } else {
+ this.func_28126_a(var4, 10, 46, false);
+ }
+
+ if(var4.stackSize == 0) {
+ var3.putStack((ItemStack)null);
+ } else {
+ var3.onSlotChanged();
+ }
+
+ if(var4.stackSize == var2.stackSize) {
+ return null;
+ }
+
+ var3.onPickupFromSlot(var4);
+ }
+
+ return var2;
+ }
+}
diff --git a/src/net/minecraft/src/ConvertProgressUpdater.java b/src/net/minecraft/src/ConvertProgressUpdater.java
new file mode 100644
index 0000000..b8621f3
--- /dev/null
+++ b/src/net/minecraft/src/ConvertProgressUpdater.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+import net.minecraft.server.MinecraftServer;
+
+public class ConvertProgressUpdater implements IProgressUpdate {
+ private long lastTimeMillis;
+ final MinecraftServer mcServer;
+
+ public ConvertProgressUpdater(MinecraftServer var1) {
+ this.mcServer = var1;
+ this.lastTimeMillis = System.currentTimeMillis();
+ }
+
+ public void func_438_a(String var1) {
+ }
+
+ public void setLoadingProgress(int var1) {
+ if(System.currentTimeMillis() - this.lastTimeMillis >= 1000L) {
+ this.lastTimeMillis = System.currentTimeMillis();
+ MinecraftServer.logger.info("Converting... " + var1 + "%");
+ }
+
+ }
+
+ public void displayLoadingString(String var1) {
+ }
+}
diff --git a/src/net/minecraft/src/CraftingManager.java b/src/net/minecraft/src/CraftingManager.java
new file mode 100644
index 0000000..263c33e
--- /dev/null
+++ b/src/net/minecraft/src/CraftingManager.java
@@ -0,0 +1,174 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+public class CraftingManager {
+ private static final CraftingManager instance = new CraftingManager();
+ private List recipes = new ArrayList();
+
+ public static final CraftingManager getInstance() {
+ return instance;
+ }
+
+ private CraftingManager() {
+ (new RecipesTools()).addRecipes(this);
+ (new RecipesWeapons()).addRecipes(this);
+ (new RecipesIngots()).addRecipes(this);
+ (new RecipesFood()).addRecipes(this);
+ (new RecipesCrafting()).addRecipes(this);
+ (new RecipesArmor()).addRecipes(this);
+ (new RecipesDyes()).addRecipes(this);
+ this.addRecipe(new ItemStack(Item.paper, 3), new Object[]{"###", Character.valueOf('#'), Item.reed});
+ this.addRecipe(new ItemStack(Item.book, 1), new Object[]{"#", "#", "#", Character.valueOf('#'), Item.paper});
+ this.addRecipe(new ItemStack(Block.fence, 2), new Object[]{"###", "###", Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Block.jukebox, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.diamond});
+ this.addRecipe(new ItemStack(Block.musicBlock, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.redstone});
+ this.addRecipe(new ItemStack(Block.bookShelf, 1), new Object[]{"###", "XXX", "###", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.book});
+ this.addRecipe(new ItemStack(Block.blockSnow, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.snowball});
+ this.addRecipe(new ItemStack(Block.blockClay, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.clay});
+ this.addRecipe(new ItemStack(Block.brick, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.brick});
+ this.addRecipe(new ItemStack(Block.glowStone, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.lightStoneDust});
+ this.addRecipe(new ItemStack(Block.cloth, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.silk});
+ this.addRecipe(new ItemStack(Block.tnt, 1), new Object[]{"X#X", "#X#", "X#X", Character.valueOf('X'), Item.gunpowder, Character.valueOf('#'), Block.sand});
+ this.addRecipe(new ItemStack(Block.stairSingle, 3, 3), new Object[]{"###", Character.valueOf('#'), Block.cobblestone});
+ this.addRecipe(new ItemStack(Block.stairSingle, 3, 0), new Object[]{"###", Character.valueOf('#'), Block.stone});
+ this.addRecipe(new ItemStack(Block.stairSingle, 3, 1), new Object[]{"###", Character.valueOf('#'), Block.sandStone});
+ this.addRecipe(new ItemStack(Block.stairSingle, 3, 2), new Object[]{"###", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Block.ladder, 2), new Object[]{"# #", "###", "# #", Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Item.doorWood, 1), new Object[]{"##", "##", "##", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Block.trapdoor, 2), new Object[]{"###", "###", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Item.doorSteel, 1), new Object[]{"##", "##", "##", Character.valueOf('#'), Item.ingotIron});
+ this.addRecipe(new ItemStack(Item.sign, 1), new Object[]{"###", "###", " X ", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.stick});
+ this.addRecipe(new ItemStack(Item.cake, 1), new Object[]{"AAA", "BEB", "CCC", Character.valueOf('A'), Item.bucketMilk, Character.valueOf('B'), Item.sugar, Character.valueOf('C'), Item.wheat, Character.valueOf('E'), Item.egg});
+ this.addRecipe(new ItemStack(Item.sugar, 1), new Object[]{"#", Character.valueOf('#'), Item.reed});
+ this.addRecipe(new ItemStack(Block.planks, 4), new Object[]{"#", Character.valueOf('#'), Block.wood});
+ this.addRecipe(new ItemStack(Item.stick, 4), new Object[]{"#", "#", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Block.torchWood, 4), new Object[]{"X", "#", Character.valueOf('X'), Item.coal, Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Block.torchWood, 4), new Object[]{"X", "#", Character.valueOf('X'), new ItemStack(Item.coal, 1, 1), Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Item.bowlEmpty, 4), new Object[]{"# #", " # ", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Block.minecartTrack, 16), new Object[]{"X X", "X#X", "X X", Character.valueOf('X'), Item.ingotIron, Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Block.railPowered, 6), new Object[]{"X X", "X#X", "XRX", Character.valueOf('X'), Item.ingotGold, Character.valueOf('R'), Item.redstone, Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Block.railDetector, 6), new Object[]{"X X", "X#X", "XRX", Character.valueOf('X'), Item.ingotIron, Character.valueOf('R'), Item.redstone, Character.valueOf('#'), Block.pressurePlateStone});
+ this.addRecipe(new ItemStack(Item.minecartEmpty, 1), new Object[]{"# #", "###", Character.valueOf('#'), Item.ingotIron});
+ this.addRecipe(new ItemStack(Block.pumpkinLantern, 1), new Object[]{"A", "B", Character.valueOf('A'), Block.pumpkin, Character.valueOf('B'), Block.torchWood});
+ this.addRecipe(new ItemStack(Item.minecartCrate, 1), new Object[]{"A", "B", Character.valueOf('A'), Block.chest, Character.valueOf('B'), Item.minecartEmpty});
+ this.addRecipe(new ItemStack(Item.minecartPowered, 1), new Object[]{"A", "B", Character.valueOf('A'), Block.stoneOvenIdle, Character.valueOf('B'), Item.minecartEmpty});
+ this.addRecipe(new ItemStack(Item.boat, 1), new Object[]{"# #", "###", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Item.bucketEmpty, 1), new Object[]{"# #", " # ", Character.valueOf('#'), Item.ingotIron});
+ this.addRecipe(new ItemStack(Item.flintAndSteel, 1), new Object[]{"A ", " B", Character.valueOf('A'), Item.ingotIron, Character.valueOf('B'), Item.flint});
+ this.addRecipe(new ItemStack(Item.bread, 1), new Object[]{"###", Character.valueOf('#'), Item.wheat});
+ this.addRecipe(new ItemStack(Block.stairCompactPlanks, 4), new Object[]{"# ", "## ", "###", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Item.fishingRod, 1), new Object[]{" #", " #X", "# X", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.silk});
+ this.addRecipe(new ItemStack(Block.stairCompactCobblestone, 4), new Object[]{"# ", "## ", "###", Character.valueOf('#'), Block.cobblestone});
+ this.addRecipe(new ItemStack(Item.painting, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Block.cloth});
+ this.addRecipe(new ItemStack(Item.appleGold, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Block.blockGold, Character.valueOf('X'), Item.appleRed});
+ this.addRecipe(new ItemStack(Block.lever, 1), new Object[]{"X", "#", Character.valueOf('#'), Block.cobblestone, Character.valueOf('X'), Item.stick});
+ this.addRecipe(new ItemStack(Block.torchRedstoneActive, 1), new Object[]{"X", "#", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.redstone});
+ this.addRecipe(new ItemStack(Item.redstoneRepeater, 1), new Object[]{"#X#", "III", Character.valueOf('#'), Block.torchRedstoneActive, Character.valueOf('X'), Item.redstone, Character.valueOf('I'), Block.stone});
+ this.addRecipe(new ItemStack(Item.pocketSundial, 1), new Object[]{" # ", "#X#", " # ", Character.valueOf('#'), Item.ingotGold, Character.valueOf('X'), Item.redstone});
+ this.addRecipe(new ItemStack(Item.compass, 1), new Object[]{" # ", "#X#", " # ", Character.valueOf('#'), Item.ingotIron, Character.valueOf('X'), Item.redstone});
+ this.addRecipe(new ItemStack(Item.field_28021_bb, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Item.paper, Character.valueOf('X'), Item.compass});
+ this.addRecipe(new ItemStack(Block.button, 1), new Object[]{"#", "#", Character.valueOf('#'), Block.stone});
+ this.addRecipe(new ItemStack(Block.pressurePlateStone, 1), new Object[]{"##", Character.valueOf('#'), Block.stone});
+ this.addRecipe(new ItemStack(Block.pressurePlatePlanks, 1), new Object[]{"##", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Block.dispenser, 1), new Object[]{"###", "#X#", "#R#", Character.valueOf('#'), Block.cobblestone, Character.valueOf('X'), Item.bow, Character.valueOf('R'), Item.redstone});
+ this.addRecipe(new ItemStack(Block.pistonBase, 1), new Object[]{"TTT", "#X#", "#R#", Character.valueOf('#'), Block.cobblestone, Character.valueOf('X'), Item.ingotIron, Character.valueOf('R'), Item.redstone, Character.valueOf('T'), Block.planks});
+ this.addRecipe(new ItemStack(Block.pistonStickyBase, 1), new Object[]{"S", "P", Character.valueOf('S'), Item.slimeBall, Character.valueOf('P'), Block.pistonBase});
+ this.addRecipe(new ItemStack(Item.bed, 1), new Object[]{"###", "XXX", Character.valueOf('#'), Block.cloth, Character.valueOf('X'), Block.planks});
+ Collections.sort(this.recipes, new RecipeSorter(this));
+ System.out.println(this.recipes.size() + " recipes");
+ }
+
+ void addRecipe(ItemStack var1, Object... var2) {
+ String var3 = "";
+ int var4 = 0;
+ int var5 = 0;
+ int var6 = 0;
+ if(var2[var4] instanceof String[]) {
+ String[] var11 = (String[])((String[])var2[var4++]);
+
+ for(int var8 = 0; var8 < var11.length; ++var8) {
+ String var9 = var11[var8];
+ ++var6;
+ var5 = var9.length();
+ var3 = var3 + var9;
+ }
+ } else {
+ while(var2[var4] instanceof String) {
+ String var7 = (String)var2[var4++];
+ ++var6;
+ var5 = var7.length();
+ var3 = var3 + var7;
+ }
+ }
+
+ HashMap var12;
+ for(var12 = new HashMap(); var4 < var2.length; var4 += 2) {
+ Character var13 = (Character)var2[var4];
+ ItemStack var15 = null;
+ if(var2[var4 + 1] instanceof Item) {
+ var15 = new ItemStack((Item)var2[var4 + 1]);
+ } else if(var2[var4 + 1] instanceof Block) {
+ var15 = new ItemStack((Block)var2[var4 + 1], 1, -1);
+ } else if(var2[var4 + 1] instanceof ItemStack) {
+ var15 = (ItemStack)var2[var4 + 1];
+ }
+
+ var12.put(var13, var15);
+ }
+
+ ItemStack[] var14 = new ItemStack[var5 * var6];
+
+ for(int var16 = 0; var16 < var5 * var6; ++var16) {
+ char var10 = var3.charAt(var16);
+ if(var12.containsKey(Character.valueOf(var10))) {
+ var14[var16] = ((ItemStack)var12.get(Character.valueOf(var10))).copy();
+ } else {
+ var14[var16] = null;
+ }
+ }
+
+ this.recipes.add(new ShapedRecipes(var5, var6, var14, var1));
+ }
+
+ void addShapelessRecipe(ItemStack var1, Object... var2) {
+ ArrayList var3 = new ArrayList();
+ Object[] var4 = var2;
+ int var5 = var2.length;
+
+ for(int var6 = 0; var6 < var5; ++var6) {
+ Object var7 = var4[var6];
+ if(var7 instanceof ItemStack) {
+ var3.add(((ItemStack)var7).copy());
+ } else if(var7 instanceof Item) {
+ var3.add(new ItemStack((Item)var7));
+ } else {
+ if(!(var7 instanceof Block)) {
+ throw new RuntimeException("Invalid shapeless recipy!");
+ }
+
+ var3.add(new ItemStack((Block)var7));
+ }
+ }
+
+ this.recipes.add(new ShapelessRecipes(var1, var3));
+ }
+
+ public ItemStack findMatchingRecipe(InventoryCrafting var1) {
+ for(int var2 = 0; var2 < this.recipes.size(); ++var2) {
+ IRecipe var3 = (IRecipe)this.recipes.get(var2);
+ if(var3.func_21134_a(var1)) {
+ return var3.func_21136_b(var1);
+ }
+ }
+
+ return null;
+ }
+
+ public List getRecipeList() {
+ return this.recipes;
+ }
+}
diff --git a/src/net/minecraft/src/DataWatcher.java b/src/net/minecraft/src/DataWatcher.java
new file mode 100644
index 0000000..abd3115
--- /dev/null
+++ b/src/net/minecraft/src/DataWatcher.java
@@ -0,0 +1,192 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class DataWatcher {
+ private static final HashMap dataTypes = new HashMap();
+ private final Map watchedObjects = new HashMap();
+ private boolean objectChanged;
+
+ public void addObject(int var1, Object var2) {
+ Integer var3 = (Integer)dataTypes.get(var2.getClass());
+ if(var3 == null) {
+ throw new IllegalArgumentException("Unknown data type: " + var2.getClass());
+ } else if(var1 > 31) {
+ throw new IllegalArgumentException("Data value id is too big with " + var1 + "! (Max is " + 31 + ")");
+ } else if(this.watchedObjects.containsKey(Integer.valueOf(var1))) {
+ throw new IllegalArgumentException("Duplicate id value for " + var1 + "!");
+ } else {
+ WatchableObject var4 = new WatchableObject(var3.intValue(), var1, var2);
+ this.watchedObjects.put(Integer.valueOf(var1), var4);
+ }
+ }
+
+ public byte getWatchableObjectByte(int var1) {
+ return ((Byte)((WatchableObject)this.watchedObjects.get(Integer.valueOf(var1))).getObject()).byteValue();
+ }
+
+ public int getWatchableObjectInteger(int var1) {
+ return ((Integer)((WatchableObject)this.watchedObjects.get(Integer.valueOf(var1))).getObject()).intValue();
+ }
+
+ public String getWatchableObjectString(int var1) {
+ return (String)((WatchableObject)this.watchedObjects.get(Integer.valueOf(var1))).getObject();
+ }
+
+ public void updateObject(int var1, Object var2) {
+ WatchableObject var3 = (WatchableObject)this.watchedObjects.get(Integer.valueOf(var1));
+ if(!var2.equals(var3.getObject())) {
+ var3.setObject(var2);
+ var3.setWatching(true);
+ this.objectChanged = true;
+ }
+
+ }
+
+ public boolean hasObjectChanged() {
+ return this.objectChanged;
+ }
+
+ public static void writeObjectsInListToStream(List var0, DataOutputStream var1) throws IOException {
+ if(var0 != null) {
+ Iterator var2 = var0.iterator();
+
+ while(var2.hasNext()) {
+ WatchableObject var3 = (WatchableObject)var2.next();
+ writeWatchableObject(var1, var3);
+ }
+ }
+
+ var1.writeByte(127);
+ }
+
+ public ArrayList getChangedObjects() {
+ ArrayList var1 = null;
+ if(this.objectChanged) {
+ Iterator var2 = this.watchedObjects.values().iterator();
+
+ while(var2.hasNext()) {
+ WatchableObject var3 = (WatchableObject)var2.next();
+ if(var3.getWatching()) {
+ var3.setWatching(false);
+ if(var1 == null) {
+ var1 = new ArrayList();
+ }
+
+ var1.add(var3);
+ }
+ }
+ }
+
+ this.objectChanged = false;
+ return var1;
+ }
+
+ public void writeWatchableObjects(DataOutputStream var1) throws IOException {
+ Iterator var2 = this.watchedObjects.values().iterator();
+
+ while(var2.hasNext()) {
+ WatchableObject var3 = (WatchableObject)var2.next();
+ writeWatchableObject(var1, var3);
+ }
+
+ var1.writeByte(127);
+ }
+
+ private static void writeWatchableObject(DataOutputStream var0, WatchableObject var1) throws IOException {
+ int var2 = (var1.getObjectType() << 5 | var1.getDataValueId() & 31) & 255;
+ var0.writeByte(var2);
+ switch(var1.getObjectType()) {
+ case 0:
+ var0.writeByte(((Byte)var1.getObject()).byteValue());
+ break;
+ case 1:
+ var0.writeShort(((Short)var1.getObject()).shortValue());
+ break;
+ case 2:
+ var0.writeInt(((Integer)var1.getObject()).intValue());
+ break;
+ case 3:
+ var0.writeFloat(((Float)var1.getObject()).floatValue());
+ break;
+ case 4:
+ Packet.writeString((String)var1.getObject(), var0);
+ break;
+ case 5:
+ ItemStack var4 = (ItemStack)var1.getObject();
+ var0.writeShort(var4.getItem().shiftedIndex);
+ var0.writeByte(var4.stackSize);
+ var0.writeShort(var4.getItemDamage());
+ break;
+ case 6:
+ ChunkCoordinates var3 = (ChunkCoordinates)var1.getObject();
+ var0.writeInt(var3.posX);
+ var0.writeInt(var3.posY);
+ var0.writeInt(var3.posZ);
+ }
+
+ }
+
+ public static List readWatchableObjects(DataInputStream var0) throws IOException {
+ ArrayList var1 = null;
+
+ for(byte var2 = var0.readByte(); var2 != 127; var2 = var0.readByte()) {
+ if(var1 == null) {
+ var1 = new ArrayList();
+ }
+
+ int var3 = (var2 & 224) >> 5;
+ int var4 = var2 & 31;
+ WatchableObject var5 = null;
+ switch(var3) {
+ case 0:
+ var5 = new WatchableObject(var3, var4, Byte.valueOf(var0.readByte()));
+ break;
+ case 1:
+ var5 = new WatchableObject(var3, var4, Short.valueOf(var0.readShort()));
+ break;
+ case 2:
+ var5 = new WatchableObject(var3, var4, Integer.valueOf(var0.readInt()));
+ break;
+ case 3:
+ var5 = new WatchableObject(var3, var4, Float.valueOf(var0.readFloat()));
+ break;
+ case 4:
+ var5 = new WatchableObject(var3, var4, Packet.readString(var0, 64));
+ break;
+ case 5:
+ short var9 = var0.readShort();
+ byte var10 = var0.readByte();
+ short var11 = var0.readShort();
+ var5 = new WatchableObject(var3, var4, new ItemStack(var9, var10, var11));
+ break;
+ case 6:
+ int var6 = var0.readInt();
+ int var7 = var0.readInt();
+ int var8 = var0.readInt();
+ var5 = new WatchableObject(var3, var4, new ChunkCoordinates(var6, var7, var8));
+ }
+
+ var1.add(var5);
+ }
+
+ return var1;
+ }
+
+ static {
+ dataTypes.put(Byte.class, Integer.valueOf(0));
+ dataTypes.put(Short.class, Integer.valueOf(1));
+ dataTypes.put(Integer.class, Integer.valueOf(2));
+ dataTypes.put(Float.class, Integer.valueOf(3));
+ dataTypes.put(String.class, Integer.valueOf(4));
+ dataTypes.put(ItemStack.class, Integer.valueOf(5));
+ dataTypes.put(ChunkCoordinates.class, Integer.valueOf(6));
+ }
+}
diff --git a/src/net/minecraft/src/Empty1.java b/src/net/minecraft/src/Empty1.java
new file mode 100644
index 0000000..1eb0d12
--- /dev/null
+++ b/src/net/minecraft/src/Empty1.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+class Empty1 {
+}
diff --git a/src/net/minecraft/src/Empty2.java b/src/net/minecraft/src/Empty2.java
new file mode 100644
index 0000000..29174df
--- /dev/null
+++ b/src/net/minecraft/src/Empty2.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+class Empty2 {
+}
diff --git a/src/net/minecraft/src/EmptyChunk.java b/src/net/minecraft/src/EmptyChunk.java
new file mode 100644
index 0000000..431840c
--- /dev/null
+++ b/src/net/minecraft/src/EmptyChunk.java
@@ -0,0 +1,127 @@
+package net.minecraft.src;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+
+public class EmptyChunk extends Chunk {
+ public EmptyChunk(World var1, int var2, int var3) {
+ super(var1, var2, var3);
+ this.neverSave = true;
+ }
+
+ public EmptyChunk(World var1, byte[] var2, int var3, int var4) {
+ super(var1, var2, var3, var4);
+ this.neverSave = true;
+ }
+
+ public boolean isAtLocation(int var1, int var2) {
+ return var1 == this.xPosition && var2 == this.zPosition;
+ }
+
+ public int getHeightValue(int var1, int var2) {
+ return 0;
+ }
+
+ public void func_348_a() {
+ }
+
+ public void func_353_b() {
+ }
+
+ public void func_4053_c() {
+ }
+
+ public int getBlockID(int var1, int var2, int var3) {
+ return 0;
+ }
+
+ public boolean setBlockIDWithMetadata(int var1, int var2, int var3, int var4, int var5) {
+ return true;
+ }
+
+ public boolean setBlockID(int var1, int var2, int var3, int var4) {
+ return true;
+ }
+
+ public int getBlockMetadata(int var1, int var2, int var3) {
+ return 0;
+ }
+
+ public void setBlockMetadata(int var1, int var2, int var3, int var4) {
+ }
+
+ public int getSavedLightValue(EnumSkyBlock var1, int var2, int var3, int var4) {
+ return 0;
+ }
+
+ public void setLightValue(EnumSkyBlock var1, int var2, int var3, int var4, int var5) {
+ }
+
+ public int getBlockLightValue(int var1, int var2, int var3, int var4) {
+ return 0;
+ }
+
+ public void addEntity(Entity var1) {
+ }
+
+ public void removeEntity(Entity var1) {
+ }
+
+ public void removeEntityAtIndex(Entity var1, int var2) {
+ }
+
+ public boolean canBlockSeeTheSky(int var1, int var2, int var3) {
+ return false;
+ }
+
+ public TileEntity getChunkBlockTileEntity(int var1, int var2, int var3) {
+ return null;
+ }
+
+ public void addTileEntity(TileEntity var1) {
+ }
+
+ public void setChunkBlockTileEntity(int var1, int var2, int var3, TileEntity var4) {
+ }
+
+ public void removeChunkBlockTileEntity(int var1, int var2, int var3) {
+ }
+
+ public void onChunkLoad() {
+ }
+
+ public void onChunkUnload() {
+ }
+
+ public void setChunkModified() {
+ }
+
+ public void getEntitiesWithinAABBForEntity(Entity var1, AxisAlignedBB var2, List var3) {
+ }
+
+ public void getEntitiesOfTypeWithinAAAB(Class var1, AxisAlignedBB var2, List var3) {
+ }
+
+ public boolean needsSaving(boolean var1) {
+ return false;
+ }
+
+ public int getChunkData(byte[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) {
+ int var9 = var5 - var2;
+ int var10 = var6 - var3;
+ int var11 = var7 - var4;
+ int var12 = var9 * var10 * var11;
+ int var13 = var12 + var12 / 2 * 3;
+ Arrays.fill(var1, var8, var8 + var13, (byte)0);
+ return var13;
+ }
+
+ public Random func_334_a(long var1) {
+ return new Random(this.worldObj.getRandomSeed() + (long)(this.xPosition * this.xPosition * 4987142) + (long)(this.xPosition * 5947611) + (long)(this.zPosition * this.zPosition) * 4392871L + (long)(this.zPosition * 389711) ^ var1);
+ }
+
+ public boolean func_21101_g() {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/Entity.java b/src/net/minecraft/src/Entity.java
new file mode 100644
index 0000000..82bce4e
--- /dev/null
+++ b/src/net/minecraft/src/Entity.java
@@ -0,0 +1,1028 @@
+package net.minecraft.src;
+
+import java.util.List;
+import java.util.Random;
+
+public abstract class Entity {
+ private static int nextEntityID = 0;
+ public int entityId = nextEntityID++;
+ public double renderDistanceWeight = 1.0D;
+ public boolean preventEntitySpawning = false;
+ public Entity riddenByEntity;
+ public Entity ridingEntity;
+ public World worldObj;
+ public double prevPosX;
+ public double prevPosY;
+ public double prevPosZ;
+ public double posX;
+ public double posY;
+ public double posZ;
+ public double motionX;
+ public double motionY;
+ public double motionZ;
+ public float rotationYaw;
+ public float rotationPitch;
+ public float prevRotationYaw;
+ public float prevRotationPitch;
+ public final AxisAlignedBB boundingBox = AxisAlignedBB.getBoundingBox(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
+ public boolean onGround = false;
+ public boolean isCollidedHorizontally;
+ public boolean isCollidedVertically;
+ public boolean isCollided = false;
+ public boolean beenAttacked = false;
+ public boolean field_27012_bb;
+ public boolean field_9077_F = true;
+ public boolean isDead = false;
+ public float yOffset = 0.0F;
+ public float width = 0.6F;
+ public float height = 1.8F;
+ public float prevDistanceWalkedModified = 0.0F;
+ public float distanceWalkedModified = 0.0F;
+ protected float fallDistance = 0.0F;
+ private int nextStepDistance = 1;
+ public double lastTickPosX;
+ public double lastTickPosY;
+ public double lastTickPosZ;
+ public float ySize = 0.0F;
+ public float stepHeight = 0.0F;
+ public boolean noClip = false;
+ public float entityCollisionReduction = 0.0F;
+ protected Random rand = new Random();
+ public int ticksExisted = 0;
+ public int fireResistance = 1;
+ public int fire = 0;
+ protected int maxAir = 300;
+ protected boolean inWater = false;
+ public int field_9083_ac = 0;
+ public int air = 300;
+ private boolean firstUpdate = true;
+ protected boolean isImmuneToFire = false;
+ protected DataWatcher dataWatcher = new DataWatcher();
+ public float field_31001_bF = 0.0F;
+ private double entityRiderPitchDelta;
+ private double entityRiderYawDelta;
+ public boolean addedToChunk = false;
+ public int chunkCoordX;
+ public int chunkCoordY;
+ public int chunkCoordZ;
+ public boolean field_28008_bI;
+
+ public Entity(World var1) {
+ this.worldObj = var1;
+ this.setPosition(0.0D, 0.0D, 0.0D);
+ this.dataWatcher.addObject(0, Byte.valueOf((byte)0));
+ this.entityInit();
+ }
+
+ protected abstract void entityInit();
+
+ public DataWatcher getDataWatcher() {
+ return this.dataWatcher;
+ }
+
+ public boolean equals(Object var1) {
+ return var1 instanceof Entity ? ((Entity)var1).entityId == this.entityId : false;
+ }
+
+ public int hashCode() {
+ return this.entityId;
+ }
+
+ public void setEntityDead() {
+ this.isDead = true;
+ }
+
+ protected void setSize(float var1, float var2) {
+ this.width = var1;
+ this.height = var2;
+ }
+
+ protected void setRotation(float var1, float var2) {
+ this.rotationYaw = var1 % 360.0F;
+ this.rotationPitch = var2 % 360.0F;
+ }
+
+ public void setPosition(double var1, double var3, double var5) {
+ this.posX = var1;
+ this.posY = var3;
+ this.posZ = var5;
+ float var7 = this.width / 2.0F;
+ float var8 = this.height;
+ this.boundingBox.setBounds(var1 - (double)var7, var3 - (double)this.yOffset + (double)this.ySize, var5 - (double)var7, var1 + (double)var7, var3 - (double)this.yOffset + (double)this.ySize + (double)var8, var5 + (double)var7);
+ }
+
+ public void onUpdate() {
+ this.onEntityUpdate();
+ }
+
+ public void onEntityUpdate() {
+ if(this.ridingEntity != null && this.ridingEntity.isDead) {
+ this.ridingEntity = null;
+ }
+
+ ++this.ticksExisted;
+ this.prevDistanceWalkedModified = this.distanceWalkedModified;
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.prevRotationPitch = this.rotationPitch;
+ this.prevRotationYaw = this.rotationYaw;
+ if(this.handleWaterMovement()) {
+ if(!this.inWater && !this.firstUpdate) {
+ float var1 = MathHelper.sqrt_double(this.motionX * this.motionX * (double)0.2F + this.motionY * this.motionY + this.motionZ * this.motionZ * (double)0.2F) * 0.2F;
+ if(var1 > 1.0F) {
+ var1 = 1.0F;
+ }
+
+ this.worldObj.playSoundAtEntity(this, "random.splash", var1, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
+ float var2 = (float)MathHelper.floor_double(this.boundingBox.minY);
+
+ int var3;
+ float var4;
+ float var5;
+ for(var3 = 0; (float)var3 < 1.0F + this.width * 20.0F; ++var3) {
+ var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ var5 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle("bubble", this.posX + (double)var4, (double)(var2 + 1.0F), this.posZ + (double)var5, this.motionX, this.motionY - (double)(this.rand.nextFloat() * 0.2F), this.motionZ);
+ }
+
+ for(var3 = 0; (float)var3 < 1.0F + this.width * 20.0F; ++var3) {
+ var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ var5 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle("splash", this.posX + (double)var4, (double)(var2 + 1.0F), this.posZ + (double)var5, this.motionX, this.motionY, this.motionZ);
+ }
+ }
+
+ this.fallDistance = 0.0F;
+ this.inWater = true;
+ this.fire = 0;
+ } else {
+ this.inWater = false;
+ }
+
+ if(this.worldObj.singleplayerWorld) {
+ this.fire = 0;
+ } else if(this.fire > 0) {
+ if(this.isImmuneToFire) {
+ this.fire -= 4;
+ if(this.fire < 0) {
+ this.fire = 0;
+ }
+ } else {
+ if(this.fire % 20 == 0) {
+ this.attackEntityFrom((Entity)null, 1);
+ }
+
+ --this.fire;
+ }
+ }
+
+ if(this.handleLavaMovement()) {
+ this.setOnFireFromLava();
+ }
+
+ if(this.posY < -64.0D) {
+ this.kill();
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ this.setFlag(0, this.fire > 0);
+ this.setFlag(2, this.ridingEntity != null);
+ }
+
+ this.firstUpdate = false;
+ }
+
+ protected void setOnFireFromLava() {
+ if(!this.isImmuneToFire) {
+ this.attackEntityFrom((Entity)null, 4);
+ this.fire = 600;
+ }
+
+ }
+
+ protected void kill() {
+ this.setEntityDead();
+ }
+
+ public boolean isOffsetPositionInLiquid(double var1, double var3, double var5) {
+ AxisAlignedBB var7 = this.boundingBox.getOffsetBoundingBox(var1, var3, var5);
+ List var8 = this.worldObj.getCollidingBoundingBoxes(this, var7);
+ return var8.size() > 0 ? false : !this.worldObj.getIsAnyLiquid(var7);
+ }
+
+ public void moveEntity(double var1, double var3, double var5) {
+ if(this.noClip) {
+ this.boundingBox.offset(var1, var3, var5);
+ this.posX = (this.boundingBox.minX + this.boundingBox.maxX) / 2.0D;
+ this.posY = this.boundingBox.minY + (double)this.yOffset - (double)this.ySize;
+ this.posZ = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2.0D;
+ } else {
+ this.ySize *= 0.4F;
+ double var7 = this.posX;
+ double var9 = this.posZ;
+ if(this.field_27012_bb) {
+ this.field_27012_bb = false;
+ var1 *= 0.25D;
+ var3 *= (double)0.05F;
+ var5 *= 0.25D;
+ this.motionX = 0.0D;
+ this.motionY = 0.0D;
+ this.motionZ = 0.0D;
+ }
+
+ double var11 = var1;
+ double var13 = var3;
+ double var15 = var5;
+ AxisAlignedBB var17 = this.boundingBox.copy();
+ boolean var18 = this.onGround && this.isSneaking();
+ if(var18) {
+ double var19;
+ for(var19 = 0.05D; var1 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.getOffsetBoundingBox(var1, -1.0D, 0.0D)).size() == 0; var11 = var1) {
+ if(var1 < var19 && var1 >= -var19) {
+ var1 = 0.0D;
+ } else if(var1 > 0.0D) {
+ var1 -= var19;
+ } else {
+ var1 += var19;
+ }
+ }
+
+ for(; var5 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.getOffsetBoundingBox(0.0D, -1.0D, var5)).size() == 0; var15 = var5) {
+ if(var5 < var19 && var5 >= -var19) {
+ var5 = 0.0D;
+ } else if(var5 > 0.0D) {
+ var5 -= var19;
+ } else {
+ var5 += var19;
+ }
+ }
+ }
+
+ List var35 = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(var1, var3, var5));
+
+ for(int var20 = 0; var20 < var35.size(); ++var20) {
+ var3 = ((AxisAlignedBB)var35.get(var20)).calculateYOffset(this.boundingBox, var3);
+ }
+
+ this.boundingBox.offset(0.0D, var3, 0.0D);
+ if(!this.field_9077_F && var13 != var3) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ boolean var36 = this.onGround || var13 != var3 && var13 < 0.0D;
+
+ int var21;
+ for(var21 = 0; var21 < var35.size(); ++var21) {
+ var1 = ((AxisAlignedBB)var35.get(var21)).calculateXOffset(this.boundingBox, var1);
+ }
+
+ this.boundingBox.offset(var1, 0.0D, 0.0D);
+ if(!this.field_9077_F && var11 != var1) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ for(var21 = 0; var21 < var35.size(); ++var21) {
+ var5 = ((AxisAlignedBB)var35.get(var21)).calculateZOffset(this.boundingBox, var5);
+ }
+
+ this.boundingBox.offset(0.0D, 0.0D, var5);
+ if(!this.field_9077_F && var15 != var5) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ double var23;
+ int var28;
+ double var37;
+ if(this.stepHeight > 0.0F && var36 && (var18 || this.ySize < 0.05F) && (var11 != var1 || var15 != var5)) {
+ var37 = var1;
+ var23 = var3;
+ double var25 = var5;
+ var1 = var11;
+ var3 = (double)this.stepHeight;
+ var5 = var15;
+ AxisAlignedBB var27 = this.boundingBox.copy();
+ this.boundingBox.setBB(var17);
+ var35 = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(var11, var3, var15));
+
+ for(var28 = 0; var28 < var35.size(); ++var28) {
+ var3 = ((AxisAlignedBB)var35.get(var28)).calculateYOffset(this.boundingBox, var3);
+ }
+
+ this.boundingBox.offset(0.0D, var3, 0.0D);
+ if(!this.field_9077_F && var13 != var3) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ for(var28 = 0; var28 < var35.size(); ++var28) {
+ var1 = ((AxisAlignedBB)var35.get(var28)).calculateXOffset(this.boundingBox, var1);
+ }
+
+ this.boundingBox.offset(var1, 0.0D, 0.0D);
+ if(!this.field_9077_F && var11 != var1) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ for(var28 = 0; var28 < var35.size(); ++var28) {
+ var5 = ((AxisAlignedBB)var35.get(var28)).calculateZOffset(this.boundingBox, var5);
+ }
+
+ this.boundingBox.offset(0.0D, 0.0D, var5);
+ if(!this.field_9077_F && var15 != var5) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ if(!this.field_9077_F && var13 != var3) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ } else {
+ var3 = (double)(-this.stepHeight);
+
+ for(var28 = 0; var28 < var35.size(); ++var28) {
+ var3 = ((AxisAlignedBB)var35.get(var28)).calculateYOffset(this.boundingBox, var3);
+ }
+
+ this.boundingBox.offset(0.0D, var3, 0.0D);
+ }
+
+ if(var37 * var37 + var25 * var25 >= var1 * var1 + var5 * var5) {
+ var1 = var37;
+ var3 = var23;
+ var5 = var25;
+ this.boundingBox.setBB(var27);
+ } else {
+ double var41 = this.boundingBox.minY - (double)((int)this.boundingBox.minY);
+ if(var41 > 0.0D) {
+ this.ySize = (float)((double)this.ySize + var41 + 0.01D);
+ }
+ }
+ }
+
+ this.posX = (this.boundingBox.minX + this.boundingBox.maxX) / 2.0D;
+ this.posY = this.boundingBox.minY + (double)this.yOffset - (double)this.ySize;
+ this.posZ = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2.0D;
+ this.isCollidedHorizontally = var11 != var1 || var15 != var5;
+ this.isCollidedVertically = var13 != var3;
+ this.onGround = var13 != var3 && var13 < 0.0D;
+ this.isCollided = this.isCollidedHorizontally || this.isCollidedVertically;
+ this.updateFallState(var3, this.onGround);
+ if(var11 != var1) {
+ this.motionX = 0.0D;
+ }
+
+ if(var13 != var3) {
+ this.motionY = 0.0D;
+ }
+
+ if(var15 != var5) {
+ this.motionZ = 0.0D;
+ }
+
+ var37 = this.posX - var7;
+ var23 = this.posZ - var9;
+ int var26;
+ int var38;
+ int var39;
+ if(this.func_25017_l() && !var18 && this.ridingEntity == null) {
+ this.distanceWalkedModified = (float)((double)this.distanceWalkedModified + (double)MathHelper.sqrt_double(var37 * var37 + var23 * var23) * 0.6D);
+ var38 = MathHelper.floor_double(this.posX);
+ var26 = MathHelper.floor_double(this.posY - (double)0.2F - (double)this.yOffset);
+ var39 = MathHelper.floor_double(this.posZ);
+ var28 = this.worldObj.getBlockId(var38, var26, var39);
+ if(this.worldObj.getBlockId(var38, var26 - 1, var39) == Block.fence.blockID) {
+ var28 = this.worldObj.getBlockId(var38, var26 - 1, var39);
+ }
+
+ if(this.distanceWalkedModified > (float)this.nextStepDistance && var28 > 0) {
+ ++this.nextStepDistance;
+ StepSound var29 = Block.blocksList[var28].stepSound;
+ if(this.worldObj.getBlockId(var38, var26 + 1, var39) == Block.snow.blockID) {
+ var29 = Block.snow.stepSound;
+ this.worldObj.playSoundAtEntity(this, var29.func_737_c(), var29.getVolume() * 0.15F, var29.getPitch());
+ } else if(!Block.blocksList[var28].blockMaterial.getIsLiquid()) {
+ this.worldObj.playSoundAtEntity(this, var29.func_737_c(), var29.getVolume() * 0.15F, var29.getPitch());
+ }
+
+ Block.blocksList[var28].onEntityWalking(this.worldObj, var38, var26, var39, this);
+ }
+ }
+
+ var38 = MathHelper.floor_double(this.boundingBox.minX + 0.001D);
+ var26 = MathHelper.floor_double(this.boundingBox.minY + 0.001D);
+ var39 = MathHelper.floor_double(this.boundingBox.minZ + 0.001D);
+ var28 = MathHelper.floor_double(this.boundingBox.maxX - 0.001D);
+ int var40 = MathHelper.floor_double(this.boundingBox.maxY - 0.001D);
+ int var30 = MathHelper.floor_double(this.boundingBox.maxZ - 0.001D);
+ if(this.worldObj.checkChunksExist(var38, var26, var39, var28, var40, var30)) {
+ for(int var31 = var38; var31 <= var28; ++var31) {
+ for(int var32 = var26; var32 <= var40; ++var32) {
+ for(int var33 = var39; var33 <= var30; ++var33) {
+ int var34 = this.worldObj.getBlockId(var31, var32, var33);
+ if(var34 > 0) {
+ Block.blocksList[var34].onEntityCollidedWithBlock(this.worldObj, var31, var32, var33, this);
+ }
+ }
+ }
+ }
+ }
+
+ boolean var42 = this.func_27008_Y();
+ if(this.worldObj.isBoundingBoxBurning(this.boundingBox.getInsetBoundingBox(0.001D, 0.001D, 0.001D))) {
+ this.dealFireDamage(1);
+ if(!var42) {
+ ++this.fire;
+ if(this.fire == 0) {
+ this.fire = 300;
+ }
+ }
+ } else if(this.fire <= 0) {
+ this.fire = -this.fireResistance;
+ }
+
+ if(var42 && this.fire > 0) {
+ this.worldObj.playSoundAtEntity(this, "random.fizz", 0.7F, 1.6F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
+ this.fire = -this.fireResistance;
+ }
+
+ }
+ }
+
+ protected boolean func_25017_l() {
+ return true;
+ }
+
+ protected void updateFallState(double var1, boolean var3) {
+ if(var3) {
+ if(this.fallDistance > 0.0F) {
+ this.fall(this.fallDistance);
+ this.fallDistance = 0.0F;
+ }
+ } else if(var1 < 0.0D) {
+ this.fallDistance = (float)((double)this.fallDistance - var1);
+ }
+
+ }
+
+ public AxisAlignedBB getBoundingBox() {
+ return null;
+ }
+
+ protected void dealFireDamage(int var1) {
+ if(!this.isImmuneToFire) {
+ this.attackEntityFrom((Entity)null, var1);
+ }
+
+ }
+
+ protected void fall(float var1) {
+ if(this.riddenByEntity != null) {
+ this.riddenByEntity.fall(var1);
+ }
+
+ }
+
+ public boolean func_27008_Y() {
+ return this.inWater || this.worldObj.canLightningStrikeAt(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ));
+ }
+
+ public boolean isInWater() {
+ return this.inWater;
+ }
+
+ public boolean handleWaterMovement() {
+ return this.worldObj.handleMaterialAcceleration(this.boundingBox.expand(0.0D, (double)-0.4F, 0.0D).getInsetBoundingBox(0.001D, 0.001D, 0.001D), Material.water, this);
+ }
+
+ public boolean isInsideOfMaterial(Material var1) {
+ double var2 = this.posY + (double)this.getEyeHeight();
+ int var4 = MathHelper.floor_double(this.posX);
+ int var5 = MathHelper.floor_float((float)MathHelper.floor_double(var2));
+ int var6 = MathHelper.floor_double(this.posZ);
+ int var7 = this.worldObj.getBlockId(var4, var5, var6);
+ if(var7 != 0 && Block.blocksList[var7].blockMaterial == var1) {
+ float var8 = BlockFluid.setFluidHeight(this.worldObj.getBlockMetadata(var4, var5, var6)) - 1.0F / 9.0F;
+ float var9 = (float)(var5 + 1) - var8;
+ return var2 < (double)var9;
+ } else {
+ return false;
+ }
+ }
+
+ public float getEyeHeight() {
+ return 0.0F;
+ }
+
+ public boolean handleLavaMovement() {
+ return this.worldObj.isMaterialInBB(this.boundingBox.expand((double)-0.1F, (double)-0.4F, (double)-0.1F), Material.lava);
+ }
+
+ public void moveFlying(float var1, float var2, float var3) {
+ float var4 = MathHelper.sqrt_float(var1 * var1 + var2 * var2);
+ if(var4 >= 0.01F) {
+ if(var4 < 1.0F) {
+ var4 = 1.0F;
+ }
+
+ var4 = var3 / var4;
+ var1 *= var4;
+ var2 *= var4;
+ float var5 = MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F);
+ float var6 = MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F);
+ this.motionX += (double)(var1 * var6 - var2 * var5);
+ this.motionZ += (double)(var2 * var6 + var1 * var5);
+ }
+ }
+
+ public float getEntityBrightness(float var1) {
+ int var2 = MathHelper.floor_double(this.posX);
+ double var3 = (this.boundingBox.maxY - this.boundingBox.minY) * 0.66D;
+ int var5 = MathHelper.floor_double(this.posY - (double)this.yOffset + var3);
+ int var6 = MathHelper.floor_double(this.posZ);
+ if(this.worldObj.checkChunksExist(MathHelper.floor_double(this.boundingBox.minX), MathHelper.floor_double(this.boundingBox.minY), MathHelper.floor_double(this.boundingBox.minZ), MathHelper.floor_double(this.boundingBox.maxX), MathHelper.floor_double(this.boundingBox.maxY), MathHelper.floor_double(this.boundingBox.maxZ))) {
+ float var7 = this.worldObj.getLightBrightness(var2, var5, var6);
+ if(var7 < this.field_31001_bF) {
+ var7 = this.field_31001_bF;
+ }
+
+ return var7;
+ } else {
+ return this.field_31001_bF;
+ }
+ }
+
+ public void setWorldHandler(World var1) {
+ this.worldObj = var1;
+ }
+
+ public void setPositionAndRotation(double var1, double var3, double var5, float var7, float var8) {
+ this.prevPosX = this.posX = var1;
+ this.prevPosY = this.posY = var3;
+ this.prevPosZ = this.posZ = var5;
+ this.prevRotationYaw = this.rotationYaw = var7;
+ this.prevRotationPitch = this.rotationPitch = var8;
+ this.ySize = 0.0F;
+ double var9 = (double)(this.prevRotationYaw - var7);
+ if(var9 < -180.0D) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ if(var9 >= 180.0D) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.setRotation(var7, var8);
+ }
+
+ public void setLocationAndAngles(double var1, double var3, double var5, float var7, float var8) {
+ this.lastTickPosX = this.prevPosX = this.posX = var1;
+ this.lastTickPosY = this.prevPosY = this.posY = var3 + (double)this.yOffset;
+ this.lastTickPosZ = this.prevPosZ = this.posZ = var5;
+ this.rotationYaw = var7;
+ this.rotationPitch = var8;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public float getDistanceToEntity(Entity var1) {
+ float var2 = (float)(this.posX - var1.posX);
+ float var3 = (float)(this.posY - var1.posY);
+ float var4 = (float)(this.posZ - var1.posZ);
+ return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4);
+ }
+
+ public double getDistanceSq(double var1, double var3, double var5) {
+ double var7 = this.posX - var1;
+ double var9 = this.posY - var3;
+ double var11 = this.posZ - var5;
+ return var7 * var7 + var9 * var9 + var11 * var11;
+ }
+
+ public double getDistance(double var1, double var3, double var5) {
+ double var7 = this.posX - var1;
+ double var9 = this.posY - var3;
+ double var11 = this.posZ - var5;
+ return (double)MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11);
+ }
+
+ public double getDistanceSqToEntity(Entity var1) {
+ double var2 = this.posX - var1.posX;
+ double var4 = this.posY - var1.posY;
+ double var6 = this.posZ - var1.posZ;
+ return var2 * var2 + var4 * var4 + var6 * var6;
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ }
+
+ public void applyEntityCollision(Entity var1) {
+ if(var1.riddenByEntity != this && var1.ridingEntity != this) {
+ double var2 = var1.posX - this.posX;
+ double var4 = var1.posZ - this.posZ;
+ double var6 = MathHelper.abs_max(var2, var4);
+ if(var6 >= (double)0.01F) {
+ var6 = (double)MathHelper.sqrt_double(var6);
+ var2 /= var6;
+ var4 /= var6;
+ double var8 = 1.0D / var6;
+ if(var8 > 1.0D) {
+ var8 = 1.0D;
+ }
+
+ var2 *= var8;
+ var4 *= var8;
+ var2 *= (double)0.05F;
+ var4 *= (double)0.05F;
+ var2 *= (double)(1.0F - this.entityCollisionReduction);
+ var4 *= (double)(1.0F - this.entityCollisionReduction);
+ this.addVelocity(-var2, 0.0D, -var4);
+ var1.addVelocity(var2, 0.0D, var4);
+ }
+
+ }
+ }
+
+ public void addVelocity(double var1, double var3, double var5) {
+ this.motionX += var1;
+ this.motionY += var3;
+ this.motionZ += var5;
+ }
+
+ protected void setBeenAttacked() {
+ this.beenAttacked = true;
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ this.setBeenAttacked();
+ return false;
+ }
+
+ public boolean canBeCollidedWith() {
+ return false;
+ }
+
+ public boolean canBePushed() {
+ return false;
+ }
+
+ public void addToPlayerScore(Entity var1, int var2) {
+ }
+
+ public boolean addEntityID(NBTTagCompound var1) {
+ String var2 = this.getEntityString();
+ if(!this.isDead && var2 != null) {
+ var1.setString("id", var2);
+ this.writeToNBT(var1);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ var1.setTag("Pos", this.newDoubleNBTList(new double[]{this.posX, this.posY + (double)this.ySize, this.posZ}));
+ var1.setTag("Motion", this.newDoubleNBTList(new double[]{this.motionX, this.motionY, this.motionZ}));
+ var1.setTag("Rotation", this.newFloatNBTList(new float[]{this.rotationYaw, this.rotationPitch}));
+ var1.setFloat("FallDistance", this.fallDistance);
+ var1.setShort("Fire", (short)this.fire);
+ var1.setShort("Air", (short)this.air);
+ var1.setBoolean("OnGround", this.onGround);
+ this.writeEntityToNBT(var1);
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ NBTTagList var2 = var1.getTagList("Pos");
+ NBTTagList var3 = var1.getTagList("Motion");
+ NBTTagList var4 = var1.getTagList("Rotation");
+ this.motionX = ((NBTTagDouble)var3.tagAt(0)).doubleValue;
+ this.motionY = ((NBTTagDouble)var3.tagAt(1)).doubleValue;
+ this.motionZ = ((NBTTagDouble)var3.tagAt(2)).doubleValue;
+ if(Math.abs(this.motionX) > 10.0D) {
+ this.motionX = 0.0D;
+ }
+
+ if(Math.abs(this.motionY) > 10.0D) {
+ this.motionY = 0.0D;
+ }
+
+ if(Math.abs(this.motionZ) > 10.0D) {
+ this.motionZ = 0.0D;
+ }
+
+ this.prevPosX = this.lastTickPosX = this.posX = ((NBTTagDouble)var2.tagAt(0)).doubleValue;
+ this.prevPosY = this.lastTickPosY = this.posY = ((NBTTagDouble)var2.tagAt(1)).doubleValue;
+ this.prevPosZ = this.lastTickPosZ = this.posZ = ((NBTTagDouble)var2.tagAt(2)).doubleValue;
+ this.prevRotationYaw = this.rotationYaw = ((NBTTagFloat)var4.tagAt(0)).floatValue;
+ this.prevRotationPitch = this.rotationPitch = ((NBTTagFloat)var4.tagAt(1)).floatValue;
+ this.fallDistance = var1.getFloat("FallDistance");
+ this.fire = var1.getShort("Fire");
+ this.air = var1.getShort("Air");
+ this.onGround = var1.getBoolean("OnGround");
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ this.readEntityFromNBT(var1);
+ }
+
+ protected final String getEntityString() {
+ return EntityList.getEntityString(this);
+ }
+
+ protected abstract void readEntityFromNBT(NBTTagCompound var1);
+
+ protected abstract void writeEntityToNBT(NBTTagCompound var1);
+
+ protected NBTTagList newDoubleNBTList(double... var1) {
+ NBTTagList var2 = new NBTTagList();
+ double[] var3 = var1;
+ int var4 = var1.length;
+
+ for(int var5 = 0; var5 < var4; ++var5) {
+ double var6 = var3[var5];
+ var2.setTag(new NBTTagDouble(var6));
+ }
+
+ return var2;
+ }
+
+ protected NBTTagList newFloatNBTList(float... var1) {
+ NBTTagList var2 = new NBTTagList();
+ float[] var3 = var1;
+ int var4 = var1.length;
+
+ for(int var5 = 0; var5 < var4; ++var5) {
+ float var6 = var3[var5];
+ var2.setTag(new NBTTagFloat(var6));
+ }
+
+ return var2;
+ }
+
+ public EntityItem dropItem(int var1, int var2) {
+ return this.dropItemWithOffset(var1, var2, 0.0F);
+ }
+
+ public EntityItem dropItemWithOffset(int var1, int var2, float var3) {
+ return this.entityDropItem(new ItemStack(var1, var2, 0), var3);
+ }
+
+ public EntityItem entityDropItem(ItemStack var1, float var2) {
+ EntityItem var3 = new EntityItem(this.worldObj, this.posX, this.posY + (double)var2, this.posZ, var1);
+ var3.delayBeforeCanPickup = 10;
+ this.worldObj.entityJoinedWorld(var3);
+ return var3;
+ }
+
+ public boolean isEntityAlive() {
+ return !this.isDead;
+ }
+
+ public boolean isEntityInsideOpaqueBlock() {
+ for(int var1 = 0; var1 < 8; ++var1) {
+ float var2 = ((float)((var1 >> 0) % 2) - 0.5F) * this.width * 0.9F;
+ float var3 = ((float)((var1 >> 1) % 2) - 0.5F) * 0.1F;
+ float var4 = ((float)((var1 >> 2) % 2) - 0.5F) * this.width * 0.9F;
+ int var5 = MathHelper.floor_double(this.posX + (double)var2);
+ int var6 = MathHelper.floor_double(this.posY + (double)this.getEyeHeight() + (double)var3);
+ int var7 = MathHelper.floor_double(this.posZ + (double)var4);
+ if(this.worldObj.isBlockNormalCube(var5, var6, var7)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ return false;
+ }
+
+ public AxisAlignedBB func_89_d(Entity var1) {
+ return null;
+ }
+
+ public void updateRidden() {
+ if(this.ridingEntity.isDead) {
+ this.ridingEntity = null;
+ } else {
+ this.motionX = 0.0D;
+ this.motionY = 0.0D;
+ this.motionZ = 0.0D;
+ this.onUpdate();
+ if(this.ridingEntity != null) {
+ this.ridingEntity.updateRiderPosition();
+ this.entityRiderYawDelta += (double)(this.ridingEntity.rotationYaw - this.ridingEntity.prevRotationYaw);
+
+ for(this.entityRiderPitchDelta += (double)(this.ridingEntity.rotationPitch - this.ridingEntity.prevRotationPitch); this.entityRiderYawDelta >= 180.0D; this.entityRiderYawDelta -= 360.0D) {
+ }
+
+ while(this.entityRiderYawDelta < -180.0D) {
+ this.entityRiderYawDelta += 360.0D;
+ }
+
+ while(this.entityRiderPitchDelta >= 180.0D) {
+ this.entityRiderPitchDelta -= 360.0D;
+ }
+
+ while(this.entityRiderPitchDelta < -180.0D) {
+ this.entityRiderPitchDelta += 360.0D;
+ }
+
+ double var1 = this.entityRiderYawDelta * 0.5D;
+ double var3 = this.entityRiderPitchDelta * 0.5D;
+ float var5 = 10.0F;
+ if(var1 > (double)var5) {
+ var1 = (double)var5;
+ }
+
+ if(var1 < (double)(-var5)) {
+ var1 = (double)(-var5);
+ }
+
+ if(var3 > (double)var5) {
+ var3 = (double)var5;
+ }
+
+ if(var3 < (double)(-var5)) {
+ var3 = (double)(-var5);
+ }
+
+ this.entityRiderYawDelta -= var1;
+ this.entityRiderPitchDelta -= var3;
+ this.rotationYaw = (float)((double)this.rotationYaw + var1);
+ this.rotationPitch = (float)((double)this.rotationPitch + var3);
+ }
+ }
+ }
+
+ public void updateRiderPosition() {
+ this.riddenByEntity.setPosition(this.posX, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ);
+ }
+
+ public double getYOffset() {
+ return (double)this.yOffset;
+ }
+
+ public double getMountedYOffset() {
+ return (double)this.height * 0.75D;
+ }
+
+ public void mountEntity(Entity var1) {
+ this.entityRiderPitchDelta = 0.0D;
+ this.entityRiderYawDelta = 0.0D;
+ if(var1 == null) {
+ if(this.ridingEntity != null) {
+ this.setLocationAndAngles(this.ridingEntity.posX, this.ridingEntity.boundingBox.minY + (double)this.ridingEntity.height, this.ridingEntity.posZ, this.rotationYaw, this.rotationPitch);
+ this.ridingEntity.riddenByEntity = null;
+ }
+
+ this.ridingEntity = null;
+ } else if(this.ridingEntity == var1) {
+ this.ridingEntity.riddenByEntity = null;
+ this.ridingEntity = null;
+ this.setLocationAndAngles(var1.posX, var1.boundingBox.minY + (double)var1.height, var1.posZ, this.rotationYaw, this.rotationPitch);
+ } else {
+ if(this.ridingEntity != null) {
+ this.ridingEntity.riddenByEntity = null;
+ }
+
+ if(var1.riddenByEntity != null) {
+ var1.riddenByEntity.ridingEntity = null;
+ }
+
+ this.ridingEntity = var1;
+ var1.riddenByEntity = this;
+ }
+ }
+
+ public Vec3D getLookVec() {
+ return null;
+ }
+
+ public void setInPortal() {
+ }
+
+ public ItemStack[] getInventory() {
+ return null;
+ }
+
+ public boolean isSneaking() {
+ return this.getFlag(1);
+ }
+
+ public void setSneaking(boolean var1) {
+ this.setFlag(1, var1);
+ }
+
+ protected boolean getFlag(int var1) {
+ return (this.dataWatcher.getWatchableObjectByte(0) & 1 << var1) != 0;
+ }
+
+ protected void setFlag(int var1, boolean var2) {
+ byte var3 = this.dataWatcher.getWatchableObjectByte(0);
+ if(var2) {
+ this.dataWatcher.updateObject(0, Byte.valueOf((byte)(var3 | 1 << var1)));
+ } else {
+ this.dataWatcher.updateObject(0, Byte.valueOf((byte)(var3 & ~(1 << var1))));
+ }
+
+ }
+
+ public void onStruckByLightning(EntityLightningBolt var1) {
+ this.dealFireDamage(5);
+ ++this.fire;
+ if(this.fire == 0) {
+ this.fire = 300;
+ }
+
+ }
+
+ public void func_27010_a(EntityLiving var1) {
+ }
+
+ protected boolean func_28005_g(double var1, double var3, double var5) {
+ int var7 = MathHelper.floor_double(var1);
+ int var8 = MathHelper.floor_double(var3);
+ int var9 = MathHelper.floor_double(var5);
+ double var10 = var1 - (double)var7;
+ double var12 = var3 - (double)var8;
+ double var14 = var5 - (double)var9;
+ if(this.worldObj.isBlockNormalCube(var7, var8, var9)) {
+ boolean var16 = !this.worldObj.isBlockNormalCube(var7 - 1, var8, var9);
+ boolean var17 = !this.worldObj.isBlockNormalCube(var7 + 1, var8, var9);
+ boolean var18 = !this.worldObj.isBlockNormalCube(var7, var8 - 1, var9);
+ boolean var19 = !this.worldObj.isBlockNormalCube(var7, var8 + 1, var9);
+ boolean var20 = !this.worldObj.isBlockNormalCube(var7, var8, var9 - 1);
+ boolean var21 = !this.worldObj.isBlockNormalCube(var7, var8, var9 + 1);
+ byte var22 = -1;
+ double var23 = 9999.0D;
+ if(var16 && var10 < var23) {
+ var23 = var10;
+ var22 = 0;
+ }
+
+ if(var17 && 1.0D - var10 < var23) {
+ var23 = 1.0D - var10;
+ var22 = 1;
+ }
+
+ if(var18 && var12 < var23) {
+ var23 = var12;
+ var22 = 2;
+ }
+
+ if(var19 && 1.0D - var12 < var23) {
+ var23 = 1.0D - var12;
+ var22 = 3;
+ }
+
+ if(var20 && var14 < var23) {
+ var23 = var14;
+ var22 = 4;
+ }
+
+ if(var21 && 1.0D - var14 < var23) {
+ var23 = 1.0D - var14;
+ var22 = 5;
+ }
+
+ float var25 = this.rand.nextFloat() * 0.2F + 0.1F;
+ if(var22 == 0) {
+ this.motionX = (double)(-var25);
+ }
+
+ if(var22 == 1) {
+ this.motionX = (double)var25;
+ }
+
+ if(var22 == 2) {
+ this.motionY = (double)(-var25);
+ }
+
+ if(var22 == 3) {
+ this.motionY = (double)var25;
+ }
+
+ if(var22 == 4) {
+ this.motionZ = (double)(-var25);
+ }
+
+ if(var22 == 5) {
+ this.motionZ = (double)var25;
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/EntityAnimal.java b/src/net/minecraft/src/EntityAnimal.java
new file mode 100644
index 0000000..640d4ee
--- /dev/null
+++ b/src/net/minecraft/src/EntityAnimal.java
@@ -0,0 +1,30 @@
+package net.minecraft.src;
+
+public abstract class EntityAnimal extends EntityCreature implements IAnimals {
+ public EntityAnimal(World var1) {
+ super(var1);
+ }
+
+ protected float getBlockPathWeight(int var1, int var2, int var3) {
+ return this.worldObj.getBlockId(var1, var2 - 1, var3) == Block.grass.blockID ? 10.0F : this.worldObj.getLightBrightness(var1, var2, var3) - 0.5F;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ public boolean getCanSpawnHere() {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.boundingBox.minY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ return this.worldObj.getBlockId(var1, var2 - 1, var3) == Block.grass.blockID && this.worldObj.getBlockLightValueNoChecks(var1, var2, var3) > 8 && super.getCanSpawnHere();
+ }
+
+ public int getTalkInterval() {
+ return 120;
+ }
+}
diff --git a/src/net/minecraft/src/EntityArrow.java b/src/net/minecraft/src/EntityArrow.java
new file mode 100644
index 0000000..3cb274e
--- /dev/null
+++ b/src/net/minecraft/src/EntityArrow.java
@@ -0,0 +1,251 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityArrow extends Entity {
+ private int xTile = -1;
+ private int yTile = -1;
+ private int zTile = -1;
+ private int inTile = 0;
+ private int field_28011_h = 0;
+ private boolean inGround = false;
+ public boolean field_28012_a = false;
+ public int arrowShake = 0;
+ public EntityLiving owner;
+ private int ticksInGround;
+ private int ticksInAir = 0;
+
+ public EntityArrow(World var1) {
+ super(var1);
+ this.setSize(0.5F, 0.5F);
+ }
+
+ public EntityArrow(World var1, double var2, double var4, double var6) {
+ super(var1);
+ this.setSize(0.5F, 0.5F);
+ this.setPosition(var2, var4, var6);
+ this.yOffset = 0.0F;
+ }
+
+ public EntityArrow(World var1, EntityLiving var2) {
+ super(var1);
+ this.owner = var2;
+ this.field_28012_a = var2 instanceof EntityPlayer;
+ this.setSize(0.5F, 0.5F);
+ this.setLocationAndAngles(var2.posX, var2.posY + (double)var2.getEyeHeight(), var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.posY -= (double)0.1F;
+ this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.yOffset = 0.0F;
+ this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
+ this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
+ this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI));
+ this.setArrowHeading(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F);
+ }
+
+ protected void entityInit() {
+ }
+
+ public void setArrowHeading(double var1, double var3, double var5, float var7, float var8) {
+ float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);
+ var1 /= (double)var9;
+ var3 /= (double)var9;
+ var5 /= (double)var9;
+ var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var1 *= (double)var7;
+ var3 *= (double)var7;
+ var5 *= (double)var7;
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI));
+ this.ticksInGround = 0;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) {
+ float var1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var1) * 180.0D / (double)((float)Math.PI));
+ }
+
+ int var15 = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
+ if(var15 > 0) {
+ Block.blocksList[var15].setBlockBoundsBasedOnState(this.worldObj, this.xTile, this.yTile, this.zTile);
+ AxisAlignedBB var2 = Block.blocksList[var15].getCollisionBoundingBoxFromPool(this.worldObj, this.xTile, this.yTile, this.zTile);
+ if(var2 != null && var2.isVecInXYZ(Vec3D.createVector(this.posX, this.posY, this.posZ))) {
+ this.inGround = true;
+ }
+ }
+
+ if(this.arrowShake > 0) {
+ --this.arrowShake;
+ }
+
+ if(this.inGround) {
+ var15 = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
+ int var18 = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile);
+ if(var15 == this.inTile && var18 == this.field_28011_h) {
+ ++this.ticksInGround;
+ if(this.ticksInGround == 1200) {
+ this.setEntityDead();
+ }
+
+ } else {
+ this.inGround = false;
+ this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
+ this.ticksInGround = 0;
+ this.ticksInAir = 0;
+ }
+ } else {
+ ++this.ticksInAir;
+ Vec3D var16 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ Vec3D var17 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition var3 = this.worldObj.func_28099_a(var16, var17, false, true);
+ var16 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ var17 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if(var3 != null) {
+ var17 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord);
+ }
+
+ Entity var4 = null;
+ List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D));
+ double var6 = 0.0D;
+
+ float var10;
+ for(int var8 = 0; var8 < var5.size(); ++var8) {
+ Entity var9 = (Entity)var5.get(var8);
+ if(var9.canBeCollidedWith() && (var9 != this.owner || this.ticksInAir >= 5)) {
+ var10 = 0.3F;
+ AxisAlignedBB var11 = var9.boundingBox.expand((double)var10, (double)var10, (double)var10);
+ MovingObjectPosition var12 = var11.func_706_a(var16, var17);
+ if(var12 != null) {
+ double var13 = var16.distanceTo(var12.hitVec);
+ if(var13 < var6 || var6 == 0.0D) {
+ var4 = var9;
+ var6 = var13;
+ }
+ }
+ }
+ }
+
+ if(var4 != null) {
+ var3 = new MovingObjectPosition(var4);
+ }
+
+ float var19;
+ if(var3 != null) {
+ if(var3.entityHit != null) {
+ if(var3.entityHit.attackEntityFrom(this.owner, 4)) {
+ this.worldObj.playSoundAtEntity(this, "random.drr", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
+ this.setEntityDead();
+ } else {
+ this.motionX *= (double)-0.1F;
+ this.motionY *= (double)-0.1F;
+ this.motionZ *= (double)-0.1F;
+ this.rotationYaw += 180.0F;
+ this.prevRotationYaw += 180.0F;
+ this.ticksInAir = 0;
+ }
+ } else {
+ this.xTile = var3.blockX;
+ this.yTile = var3.blockY;
+ this.zTile = var3.blockZ;
+ this.inTile = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
+ this.field_28011_h = this.worldObj.getBlockMetadata(this.xTile, this.yTile, this.zTile);
+ this.motionX = (double)((float)(var3.hitVec.xCoord - this.posX));
+ this.motionY = (double)((float)(var3.hitVec.yCoord - this.posY));
+ this.motionZ = (double)((float)(var3.hitVec.zCoord - this.posZ));
+ var19 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ);
+ this.posX -= this.motionX / (double)var19 * (double)0.05F;
+ this.posY -= this.motionY / (double)var19 * (double)0.05F;
+ this.posZ -= this.motionZ / (double)var19 * (double)0.05F;
+ this.worldObj.playSoundAtEntity(this, "random.drr", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
+ this.inGround = true;
+ this.arrowShake = 7;
+ }
+ }
+
+ this.posX += this.motionX;
+ this.posY += this.motionY;
+ this.posZ += this.motionZ;
+ var19 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+
+ for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var19) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float var20 = 0.99F;
+ var10 = 0.03F;
+ if(this.isInWater()) {
+ for(int var21 = 0; var21 < 4; ++var21) {
+ float var22 = 0.25F;
+ this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var22, this.posY - this.motionY * (double)var22, this.posZ - this.motionZ * (double)var22, this.motionX, this.motionY, this.motionZ);
+ }
+
+ var20 = 0.8F;
+ }
+
+ this.motionX *= (double)var20;
+ this.motionY *= (double)var20;
+ this.motionZ *= (double)var20;
+ this.motionY -= (double)var10;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("xTile", (short)this.xTile);
+ var1.setShort("yTile", (short)this.yTile);
+ var1.setShort("zTile", (short)this.zTile);
+ var1.setByte("inTile", (byte)this.inTile);
+ var1.setByte("inData", (byte)this.field_28011_h);
+ var1.setByte("shake", (byte)this.arrowShake);
+ var1.setByte("inGround", (byte)(this.inGround ? 1 : 0));
+ var1.setBoolean("player", this.field_28012_a);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.xTile = var1.getShort("xTile");
+ this.yTile = var1.getShort("yTile");
+ this.zTile = var1.getShort("zTile");
+ this.inTile = var1.getByte("inTile") & 255;
+ this.field_28011_h = var1.getByte("inData") & 255;
+ this.arrowShake = var1.getByte("shake") & 255;
+ this.inGround = var1.getByte("inGround") == 1;
+ this.field_28012_a = var1.getBoolean("player");
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ if(!this.worldObj.singleplayerWorld) {
+ if(this.inGround && this.field_28012_a && this.arrowShake <= 0 && var1.inventory.addItemStackToInventory(new ItemStack(Item.arrow, 1))) {
+ this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
+ var1.onItemPickup(this, 1);
+ this.setEntityDead();
+ }
+
+ }
+ }
+}
diff --git a/src/net/minecraft/src/EntityBoat.java b/src/net/minecraft/src/EntityBoat.java
new file mode 100644
index 0000000..0ac9eaa
--- /dev/null
+++ b/src/net/minecraft/src/EntityBoat.java
@@ -0,0 +1,316 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityBoat extends Entity {
+ public int damageTaken;
+ public int field_9177_b;
+ public int forwardDirection;
+ private int field_9176_d;
+ private double field_9174_e;
+ private double field_9172_f;
+ private double field_9175_aj;
+ private double field_9173_ak;
+ private double field_9171_al;
+
+ public EntityBoat(World var1) {
+ super(var1);
+ this.damageTaken = 0;
+ this.field_9177_b = 0;
+ this.forwardDirection = 1;
+ this.preventEntitySpawning = true;
+ this.setSize(1.5F, 0.6F);
+ this.yOffset = this.height / 2.0F;
+ }
+
+ protected boolean func_25017_l() {
+ return false;
+ }
+
+ protected void entityInit() {
+ }
+
+ public AxisAlignedBB func_89_d(Entity var1) {
+ return var1.boundingBox;
+ }
+
+ public AxisAlignedBB getBoundingBox() {
+ return this.boundingBox;
+ }
+
+ public boolean canBePushed() {
+ return true;
+ }
+
+ public EntityBoat(World var1, double var2, double var4, double var6) {
+ this(var1);
+ this.setPosition(var2, var4 + (double)this.yOffset, var6);
+ this.motionX = 0.0D;
+ this.motionY = 0.0D;
+ this.motionZ = 0.0D;
+ this.prevPosX = var2;
+ this.prevPosY = var4;
+ this.prevPosZ = var6;
+ }
+
+ public double getMountedYOffset() {
+ return (double)this.height * 0.0D - (double)0.3F;
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ if(!this.worldObj.singleplayerWorld && !this.isDead) {
+ this.forwardDirection = -this.forwardDirection;
+ this.field_9177_b = 10;
+ this.damageTaken += var2 * 10;
+ this.setBeenAttacked();
+ if(this.damageTaken > 40) {
+ if(this.riddenByEntity != null) {
+ this.riddenByEntity.mountEntity(this);
+ }
+
+ int var3;
+ for(var3 = 0; var3 < 3; ++var3) {
+ this.dropItemWithOffset(Block.planks.blockID, 1, 0.0F);
+ }
+
+ for(var3 = 0; var3 < 2; ++var3) {
+ this.dropItemWithOffset(Item.stick.shiftedIndex, 1, 0.0F);
+ }
+
+ this.setEntityDead();
+ }
+
+ return true;
+ } else {
+ return true;
+ }
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.field_9177_b > 0) {
+ --this.field_9177_b;
+ }
+
+ if(this.damageTaken > 0) {
+ --this.damageTaken;
+ }
+
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ byte var1 = 5;
+ double var2 = 0.0D;
+
+ for(int var4 = 0; var4 < var1; ++var4) {
+ double var5 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var4 + 0) / (double)var1 - 0.125D;
+ double var7 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var4 + 1) / (double)var1 - 0.125D;
+ AxisAlignedBB var9 = AxisAlignedBB.getBoundingBoxFromPool(this.boundingBox.minX, var5, this.boundingBox.minZ, this.boundingBox.maxX, var7, this.boundingBox.maxZ);
+ if(this.worldObj.isAABBInMaterial(var9, Material.water)) {
+ var2 += 1.0D / (double)var1;
+ }
+ }
+
+ double var6;
+ double var8;
+ double var10;
+ double var21;
+ if(this.worldObj.singleplayerWorld) {
+ if(this.field_9176_d > 0) {
+ var21 = this.posX + (this.field_9174_e - this.posX) / (double)this.field_9176_d;
+ var6 = this.posY + (this.field_9172_f - this.posY) / (double)this.field_9176_d;
+ var8 = this.posZ + (this.field_9175_aj - this.posZ) / (double)this.field_9176_d;
+
+ for(var10 = this.field_9173_ak - (double)this.rotationYaw; var10 < -180.0D; var10 += 360.0D) {
+ }
+
+ while(var10 >= 180.0D) {
+ var10 -= 360.0D;
+ }
+
+ this.rotationYaw = (float)((double)this.rotationYaw + var10 / (double)this.field_9176_d);
+ this.rotationPitch = (float)((double)this.rotationPitch + (this.field_9171_al - (double)this.rotationPitch) / (double)this.field_9176_d);
+ --this.field_9176_d;
+ this.setPosition(var21, var6, var8);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ } else {
+ var21 = this.posX + this.motionX;
+ var6 = this.posY + this.motionY;
+ var8 = this.posZ + this.motionZ;
+ this.setPosition(var21, var6, var8);
+ if(this.onGround) {
+ this.motionX *= 0.5D;
+ this.motionY *= 0.5D;
+ this.motionZ *= 0.5D;
+ }
+
+ this.motionX *= (double)0.99F;
+ this.motionY *= (double)0.95F;
+ this.motionZ *= (double)0.99F;
+ }
+
+ } else {
+ if(var2 < 1.0D) {
+ var21 = var2 * 2.0D - 1.0D;
+ this.motionY += (double)0.04F * var21;
+ } else {
+ if(this.motionY < 0.0D) {
+ this.motionY /= 2.0D;
+ }
+
+ this.motionY += (double)0.007F;
+ }
+
+ if(this.riddenByEntity != null) {
+ this.motionX += this.riddenByEntity.motionX * 0.2D;
+ this.motionZ += this.riddenByEntity.motionZ * 0.2D;
+ }
+
+ var21 = 0.4D;
+ if(this.motionX < -var21) {
+ this.motionX = -var21;
+ }
+
+ if(this.motionX > var21) {
+ this.motionX = var21;
+ }
+
+ if(this.motionZ < -var21) {
+ this.motionZ = -var21;
+ }
+
+ if(this.motionZ > var21) {
+ this.motionZ = var21;
+ }
+
+ if(this.onGround) {
+ this.motionX *= 0.5D;
+ this.motionY *= 0.5D;
+ this.motionZ *= 0.5D;
+ }
+
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ var6 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ if(var6 > 0.15D) {
+ var8 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D);
+ var10 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D);
+
+ for(int var12 = 0; (double)var12 < 1.0D + var6 * 60.0D; ++var12) {
+ double var13 = (double)(this.rand.nextFloat() * 2.0F - 1.0F);
+ double var15 = (double)(this.rand.nextInt(2) * 2 - 1) * 0.7D;
+ double var17;
+ double var19;
+ if(this.rand.nextBoolean()) {
+ var17 = this.posX - var8 * var13 * 0.8D + var10 * var15;
+ var19 = this.posZ - var10 * var13 * 0.8D - var8 * var15;
+ this.worldObj.spawnParticle("splash", var17, this.posY - 0.125D, var19, this.motionX, this.motionY, this.motionZ);
+ } else {
+ var17 = this.posX + var8 + var10 * var13 * 0.7D;
+ var19 = this.posZ + var10 - var8 * var13 * 0.7D;
+ this.worldObj.spawnParticle("splash", var17, this.posY - 0.125D, var19, this.motionX, this.motionY, this.motionZ);
+ }
+ }
+ }
+
+ if(this.isCollidedHorizontally && var6 > 0.15D) {
+ if(!this.worldObj.singleplayerWorld) {
+ this.setEntityDead();
+
+ int var22;
+ for(var22 = 0; var22 < 3; ++var22) {
+ this.dropItemWithOffset(Block.planks.blockID, 1, 0.0F);
+ }
+
+ for(var22 = 0; var22 < 2; ++var22) {
+ this.dropItemWithOffset(Item.stick.shiftedIndex, 1, 0.0F);
+ }
+ }
+ } else {
+ this.motionX *= (double)0.99F;
+ this.motionY *= (double)0.95F;
+ this.motionZ *= (double)0.99F;
+ }
+
+ this.rotationPitch = 0.0F;
+ var8 = (double)this.rotationYaw;
+ var10 = this.prevPosX - this.posX;
+ double var23 = this.prevPosZ - this.posZ;
+ if(var10 * var10 + var23 * var23 > 0.001D) {
+ var8 = (double)((float)(Math.atan2(var23, var10) * 180.0D / Math.PI));
+ }
+
+ double var14;
+ for(var14 = var8 - (double)this.rotationYaw; var14 >= 180.0D; var14 -= 360.0D) {
+ }
+
+ while(var14 < -180.0D) {
+ var14 += 360.0D;
+ }
+
+ if(var14 > 20.0D) {
+ var14 = 20.0D;
+ }
+
+ if(var14 < -20.0D) {
+ var14 = -20.0D;
+ }
+
+ this.rotationYaw = (float)((double)this.rotationYaw + var14);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ List var16 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand((double)0.2F, 0.0D, (double)0.2F));
+ int var24;
+ if(var16 != null && var16.size() > 0) {
+ for(var24 = 0; var24 < var16.size(); ++var24) {
+ Entity var18 = (Entity)var16.get(var24);
+ if(var18 != this.riddenByEntity && var18.canBePushed() && var18 instanceof EntityBoat) {
+ var18.applyEntityCollision(this);
+ }
+ }
+ }
+
+ for(var24 = 0; var24 < 4; ++var24) {
+ int var25 = MathHelper.floor_double(this.posX + ((double)(var24 % 2) - 0.5D) * 0.8D);
+ int var26 = MathHelper.floor_double(this.posY);
+ int var20 = MathHelper.floor_double(this.posZ + ((double)(var24 / 2) - 0.5D) * 0.8D);
+ if(this.worldObj.getBlockId(var25, var26, var20) == Block.snow.blockID) {
+ this.worldObj.setBlockWithNotify(var25, var26, var20, 0);
+ }
+ }
+
+ if(this.riddenByEntity != null && this.riddenByEntity.isDead) {
+ this.riddenByEntity = null;
+ }
+
+ }
+ }
+
+ public void updateRiderPosition() {
+ if(this.riddenByEntity != null) {
+ double var1 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D;
+ double var3 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D;
+ this.riddenByEntity.setPosition(this.posX + var1, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ + var3);
+ }
+ }
+
+ protected void writeEntityToNBT(NBTTagCompound var1) {
+ }
+
+ protected void readEntityFromNBT(NBTTagCompound var1) {
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ if(this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != var1) {
+ return true;
+ } else {
+ if(!this.worldObj.singleplayerWorld) {
+ var1.mountEntity(this);
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/EntityChicken.java b/src/net/minecraft/src/EntityChicken.java
new file mode 100644
index 0000000..a611b2d
--- /dev/null
+++ b/src/net/minecraft/src/EntityChicken.java
@@ -0,0 +1,77 @@
+package net.minecraft.src;
+
+public class EntityChicken extends EntityAnimal {
+ public boolean field_392_a = false;
+ public float field_391_b = 0.0F;
+ public float field_395_ad = 0.0F;
+ public float field_394_ae;
+ public float field_393_af;
+ public float field_390_ai = 1.0F;
+ public int timeUntilNextEgg;
+
+ public EntityChicken(World var1) {
+ super(var1);
+ this.texture = "/mob/chicken.png";
+ this.setSize(0.3F, 0.4F);
+ this.health = 4;
+ this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000;
+ }
+
+ public void onLivingUpdate() {
+ super.onLivingUpdate();
+ this.field_393_af = this.field_391_b;
+ this.field_394_ae = this.field_395_ad;
+ this.field_395_ad = (float)((double)this.field_395_ad + (double)(this.onGround ? -1 : 4) * 0.3D);
+ if(this.field_395_ad < 0.0F) {
+ this.field_395_ad = 0.0F;
+ }
+
+ if(this.field_395_ad > 1.0F) {
+ this.field_395_ad = 1.0F;
+ }
+
+ if(!this.onGround && this.field_390_ai < 1.0F) {
+ this.field_390_ai = 1.0F;
+ }
+
+ this.field_390_ai = (float)((double)this.field_390_ai * 0.9D);
+ if(!this.onGround && this.motionY < 0.0D) {
+ this.motionY *= 0.6D;
+ }
+
+ this.field_391_b += this.field_390_ai * 2.0F;
+ if(!this.worldObj.singleplayerWorld && --this.timeUntilNextEgg <= 0) {
+ this.worldObj.playSoundAtEntity(this, "mob.chickenplop", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ this.dropItem(Item.egg.shiftedIndex, 1);
+ this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000;
+ }
+
+ }
+
+ protected void fall(float var1) {
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ protected String getLivingSound() {
+ return "mob.chicken";
+ }
+
+ protected String getHurtSound() {
+ return "mob.chickenhurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.chickenhurt";
+ }
+
+ protected int getDropItemId() {
+ return Item.feather.shiftedIndex;
+ }
+}
diff --git a/src/net/minecraft/src/EntityCow.java b/src/net/minecraft/src/EntityCow.java
new file mode 100644
index 0000000..87c6cb9
--- /dev/null
+++ b/src/net/minecraft/src/EntityCow.java
@@ -0,0 +1,47 @@
+package net.minecraft.src;
+
+public class EntityCow extends EntityAnimal {
+ public EntityCow(World var1) {
+ super(var1);
+ this.texture = "/mob/cow.png";
+ this.setSize(0.9F, 1.3F);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ protected String getLivingSound() {
+ return "mob.cow";
+ }
+
+ protected String getHurtSound() {
+ return "mob.cowhurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.cowhurt";
+ }
+
+ protected float getSoundVolume() {
+ return 0.4F;
+ }
+
+ protected int getDropItemId() {
+ return Item.leather.shiftedIndex;
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ ItemStack var2 = var1.inventory.getCurrentItem();
+ if(var2 != null && var2.itemID == Item.bucketEmpty.shiftedIndex) {
+ var1.inventory.setInventorySlotContents(var1.inventory.currentItem, new ItemStack(Item.bucketMilk));
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/EntityCreature.java b/src/net/minecraft/src/EntityCreature.java
new file mode 100644
index 0000000..30829f4
--- /dev/null
+++ b/src/net/minecraft/src/EntityCreature.java
@@ -0,0 +1,181 @@
+package net.minecraft.src;
+
+public class EntityCreature extends EntityLiving {
+ private PathEntity pathToEntity;
+ protected Entity playerToAttack;
+ protected boolean hasAttacked = false;
+
+ public EntityCreature(World var1) {
+ super(var1);
+ }
+
+ protected boolean func_25026_u() {
+ return false;
+ }
+
+ protected void updatePlayerActionState() {
+ this.hasAttacked = this.func_25026_u();
+ float var1 = 16.0F;
+ if(this.playerToAttack == null) {
+ this.playerToAttack = this.findPlayerToAttack();
+ if(this.playerToAttack != null) {
+ this.pathToEntity = this.worldObj.getPathToEntity(this, this.playerToAttack, var1);
+ }
+ } else if(!this.playerToAttack.isEntityAlive()) {
+ this.playerToAttack = null;
+ } else {
+ float var2 = this.playerToAttack.getDistanceToEntity(this);
+ if(this.canEntityBeSeen(this.playerToAttack)) {
+ this.attackEntity(this.playerToAttack, var2);
+ } else {
+ this.func_28013_b(this.playerToAttack, var2);
+ }
+ }
+
+ if(this.hasAttacked || this.playerToAttack == null || this.pathToEntity != null && this.rand.nextInt(20) != 0) {
+ if(!this.hasAttacked && (this.pathToEntity == null && this.rand.nextInt(80) == 0 || this.rand.nextInt(80) == 0)) {
+ this.func_31021_B();
+ }
+ } else {
+ this.pathToEntity = this.worldObj.getPathToEntity(this, this.playerToAttack, var1);
+ }
+
+ int var21 = MathHelper.floor_double(this.boundingBox.minY + 0.5D);
+ boolean var3 = this.isInWater();
+ boolean var4 = this.handleLavaMovement();
+ this.rotationPitch = 0.0F;
+ if(this.pathToEntity != null && this.rand.nextInt(100) != 0) {
+ Vec3D var5 = this.pathToEntity.getPosition(this);
+ double var6 = (double)(this.width * 2.0F);
+
+ while(var5 != null && var5.squareDistanceTo(this.posX, var5.yCoord, this.posZ) < var6 * var6) {
+ this.pathToEntity.incrementPathIndex();
+ if(this.pathToEntity.isFinished()) {
+ var5 = null;
+ this.pathToEntity = null;
+ } else {
+ var5 = this.pathToEntity.getPosition(this);
+ }
+ }
+
+ this.isJumping = false;
+ if(var5 != null) {
+ double var8 = var5.xCoord - this.posX;
+ double var10 = var5.zCoord - this.posZ;
+ double var12 = var5.yCoord - (double)var21;
+ float var14 = (float)(Math.atan2(var10, var8) * 180.0D / (double)((float)Math.PI)) - 90.0F;
+ float var15 = var14 - this.rotationYaw;
+
+ for(this.moveForward = this.moveSpeed; var15 < -180.0F; var15 += 360.0F) {
+ }
+
+ while(var15 >= 180.0F) {
+ var15 -= 360.0F;
+ }
+
+ if(var15 > 30.0F) {
+ var15 = 30.0F;
+ }
+
+ if(var15 < -30.0F) {
+ var15 = -30.0F;
+ }
+
+ this.rotationYaw += var15;
+ if(this.hasAttacked && this.playerToAttack != null) {
+ double var16 = this.playerToAttack.posX - this.posX;
+ double var18 = this.playerToAttack.posZ - this.posZ;
+ float var20 = this.rotationYaw;
+ this.rotationYaw = (float)(Math.atan2(var18, var16) * 180.0D / (double)((float)Math.PI)) - 90.0F;
+ var15 = (var20 - this.rotationYaw + 90.0F) * (float)Math.PI / 180.0F;
+ this.moveStrafing = -MathHelper.sin(var15) * this.moveForward * 1.0F;
+ this.moveForward = MathHelper.cos(var15) * this.moveForward * 1.0F;
+ }
+
+ if(var12 > 0.0D) {
+ this.isJumping = true;
+ }
+ }
+
+ if(this.playerToAttack != null) {
+ this.faceEntity(this.playerToAttack, 30.0F, 30.0F);
+ }
+
+ if(this.isCollidedHorizontally && !this.getGotPath()) {
+ this.isJumping = true;
+ }
+
+ if(this.rand.nextFloat() < 0.8F && (var3 || var4)) {
+ this.isJumping = true;
+ }
+
+ } else {
+ super.updatePlayerActionState();
+ this.pathToEntity = null;
+ }
+ }
+
+ protected void func_31021_B() {
+ boolean var1 = false;
+ int var2 = -1;
+ int var3 = -1;
+ int var4 = -1;
+ float var5 = -99999.0F;
+
+ for(int var6 = 0; var6 < 10; ++var6) {
+ int var7 = MathHelper.floor_double(this.posX + (double)this.rand.nextInt(13) - 6.0D);
+ int var8 = MathHelper.floor_double(this.posY + (double)this.rand.nextInt(7) - 3.0D);
+ int var9 = MathHelper.floor_double(this.posZ + (double)this.rand.nextInt(13) - 6.0D);
+ float var10 = this.getBlockPathWeight(var7, var8, var9);
+ if(var10 > var5) {
+ var5 = var10;
+ var2 = var7;
+ var3 = var8;
+ var4 = var9;
+ var1 = true;
+ }
+ }
+
+ if(var1) {
+ this.pathToEntity = this.worldObj.getEntityPathToXYZ(this, var2, var3, var4, 10.0F);
+ }
+
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ }
+
+ protected void func_28013_b(Entity var1, float var2) {
+ }
+
+ protected float getBlockPathWeight(int var1, int var2, int var3) {
+ return 0.0F;
+ }
+
+ protected Entity findPlayerToAttack() {
+ return null;
+ }
+
+ public boolean getCanSpawnHere() {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.boundingBox.minY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ return super.getCanSpawnHere() && this.getBlockPathWeight(var1, var2, var3) >= 0.0F;
+ }
+
+ public boolean getGotPath() {
+ return this.pathToEntity != null;
+ }
+
+ public void setPathToEntity(PathEntity var1) {
+ this.pathToEntity = var1;
+ }
+
+ public Entity getEntityToAttack() {
+ return this.playerToAttack;
+ }
+
+ public void setEntityToAttack(Entity var1) {
+ this.playerToAttack = var1;
+ }
+}
diff --git a/src/net/minecraft/src/EntityCreeper.java b/src/net/minecraft/src/EntityCreeper.java
new file mode 100644
index 0000000..c67eca6
--- /dev/null
+++ b/src/net/minecraft/src/EntityCreeper.java
@@ -0,0 +1,141 @@
+package net.minecraft.src;
+
+public class EntityCreeper extends EntityMob {
+ int timeSinceIgnited;
+ int lastActiveTime;
+
+ public EntityCreeper(World var1) {
+ super(var1);
+ this.texture = "/mob/creeper.png";
+ }
+
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(16, Byte.valueOf((byte)-1));
+ this.dataWatcher.addObject(17, Byte.valueOf((byte)0));
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ if(this.dataWatcher.getWatchableObjectByte(17) == 1) {
+ var1.setBoolean("powered", true);
+ }
+
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.dataWatcher.updateObject(17, Byte.valueOf((byte)(var1.getBoolean("powered") ? 1 : 0)));
+ }
+
+ protected void func_28013_b(Entity var1, float var2) {
+ if(!this.worldObj.singleplayerWorld) {
+ if(this.timeSinceIgnited > 0) {
+ this.setCreeperState(-1);
+ --this.timeSinceIgnited;
+ if(this.timeSinceIgnited < 0) {
+ this.timeSinceIgnited = 0;
+ }
+ }
+
+ }
+ }
+
+ public void onUpdate() {
+ this.lastActiveTime = this.timeSinceIgnited;
+ if(this.worldObj.singleplayerWorld) {
+ int var1 = this.getCreeperState();
+ if(var1 > 0 && this.timeSinceIgnited == 0) {
+ this.worldObj.playSoundAtEntity(this, "random.fuse", 1.0F, 0.5F);
+ }
+
+ this.timeSinceIgnited += var1;
+ if(this.timeSinceIgnited < 0) {
+ this.timeSinceIgnited = 0;
+ }
+
+ if(this.timeSinceIgnited >= 30) {
+ this.timeSinceIgnited = 30;
+ }
+ }
+
+ super.onUpdate();
+ if(this.playerToAttack == null && this.timeSinceIgnited > 0) {
+ this.setCreeperState(-1);
+ --this.timeSinceIgnited;
+ if(this.timeSinceIgnited < 0) {
+ this.timeSinceIgnited = 0;
+ }
+ }
+
+ }
+
+ protected String getHurtSound() {
+ return "mob.creeper";
+ }
+
+ protected String getDeathSound() {
+ return "mob.creeperdeath";
+ }
+
+ public void onDeath(Entity var1) {
+ super.onDeath(var1);
+ if(var1 instanceof EntitySkeleton) {
+ this.dropItem(Item.record13.shiftedIndex + this.rand.nextInt(2), 1);
+ }
+
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ if(!this.worldObj.singleplayerWorld) {
+ int var3 = this.getCreeperState();
+ if(var3 <= 0 && var2 < 3.0F || var3 > 0 && var2 < 7.0F) {
+ if(this.timeSinceIgnited == 0) {
+ this.worldObj.playSoundAtEntity(this, "random.fuse", 1.0F, 0.5F);
+ }
+
+ this.setCreeperState(1);
+ ++this.timeSinceIgnited;
+ if(this.timeSinceIgnited >= 30) {
+ if(this.getPowered()) {
+ this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 6.0F);
+ } else {
+ this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 3.0F);
+ }
+
+ this.setEntityDead();
+ }
+
+ this.hasAttacked = true;
+ } else {
+ this.setCreeperState(-1);
+ --this.timeSinceIgnited;
+ if(this.timeSinceIgnited < 0) {
+ this.timeSinceIgnited = 0;
+ }
+ }
+
+ }
+ }
+
+ public boolean getPowered() {
+ return this.dataWatcher.getWatchableObjectByte(17) == 1;
+ }
+
+ protected int getDropItemId() {
+ return Item.gunpowder.shiftedIndex;
+ }
+
+ private int getCreeperState() {
+ return this.dataWatcher.getWatchableObjectByte(16);
+ }
+
+ private void setCreeperState(int var1) {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)var1));
+ }
+
+ public void onStruckByLightning(EntityLightningBolt var1) {
+ super.onStruckByLightning(var1);
+ this.dataWatcher.updateObject(17, Byte.valueOf((byte)1));
+ }
+}
diff --git a/src/net/minecraft/src/EntityEgg.java b/src/net/minecraft/src/EntityEgg.java
new file mode 100644
index 0000000..51a65a3
--- /dev/null
+++ b/src/net/minecraft/src/EntityEgg.java
@@ -0,0 +1,225 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityEgg extends Entity {
+ private int xTile = -1;
+ private int yTile = -1;
+ private int zTile = -1;
+ private int inTile = 0;
+ private boolean inGround = false;
+ public int shake = 0;
+ private EntityLiving field_20083_aj;
+ private int field_20081_ak;
+ private int field_20079_al = 0;
+
+ public EntityEgg(World var1) {
+ super(var1);
+ this.setSize(0.25F, 0.25F);
+ }
+
+ protected void entityInit() {
+ }
+
+ public EntityEgg(World var1, EntityLiving var2) {
+ super(var1);
+ this.field_20083_aj = var2;
+ this.setSize(0.25F, 0.25F);
+ this.setLocationAndAngles(var2.posX, var2.posY + (double)var2.getEyeHeight(), var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.posY -= (double)0.1F;
+ this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.yOffset = 0.0F;
+ float var3 = 0.4F;
+ this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.func_20078_a(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F);
+ }
+
+ public EntityEgg(World var1, double var2, double var4, double var6) {
+ super(var1);
+ this.field_20081_ak = 0;
+ this.setSize(0.25F, 0.25F);
+ this.setPosition(var2, var4, var6);
+ this.yOffset = 0.0F;
+ }
+
+ public void func_20078_a(double var1, double var3, double var5, float var7, float var8) {
+ float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);
+ var1 /= (double)var9;
+ var3 /= (double)var9;
+ var5 /= (double)var9;
+ var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var1 *= (double)var7;
+ var3 *= (double)var7;
+ var5 *= (double)var7;
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI));
+ this.field_20081_ak = 0;
+ }
+
+ public void onUpdate() {
+ this.lastTickPosX = this.posX;
+ this.lastTickPosY = this.posY;
+ this.lastTickPosZ = this.posZ;
+ super.onUpdate();
+ if(this.shake > 0) {
+ --this.shake;
+ }
+
+ if(this.inGround) {
+ int var1 = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
+ if(var1 == this.inTile) {
+ ++this.field_20081_ak;
+ if(this.field_20081_ak == 1200) {
+ this.setEntityDead();
+ }
+
+ return;
+ }
+
+ this.inGround = false;
+ this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
+ this.field_20081_ak = 0;
+ this.field_20079_al = 0;
+ } else {
+ ++this.field_20079_al;
+ }
+
+ Vec3D var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var15, var2);
+ var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if(var3 != null) {
+ var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord);
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ Entity var4 = null;
+ List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D));
+ double var6 = 0.0D;
+
+ for(int var8 = 0; var8 < var5.size(); ++var8) {
+ Entity var9 = (Entity)var5.get(var8);
+ if(var9.canBeCollidedWith() && (var9 != this.field_20083_aj || this.field_20079_al >= 5)) {
+ float var10 = 0.3F;
+ AxisAlignedBB var11 = var9.boundingBox.expand((double)var10, (double)var10, (double)var10);
+ MovingObjectPosition var12 = var11.func_706_a(var15, var2);
+ if(var12 != null) {
+ double var13 = var15.distanceTo(var12.hitVec);
+ if(var13 < var6 || var6 == 0.0D) {
+ var4 = var9;
+ var6 = var13;
+ }
+ }
+ }
+ }
+
+ if(var4 != null) {
+ var3 = new MovingObjectPosition(var4);
+ }
+ }
+
+ if(var3 != null) {
+ if(var3.entityHit != null && var3.entityHit.attackEntityFrom(this.field_20083_aj, 0)) {
+ }
+
+ if(!this.worldObj.singleplayerWorld && this.rand.nextInt(8) == 0) {
+ byte var16 = 1;
+ if(this.rand.nextInt(32) == 0) {
+ var16 = 4;
+ }
+
+ for(int var17 = 0; var17 < var16; ++var17) {
+ EntityChicken var21 = new EntityChicken(this.worldObj);
+ var21.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, 0.0F);
+ this.worldObj.entityJoinedWorld(var21);
+ }
+ }
+
+ for(int var18 = 0; var18 < 8; ++var18) {
+ this.worldObj.spawnParticle("snowballpoof", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D);
+ }
+
+ this.setEntityDead();
+ }
+
+ this.posX += this.motionX;
+ this.posY += this.motionY;
+ this.posZ += this.motionZ;
+ float var20 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+
+ for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var20) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float var19 = 0.99F;
+ float var22 = 0.03F;
+ if(this.isInWater()) {
+ for(int var7 = 0; var7 < 4; ++var7) {
+ float var23 = 0.25F;
+ this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var23, this.posY - this.motionY * (double)var23, this.posZ - this.motionZ * (double)var23, this.motionX, this.motionY, this.motionZ);
+ }
+
+ var19 = 0.8F;
+ }
+
+ this.motionX *= (double)var19;
+ this.motionY *= (double)var19;
+ this.motionZ *= (double)var19;
+ this.motionY -= (double)var22;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("xTile", (short)this.xTile);
+ var1.setShort("yTile", (short)this.yTile);
+ var1.setShort("zTile", (short)this.zTile);
+ var1.setByte("inTile", (byte)this.inTile);
+ var1.setByte("shake", (byte)this.shake);
+ var1.setByte("inGround", (byte)(this.inGround ? 1 : 0));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.xTile = var1.getShort("xTile");
+ this.yTile = var1.getShort("yTile");
+ this.zTile = var1.getShort("zTile");
+ this.inTile = var1.getByte("inTile") & 255;
+ this.shake = var1.getByte("shake") & 255;
+ this.inGround = var1.getByte("inGround") == 1;
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ if(this.inGround && this.field_20083_aj == var1 && this.shake <= 0 && var1.inventory.addItemStackToInventory(new ItemStack(Item.arrow, 1))) {
+ this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
+ var1.onItemPickup(this, 1);
+ this.setEntityDead();
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/EntityFallingSand.java b/src/net/minecraft/src/EntityFallingSand.java
new file mode 100644
index 0000000..7f85495
--- /dev/null
+++ b/src/net/minecraft/src/EntityFallingSand.java
@@ -0,0 +1,80 @@
+package net.minecraft.src;
+
+public class EntityFallingSand extends Entity {
+ public int blockID;
+ public int fallTime = 0;
+
+ public EntityFallingSand(World var1) {
+ super(var1);
+ }
+
+ public EntityFallingSand(World var1, double var2, double var4, double var6, int var8) {
+ super(var1);
+ this.blockID = var8;
+ this.preventEntitySpawning = true;
+ this.setSize(0.98F, 0.98F);
+ this.yOffset = this.height / 2.0F;
+ this.setPosition(var2, var4, var6);
+ this.motionX = 0.0D;
+ this.motionY = 0.0D;
+ this.motionZ = 0.0D;
+ this.prevPosX = var2;
+ this.prevPosY = var4;
+ this.prevPosZ = var6;
+ }
+
+ protected boolean func_25017_l() {
+ return false;
+ }
+
+ protected void entityInit() {
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public void onUpdate() {
+ if(this.blockID == 0) {
+ this.setEntityDead();
+ } else {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ ++this.fallTime;
+ this.motionY -= (double)0.04F;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.98F;
+ this.motionY *= (double)0.98F;
+ this.motionZ *= (double)0.98F;
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.posY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ if(this.worldObj.getBlockId(var1, var2, var3) == this.blockID) {
+ this.worldObj.setBlockWithNotify(var1, var2, var3, 0);
+ }
+
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ this.motionY *= -0.5D;
+ this.setEntityDead();
+ if((!this.worldObj.canBlockBePlacedAt(this.blockID, var1, var2, var3, true, 1) || BlockSand.canFallBelow(this.worldObj, var1, var2 - 1, var3) || !this.worldObj.setBlockWithNotify(var1, var2, var3, this.blockID)) && !this.worldObj.singleplayerWorld) {
+ this.dropItem(this.blockID, 1);
+ }
+ } else if(this.fallTime > 100 && !this.worldObj.singleplayerWorld) {
+ this.dropItem(this.blockID, 1);
+ this.setEntityDead();
+ }
+
+ }
+ }
+
+ protected void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setByte("Tile", (byte)this.blockID);
+ }
+
+ protected void readEntityFromNBT(NBTTagCompound var1) {
+ this.blockID = var1.getByte("Tile") & 255;
+ }
+}
diff --git a/src/net/minecraft/src/EntityFireball.java b/src/net/minecraft/src/EntityFireball.java
new file mode 100644
index 0000000..ae5528b
--- /dev/null
+++ b/src/net/minecraft/src/EntityFireball.java
@@ -0,0 +1,199 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityFireball extends Entity {
+ private int xTile = -1;
+ private int yTile = -1;
+ private int zTile = -1;
+ private int inTile = 0;
+ private boolean inGround = false;
+ public int shake = 0;
+ public EntityLiving owner;
+ private int field_9190_an;
+ private int ticksInAir = 0;
+ public double field_9199_b;
+ public double field_9198_c;
+ public double field_9196_d;
+
+ public EntityFireball(World var1) {
+ super(var1);
+ this.setSize(1.0F, 1.0F);
+ }
+
+ protected void entityInit() {
+ }
+
+ public EntityFireball(World var1, EntityLiving var2, double var3, double var5, double var7) {
+ super(var1);
+ this.owner = var2;
+ this.setSize(1.0F, 1.0F);
+ this.setLocationAndAngles(var2.posX, var2.posY, var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.yOffset = 0.0F;
+ this.motionX = this.motionY = this.motionZ = 0.0D;
+ var3 += this.rand.nextGaussian() * 0.4D;
+ var5 += this.rand.nextGaussian() * 0.4D;
+ var7 += this.rand.nextGaussian() * 0.4D;
+ double var9 = (double)MathHelper.sqrt_double(var3 * var3 + var5 * var5 + var7 * var7);
+ this.field_9199_b = var3 / var9 * 0.1D;
+ this.field_9198_c = var5 / var9 * 0.1D;
+ this.field_9196_d = var7 / var9 * 0.1D;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ this.fire = 10;
+ if(this.shake > 0) {
+ --this.shake;
+ }
+
+ if(this.inGround) {
+ int var1 = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
+ if(var1 == this.inTile) {
+ ++this.field_9190_an;
+ if(this.field_9190_an == 1200) {
+ this.setEntityDead();
+ }
+
+ return;
+ }
+
+ this.inGround = false;
+ this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
+ this.field_9190_an = 0;
+ this.ticksInAir = 0;
+ } else {
+ ++this.ticksInAir;
+ }
+
+ Vec3D var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var15, var2);
+ var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if(var3 != null) {
+ var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord);
+ }
+
+ Entity var4 = null;
+ List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D));
+ double var6 = 0.0D;
+
+ for(int var8 = 0; var8 < var5.size(); ++var8) {
+ Entity var9 = (Entity)var5.get(var8);
+ if(var9.canBeCollidedWith() && (var9 != this.owner || this.ticksInAir >= 25)) {
+ float var10 = 0.3F;
+ AxisAlignedBB var11 = var9.boundingBox.expand((double)var10, (double)var10, (double)var10);
+ MovingObjectPosition var12 = var11.func_706_a(var15, var2);
+ if(var12 != null) {
+ double var13 = var15.distanceTo(var12.hitVec);
+ if(var13 < var6 || var6 == 0.0D) {
+ var4 = var9;
+ var6 = var13;
+ }
+ }
+ }
+ }
+
+ if(var4 != null) {
+ var3 = new MovingObjectPosition(var4);
+ }
+
+ if(var3 != null) {
+ if(!this.worldObj.singleplayerWorld) {
+ if(var3.entityHit != null && var3.entityHit.attackEntityFrom(this.owner, 0)) {
+ }
+
+ this.worldObj.newExplosion((Entity)null, this.posX, this.posY, this.posZ, 1.0F, true);
+ }
+
+ this.setEntityDead();
+ }
+
+ this.posX += this.motionX;
+ this.posY += this.motionY;
+ this.posZ += this.motionZ;
+ float var16 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+
+ for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var16) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float var17 = 0.95F;
+ if(this.isInWater()) {
+ for(int var18 = 0; var18 < 4; ++var18) {
+ float var19 = 0.25F;
+ this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var19, this.posY - this.motionY * (double)var19, this.posZ - this.motionZ * (double)var19, this.motionX, this.motionY, this.motionZ);
+ }
+
+ var17 = 0.8F;
+ }
+
+ this.motionX += this.field_9199_b;
+ this.motionY += this.field_9198_c;
+ this.motionZ += this.field_9196_d;
+ this.motionX *= (double)var17;
+ this.motionY *= (double)var17;
+ this.motionZ *= (double)var17;
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("xTile", (short)this.xTile);
+ var1.setShort("yTile", (short)this.yTile);
+ var1.setShort("zTile", (short)this.zTile);
+ var1.setByte("inTile", (byte)this.inTile);
+ var1.setByte("shake", (byte)this.shake);
+ var1.setByte("inGround", (byte)(this.inGround ? 1 : 0));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.xTile = var1.getShort("xTile");
+ this.yTile = var1.getShort("yTile");
+ this.zTile = var1.getShort("zTile");
+ this.inTile = var1.getByte("inTile") & 255;
+ this.shake = var1.getByte("shake") & 255;
+ this.inGround = var1.getByte("inGround") == 1;
+ }
+
+ public boolean canBeCollidedWith() {
+ return true;
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ this.setBeenAttacked();
+ if(var1 != null) {
+ Vec3D var3 = var1.getLookVec();
+ if(var3 != null) {
+ this.motionX = var3.xCoord;
+ this.motionY = var3.yCoord;
+ this.motionZ = var3.zCoord;
+ this.field_9199_b = this.motionX * 0.1D;
+ this.field_9198_c = this.motionY * 0.1D;
+ this.field_9196_d = this.motionZ * 0.1D;
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/EntityFish.java b/src/net/minecraft/src/EntityFish.java
new file mode 100644
index 0000000..3163720
--- /dev/null
+++ b/src/net/minecraft/src/EntityFish.java
@@ -0,0 +1,326 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityFish extends Entity {
+ private int xTile = -1;
+ private int yTile = -1;
+ private int zTile = -1;
+ private int inTile = 0;
+ private boolean inGround = false;
+ public int shake = 0;
+ public EntityPlayer angler;
+ private int ticksInGround;
+ private int ticksInAir = 0;
+ private int ticksCatchable = 0;
+ public Entity bobber = null;
+ private int field_6149_an;
+ private double field_6148_ao;
+ private double field_6147_ap;
+ private double field_6146_aq;
+ private double field_6145_ar;
+ private double field_6144_as;
+
+ public EntityFish(World var1) {
+ super(var1);
+ this.setSize(0.25F, 0.25F);
+ this.field_28008_bI = true;
+ }
+
+ public EntityFish(World var1, EntityPlayer var2) {
+ super(var1);
+ this.field_28008_bI = true;
+ this.angler = var2;
+ this.angler.fishEntity = this;
+ this.setSize(0.25F, 0.25F);
+ this.setLocationAndAngles(var2.posX, var2.posY + 1.62D - (double)var2.yOffset, var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.posY -= (double)0.1F;
+ this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.yOffset = 0.0F;
+ float var3 = 0.4F;
+ this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.func_6142_a(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F);
+ }
+
+ protected void entityInit() {
+ }
+
+ public void func_6142_a(double var1, double var3, double var5, float var7, float var8) {
+ float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);
+ var1 /= (double)var9;
+ var3 /= (double)var9;
+ var5 /= (double)var9;
+ var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var1 *= (double)var7;
+ var3 *= (double)var7;
+ var5 *= (double)var7;
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI));
+ this.ticksInGround = 0;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.field_6149_an > 0) {
+ double var21 = this.posX + (this.field_6148_ao - this.posX) / (double)this.field_6149_an;
+ double var22 = this.posY + (this.field_6147_ap - this.posY) / (double)this.field_6149_an;
+ double var23 = this.posZ + (this.field_6146_aq - this.posZ) / (double)this.field_6149_an;
+
+ double var7;
+ for(var7 = this.field_6145_ar - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D) {
+ }
+
+ while(var7 >= 180.0D) {
+ var7 -= 360.0D;
+ }
+
+ this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.field_6149_an);
+ this.rotationPitch = (float)((double)this.rotationPitch + (this.field_6144_as - (double)this.rotationPitch) / (double)this.field_6149_an);
+ --this.field_6149_an;
+ this.setPosition(var21, var22, var23);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ } else {
+ if(!this.worldObj.singleplayerWorld) {
+ ItemStack var1 = this.angler.getCurrentEquippedItem();
+ if(this.angler.isDead || !this.angler.isEntityAlive() || var1 == null || var1.getItem() != Item.fishingRod || this.getDistanceSqToEntity(this.angler) > 1024.0D) {
+ this.setEntityDead();
+ this.angler.fishEntity = null;
+ return;
+ }
+
+ if(this.bobber != null) {
+ if(!this.bobber.isDead) {
+ this.posX = this.bobber.posX;
+ this.posY = this.bobber.boundingBox.minY + (double)this.bobber.height * 0.8D;
+ this.posZ = this.bobber.posZ;
+ return;
+ }
+
+ this.bobber = null;
+ }
+ }
+
+ if(this.shake > 0) {
+ --this.shake;
+ }
+
+ if(this.inGround) {
+ int var19 = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
+ if(var19 == this.inTile) {
+ ++this.ticksInGround;
+ if(this.ticksInGround == 1200) {
+ this.setEntityDead();
+ }
+
+ return;
+ }
+
+ this.inGround = false;
+ this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
+ this.ticksInGround = 0;
+ this.ticksInAir = 0;
+ } else {
+ ++this.ticksInAir;
+ }
+
+ Vec3D var20 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var20, var2);
+ var20 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if(var3 != null) {
+ var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord);
+ }
+
+ Entity var4 = null;
+ List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D));
+ double var6 = 0.0D;
+
+ double var13;
+ for(int var8 = 0; var8 < var5.size(); ++var8) {
+ Entity var9 = (Entity)var5.get(var8);
+ if(var9.canBeCollidedWith() && (var9 != this.angler || this.ticksInAir >= 5)) {
+ float var10 = 0.3F;
+ AxisAlignedBB var11 = var9.boundingBox.expand((double)var10, (double)var10, (double)var10);
+ MovingObjectPosition var12 = var11.func_706_a(var20, var2);
+ if(var12 != null) {
+ var13 = var20.distanceTo(var12.hitVec);
+ if(var13 < var6 || var6 == 0.0D) {
+ var4 = var9;
+ var6 = var13;
+ }
+ }
+ }
+ }
+
+ if(var4 != null) {
+ var3 = new MovingObjectPosition(var4);
+ }
+
+ if(var3 != null) {
+ if(var3.entityHit != null) {
+ if(var3.entityHit.attackEntityFrom(this.angler, 0)) {
+ this.bobber = var3.entityHit;
+ }
+ } else {
+ this.inGround = true;
+ }
+ }
+
+ if(!this.inGround) {
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ float var24 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+
+ for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var24) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float var25 = 0.92F;
+ if(this.onGround || this.isCollidedHorizontally) {
+ var25 = 0.5F;
+ }
+
+ byte var26 = 5;
+ double var27 = 0.0D;
+
+ for(int var28 = 0; var28 < var26; ++var28) {
+ double var14 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var28 + 0) / (double)var26 - 0.125D + 0.125D;
+ double var16 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var28 + 1) / (double)var26 - 0.125D + 0.125D;
+ AxisAlignedBB var18 = AxisAlignedBB.getBoundingBoxFromPool(this.boundingBox.minX, var14, this.boundingBox.minZ, this.boundingBox.maxX, var16, this.boundingBox.maxZ);
+ if(this.worldObj.isAABBInMaterial(var18, Material.water)) {
+ var27 += 1.0D / (double)var26;
+ }
+ }
+
+ if(var27 > 0.0D) {
+ if(this.ticksCatchable > 0) {
+ --this.ticksCatchable;
+ } else {
+ short var29 = 500;
+ if(this.worldObj.canLightningStrikeAt(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY) + 1, MathHelper.floor_double(this.posZ))) {
+ var29 = 300;
+ }
+
+ if(this.rand.nextInt(var29) == 0) {
+ this.ticksCatchable = this.rand.nextInt(30) + 10;
+ this.motionY -= (double)0.2F;
+ this.worldObj.playSoundAtEntity(this, "random.splash", 0.25F, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
+ float var30 = (float)MathHelper.floor_double(this.boundingBox.minY);
+
+ int var15;
+ float var17;
+ float var31;
+ for(var15 = 0; (float)var15 < 1.0F + this.width * 20.0F; ++var15) {
+ var31 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ var17 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle("bubble", this.posX + (double)var31, (double)(var30 + 1.0F), this.posZ + (double)var17, this.motionX, this.motionY - (double)(this.rand.nextFloat() * 0.2F), this.motionZ);
+ }
+
+ for(var15 = 0; (float)var15 < 1.0F + this.width * 20.0F; ++var15) {
+ var31 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ var17 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle("splash", this.posX + (double)var31, (double)(var30 + 1.0F), this.posZ + (double)var17, this.motionX, this.motionY, this.motionZ);
+ }
+ }
+ }
+ }
+
+ if(this.ticksCatchable > 0) {
+ this.motionY -= (double)(this.rand.nextFloat() * this.rand.nextFloat() * this.rand.nextFloat()) * 0.2D;
+ }
+
+ var13 = var27 * 2.0D - 1.0D;
+ this.motionY += (double)0.04F * var13;
+ if(var27 > 0.0D) {
+ var25 = (float)((double)var25 * 0.9D);
+ this.motionY *= 0.8D;
+ }
+
+ this.motionX *= (double)var25;
+ this.motionY *= (double)var25;
+ this.motionZ *= (double)var25;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+ }
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("xTile", (short)this.xTile);
+ var1.setShort("yTile", (short)this.yTile);
+ var1.setShort("zTile", (short)this.zTile);
+ var1.setByte("inTile", (byte)this.inTile);
+ var1.setByte("shake", (byte)this.shake);
+ var1.setByte("inGround", (byte)(this.inGround ? 1 : 0));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.xTile = var1.getShort("xTile");
+ this.yTile = var1.getShort("yTile");
+ this.zTile = var1.getShort("zTile");
+ this.inTile = var1.getByte("inTile") & 255;
+ this.shake = var1.getByte("shake") & 255;
+ this.inGround = var1.getByte("inGround") == 1;
+ }
+
+ public int catchFish() {
+ byte var1 = 0;
+ if(this.bobber != null) {
+ double var2 = this.angler.posX - this.posX;
+ double var4 = this.angler.posY - this.posY;
+ double var6 = this.angler.posZ - this.posZ;
+ double var8 = (double)MathHelper.sqrt_double(var2 * var2 + var4 * var4 + var6 * var6);
+ double var10 = 0.1D;
+ this.bobber.motionX += var2 * var10;
+ this.bobber.motionY += var4 * var10 + (double)MathHelper.sqrt_double(var8) * 0.08D;
+ this.bobber.motionZ += var6 * var10;
+ var1 = 3;
+ } else if(this.ticksCatchable > 0) {
+ EntityItem var13 = new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.fishRaw));
+ double var3 = this.angler.posX - this.posX;
+ double var5 = this.angler.posY - this.posY;
+ double var7 = this.angler.posZ - this.posZ;
+ double var9 = (double)MathHelper.sqrt_double(var3 * var3 + var5 * var5 + var7 * var7);
+ double var11 = 0.1D;
+ var13.motionX = var3 * var11;
+ var13.motionY = var5 * var11 + (double)MathHelper.sqrt_double(var9) * 0.08D;
+ var13.motionZ = var7 * var11;
+ this.worldObj.entityJoinedWorld(var13);
+ this.angler.addStat(StatList.fishCaughtStat, 1);
+ var1 = 1;
+ }
+
+ if(this.inGround) {
+ var1 = 2;
+ }
+
+ this.setEntityDead();
+ this.angler.fishEntity = null;
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/EntityFlying.java b/src/net/minecraft/src/EntityFlying.java
new file mode 100644
index 0000000..cd3e36c
--- /dev/null
+++ b/src/net/minecraft/src/EntityFlying.java
@@ -0,0 +1,66 @@
+package net.minecraft.src;
+
+public class EntityFlying extends EntityLiving {
+ public EntityFlying(World var1) {
+ super(var1);
+ }
+
+ protected void fall(float var1) {
+ }
+
+ public void moveEntityWithHeading(float var1, float var2) {
+ if(this.isInWater()) {
+ this.moveFlying(var1, var2, 0.02F);
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.8F;
+ this.motionY *= (double)0.8F;
+ this.motionZ *= (double)0.8F;
+ } else if(this.handleLavaMovement()) {
+ this.moveFlying(var1, var2, 0.02F);
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= 0.5D;
+ this.motionY *= 0.5D;
+ this.motionZ *= 0.5D;
+ } else {
+ float var3 = 0.91F;
+ if(this.onGround) {
+ var3 = 546.0F * 0.1F * 0.1F * 0.1F;
+ int var4 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var4 > 0) {
+ var3 = Block.blocksList[var4].slipperiness * 0.91F;
+ }
+ }
+
+ float var8 = 0.16277136F / (var3 * var3 * var3);
+ this.moveFlying(var1, var2, this.onGround ? 0.1F * var8 : 0.02F);
+ var3 = 0.91F;
+ if(this.onGround) {
+ var3 = 546.0F * 0.1F * 0.1F * 0.1F;
+ int var5 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var5 > 0) {
+ var3 = Block.blocksList[var5].slipperiness * 0.91F;
+ }
+ }
+
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)var3;
+ this.motionY *= (double)var3;
+ this.motionZ *= (double)var3;
+ }
+
+ this.field_9142_bc = this.field_9141_bd;
+ double var10 = this.posX - this.prevPosX;
+ double var9 = this.posZ - this.prevPosZ;
+ float var7 = MathHelper.sqrt_double(var10 * var10 + var9 * var9) * 4.0F;
+ if(var7 > 1.0F) {
+ var7 = 1.0F;
+ }
+
+ this.field_9141_bd += (var7 - this.field_9141_bd) * 0.4F;
+ this.field_386_ba += this.field_9141_bd;
+ }
+
+ public boolean isOnLadder() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/EntityGhast.java b/src/net/minecraft/src/EntityGhast.java
new file mode 100644
index 0000000..1991fe3
--- /dev/null
+++ b/src/net/minecraft/src/EntityGhast.java
@@ -0,0 +1,158 @@
+package net.minecraft.src;
+
+public class EntityGhast extends EntityFlying implements IMob {
+ public int courseChangeCooldown = 0;
+ public double waypointX;
+ public double waypointY;
+ public double waypointZ;
+ private Entity targetedEntity = null;
+ private int aggroCooldown = 0;
+ public int prevAttackCounter = 0;
+ public int attackCounter = 0;
+
+ public EntityGhast(World var1) {
+ super(var1);
+ this.texture = "/mob/ghast.png";
+ this.setSize(4.0F, 4.0F);
+ this.isImmuneToFire = true;
+ }
+
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(16, Byte.valueOf((byte)0));
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ byte var1 = this.dataWatcher.getWatchableObjectByte(16);
+ this.texture = var1 == 1 ? "/mob/ghast_fire.png" : "/mob/ghast.png";
+ }
+
+ protected void updatePlayerActionState() {
+ if(!this.worldObj.singleplayerWorld && this.worldObj.difficultySetting == 0) {
+ this.setEntityDead();
+ }
+
+ this.func_27013_Q();
+ this.prevAttackCounter = this.attackCounter;
+ double var1 = this.waypointX - this.posX;
+ double var3 = this.waypointY - this.posY;
+ double var5 = this.waypointZ - this.posZ;
+ double var7 = (double)MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);
+ if(var7 < 1.0D || var7 > 60.0D) {
+ this.waypointX = this.posX + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F);
+ this.waypointY = this.posY + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F);
+ this.waypointZ = this.posZ + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F);
+ }
+
+ if(this.courseChangeCooldown-- <= 0) {
+ this.courseChangeCooldown += this.rand.nextInt(5) + 2;
+ if(this.isCourseTraversable(this.waypointX, this.waypointY, this.waypointZ, var7)) {
+ this.motionX += var1 / var7 * 0.1D;
+ this.motionY += var3 / var7 * 0.1D;
+ this.motionZ += var5 / var7 * 0.1D;
+ } else {
+ this.waypointX = this.posX;
+ this.waypointY = this.posY;
+ this.waypointZ = this.posZ;
+ }
+ }
+
+ if(this.targetedEntity != null && this.targetedEntity.isDead) {
+ this.targetedEntity = null;
+ }
+
+ if(this.targetedEntity == null || this.aggroCooldown-- <= 0) {
+ this.targetedEntity = this.worldObj.getClosestPlayerToEntity(this, 100.0D);
+ if(this.targetedEntity != null) {
+ this.aggroCooldown = 20;
+ }
+ }
+
+ double var9 = 64.0D;
+ if(this.targetedEntity != null && this.targetedEntity.getDistanceSqToEntity(this) < var9 * var9) {
+ double var11 = this.targetedEntity.posX - this.posX;
+ double var13 = this.targetedEntity.boundingBox.minY + (double)(this.targetedEntity.height / 2.0F) - (this.posY + (double)(this.height / 2.0F));
+ double var15 = this.targetedEntity.posZ - this.posZ;
+ this.renderYawOffset = this.rotationYaw = -((float)Math.atan2(var11, var15)) * 180.0F / (float)Math.PI;
+ if(this.canEntityBeSeen(this.targetedEntity)) {
+ if(this.attackCounter == 10) {
+ this.worldObj.playSoundAtEntity(this, "mob.ghast.charge", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ ++this.attackCounter;
+ if(this.attackCounter == 20) {
+ this.worldObj.playSoundAtEntity(this, "mob.ghast.fireball", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ EntityFireball var17 = new EntityFireball(this.worldObj, this, var11, var13, var15);
+ double var18 = 4.0D;
+ Vec3D var20 = this.getLook(1.0F);
+ var17.posX = this.posX + var20.xCoord * var18;
+ var17.posY = this.posY + (double)(this.height / 2.0F) + 0.5D;
+ var17.posZ = this.posZ + var20.zCoord * var18;
+ this.worldObj.entityJoinedWorld(var17);
+ this.attackCounter = -40;
+ }
+ } else if(this.attackCounter > 0) {
+ --this.attackCounter;
+ }
+ } else {
+ this.renderYawOffset = this.rotationYaw = -((float)Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float)Math.PI;
+ if(this.attackCounter > 0) {
+ --this.attackCounter;
+ }
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ byte var21 = this.dataWatcher.getWatchableObjectByte(16);
+ byte var12 = (byte)(this.attackCounter > 10 ? 1 : 0);
+ if(var21 != var12) {
+ this.dataWatcher.updateObject(16, Byte.valueOf(var12));
+ }
+ }
+
+ }
+
+ private boolean isCourseTraversable(double var1, double var3, double var5, double var7) {
+ double var9 = (this.waypointX - this.posX) / var7;
+ double var11 = (this.waypointY - this.posY) / var7;
+ double var13 = (this.waypointZ - this.posZ) / var7;
+ AxisAlignedBB var15 = this.boundingBox.copy();
+
+ for(int var16 = 1; (double)var16 < var7; ++var16) {
+ var15.offset(var9, var11, var13);
+ if(this.worldObj.getCollidingBoundingBoxes(this, var15).size() > 0) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected String getLivingSound() {
+ return "mob.ghast.moan";
+ }
+
+ protected String getHurtSound() {
+ return "mob.ghast.scream";
+ }
+
+ protected String getDeathSound() {
+ return "mob.ghast.death";
+ }
+
+ protected int getDropItemId() {
+ return Item.gunpowder.shiftedIndex;
+ }
+
+ protected float getSoundVolume() {
+ return 10.0F;
+ }
+
+ public boolean getCanSpawnHere() {
+ return this.rand.nextInt(20) == 0 && super.getCanSpawnHere() && this.worldObj.difficultySetting > 0;
+ }
+
+ public int getMaxSpawnedInChunk() {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/EntityGiantZombie.java b/src/net/minecraft/src/EntityGiantZombie.java
new file mode 100644
index 0000000..8ed011e
--- /dev/null
+++ b/src/net/minecraft/src/EntityGiantZombie.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class EntityGiantZombie extends EntityMob {
+ public EntityGiantZombie(World var1) {
+ super(var1);
+ this.texture = "/mob/zombie.png";
+ this.moveSpeed = 0.5F;
+ this.attackStrength = 50;
+ this.health *= 10;
+ this.yOffset *= 6.0F;
+ this.setSize(this.width * 6.0F, this.height * 6.0F);
+ }
+
+ protected float getBlockPathWeight(int var1, int var2, int var3) {
+ return this.worldObj.getLightBrightness(var1, var2, var3) - 0.5F;
+ }
+}
diff --git a/src/net/minecraft/src/EntityItem.java b/src/net/minecraft/src/EntityItem.java
new file mode 100644
index 0000000..218309b
--- /dev/null
+++ b/src/net/minecraft/src/EntityItem.java
@@ -0,0 +1,131 @@
+package net.minecraft.src;
+
+public class EntityItem extends Entity {
+ public ItemStack item;
+ private int field_9170_e;
+ public int age = 0;
+ public int delayBeforeCanPickup;
+ private int health = 5;
+ public float field_432_ae = (float)(Math.random() * Math.PI * 2.0D);
+
+ public EntityItem(World var1, double var2, double var4, double var6, ItemStack var8) {
+ super(var1);
+ this.setSize(0.25F, 0.25F);
+ this.yOffset = this.height / 2.0F;
+ this.setPosition(var2, var4, var6);
+ this.item = var8;
+ this.rotationYaw = (float)(Math.random() * 360.0D);
+ this.motionX = (double)((float)(Math.random() * (double)0.2F - (double)0.1F));
+ this.motionY = (double)0.2F;
+ this.motionZ = (double)((float)(Math.random() * (double)0.2F - (double)0.1F));
+ }
+
+ protected boolean func_25017_l() {
+ return false;
+ }
+
+ public EntityItem(World var1) {
+ super(var1);
+ this.setSize(0.25F, 0.25F);
+ this.yOffset = this.height / 2.0F;
+ }
+
+ protected void entityInit() {
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.delayBeforeCanPickup > 0) {
+ --this.delayBeforeCanPickup;
+ }
+
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY -= (double)0.04F;
+ if(this.worldObj.getBlockMaterial(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) == Material.lava) {
+ this.motionY = (double)0.2F;
+ this.motionX = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F);
+ this.motionZ = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F);
+ this.worldObj.playSoundAtEntity(this, "random.fizz", 0.4F, 2.0F + this.rand.nextFloat() * 0.4F);
+ }
+
+ this.func_28005_g(this.posX, (this.boundingBox.minY + this.boundingBox.maxY) / 2.0D, this.posZ);
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ float var1 = 0.98F;
+ if(this.onGround) {
+ var1 = 0.1F * 0.1F * 58.8F;
+ int var2 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var2 > 0) {
+ var1 = Block.blocksList[var2].slipperiness * 0.98F;
+ }
+ }
+
+ this.motionX *= (double)var1;
+ this.motionY *= (double)0.98F;
+ this.motionZ *= (double)var1;
+ if(this.onGround) {
+ this.motionY *= -0.5D;
+ }
+
+ ++this.field_9170_e;
+ ++this.age;
+ if(this.age >= 6000) {
+ this.setEntityDead();
+ }
+
+ }
+
+ public boolean handleWaterMovement() {
+ return this.worldObj.handleMaterialAcceleration(this.boundingBox, Material.water, this);
+ }
+
+ protected void dealFireDamage(int var1) {
+ this.attackEntityFrom((Entity)null, var1);
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ this.setBeenAttacked();
+ this.health -= var2;
+ if(this.health <= 0) {
+ this.setEntityDead();
+ }
+
+ return false;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("Health", (short)((byte)this.health));
+ var1.setShort("Age", (short)this.age);
+ var1.setCompoundTag("Item", this.item.writeToNBT(new NBTTagCompound()));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.health = var1.getShort("Health") & 255;
+ this.age = var1.getShort("Age");
+ NBTTagCompound var2 = var1.getCompoundTag("Item");
+ this.item = new ItemStack(var2);
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ if(!this.worldObj.singleplayerWorld) {
+ int var2 = this.item.stackSize;
+ if(this.delayBeforeCanPickup == 0 && var1.inventory.addItemStackToInventory(this.item)) {
+ if(this.item.itemID == Block.wood.blockID) {
+ var1.func_27017_a(AchievementList.field_25131_c);
+ }
+
+ if(this.item.itemID == Item.leather.shiftedIndex) {
+ var1.func_27017_a(AchievementList.field_27099_t);
+ }
+
+ this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
+ var1.onItemPickup(this, var2);
+ if(this.item.stackSize <= 0) {
+ this.setEntityDead();
+ }
+ }
+
+ }
+ }
+}
diff --git a/src/net/minecraft/src/EntityLightningBolt.java b/src/net/minecraft/src/EntityLightningBolt.java
new file mode 100644
index 0000000..8a408de
--- /dev/null
+++ b/src/net/minecraft/src/EntityLightningBolt.java
@@ -0,0 +1,84 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityLightningBolt extends EntityWeatherEffect {
+ private int field_27018_b;
+ public long field_27019_a = 0L;
+ private int field_27020_c;
+
+ public EntityLightningBolt(World var1, double var2, double var4, double var6) {
+ super(var1);
+ this.setLocationAndAngles(var2, var4, var6, 0.0F, 0.0F);
+ this.field_27018_b = 2;
+ this.field_27019_a = this.rand.nextLong();
+ this.field_27020_c = this.rand.nextInt(3) + 1;
+ if(var1.difficultySetting >= 2 && var1.doChunksNearChunkExist(MathHelper.floor_double(var2), MathHelper.floor_double(var4), MathHelper.floor_double(var6), 10)) {
+ int var8 = MathHelper.floor_double(var2);
+ int var9 = MathHelper.floor_double(var4);
+ int var10 = MathHelper.floor_double(var6);
+ if(var1.getBlockId(var8, var9, var10) == 0 && Block.fire.canPlaceBlockAt(var1, var8, var9, var10)) {
+ var1.setBlockWithNotify(var8, var9, var10, Block.fire.blockID);
+ }
+
+ for(var8 = 0; var8 < 4; ++var8) {
+ var9 = MathHelper.floor_double(var2) + this.rand.nextInt(3) - 1;
+ var10 = MathHelper.floor_double(var4) + this.rand.nextInt(3) - 1;
+ int var11 = MathHelper.floor_double(var6) + this.rand.nextInt(3) - 1;
+ if(var1.getBlockId(var9, var10, var11) == 0 && Block.fire.canPlaceBlockAt(var1, var9, var10, var11)) {
+ var1.setBlockWithNotify(var9, var10, var11, Block.fire.blockID);
+ }
+ }
+ }
+
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.field_27018_b == 2) {
+ this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.rand.nextFloat() * 0.2F);
+ this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "random.explode", 2.0F, 0.5F + this.rand.nextFloat() * 0.2F);
+ }
+
+ --this.field_27018_b;
+ if(this.field_27018_b < 0) {
+ if(this.field_27020_c == 0) {
+ this.setEntityDead();
+ } else if(this.field_27018_b < -this.rand.nextInt(10)) {
+ --this.field_27020_c;
+ this.field_27018_b = 1;
+ this.field_27019_a = this.rand.nextLong();
+ if(this.worldObj.doChunksNearChunkExist(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ), 10)) {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.posY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ if(this.worldObj.getBlockId(var1, var2, var3) == 0 && Block.fire.canPlaceBlockAt(this.worldObj, var1, var2, var3)) {
+ this.worldObj.setBlockWithNotify(var1, var2, var3, Block.fire.blockID);
+ }
+ }
+ }
+ }
+
+ if(this.field_27018_b >= 0) {
+ double var6 = 3.0D;
+ List var7 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, AxisAlignedBB.getBoundingBoxFromPool(this.posX - var6, this.posY - var6, this.posZ - var6, this.posX + var6, this.posY + 6.0D + var6, this.posZ + var6));
+
+ for(int var4 = 0; var4 < var7.size(); ++var4) {
+ Entity var5 = (Entity)var7.get(var4);
+ var5.onStruckByLightning(this);
+ }
+
+ this.worldObj.field_27080_i = 2;
+ }
+
+ }
+
+ protected void entityInit() {
+ }
+
+ protected void readEntityFromNBT(NBTTagCompound var1) {
+ }
+
+ protected void writeEntityToNBT(NBTTagCompound var1) {
+ }
+}
diff --git a/src/net/minecraft/src/EntityList.java b/src/net/minecraft/src/EntityList.java
new file mode 100644
index 0000000..18b0316
--- /dev/null
+++ b/src/net/minecraft/src/EntityList.java
@@ -0,0 +1,89 @@
+package net.minecraft.src;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class EntityList {
+ private static Map stringToClassMapping = new HashMap();
+ private static Map classToStringMapping = new HashMap();
+ private static Map IDtoClassMapping = new HashMap();
+ private static Map classToIDMapping = new HashMap();
+
+ private static void addMapping(Class var0, String var1, int var2) {
+ stringToClassMapping.put(var1, var0);
+ classToStringMapping.put(var0, var1);
+ IDtoClassMapping.put(Integer.valueOf(var2), var0);
+ classToIDMapping.put(var0, Integer.valueOf(var2));
+ }
+
+ public static Entity createEntityInWorld(String var0, World var1) {
+ Entity var2 = null;
+
+ try {
+ Class var3 = (Class)stringToClassMapping.get(var0);
+ if(var3 != null) {
+ var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
+ }
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ }
+
+ return var2;
+ }
+
+ public static Entity createEntityFromNBT(NBTTagCompound var0, World var1) {
+ Entity var2 = null;
+
+ try {
+ Class var3 = (Class)stringToClassMapping.get(var0.getString("id"));
+ if(var3 != null) {
+ var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
+ }
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ }
+
+ if(var2 != null) {
+ var2.readFromNBT(var0);
+ } else {
+ System.out.println("Skipping Entity with id " + var0.getString("id"));
+ }
+
+ return var2;
+ }
+
+ public static int getEntityID(Entity var0) {
+ return ((Integer)classToIDMapping.get(var0.getClass())).intValue();
+ }
+
+ public static String getEntityString(Entity var0) {
+ return (String)classToStringMapping.get(var0.getClass());
+ }
+
+ static {
+ addMapping(EntityArrow.class, "Arrow", 10);
+ addMapping(EntitySnowball.class, "Snowball", 11);
+ addMapping(EntityItem.class, "Item", 1);
+ addMapping(EntityPainting.class, "Painting", 9);
+ addMapping(EntityLiving.class, "Mob", 48);
+ addMapping(EntityMob.class, "Monster", 49);
+ addMapping(EntityCreeper.class, "Creeper", 50);
+ addMapping(EntitySkeleton.class, "Skeleton", 51);
+ addMapping(EntitySpider.class, "Spider", 52);
+ addMapping(EntityGiantZombie.class, "Giant", 53);
+ addMapping(EntityZombie.class, "Zombie", 54);
+ addMapping(EntitySlime.class, "Slime", 55);
+ addMapping(EntityGhast.class, "Ghast", 56);
+ addMapping(EntityPigZombie.class, "PigZombie", 57);
+ addMapping(EntityPig.class, "Pig", 90);
+ addMapping(EntitySheep.class, "Sheep", 91);
+ addMapping(EntityCow.class, "Cow", 92);
+ addMapping(EntityChicken.class, "Chicken", 93);
+ addMapping(EntitySquid.class, "Squid", 94);
+ addMapping(EntityWolf.class, "Wolf", 95);
+ addMapping(EntityTNTPrimed.class, "PrimedTnt", 20);
+ addMapping(EntityFallingSand.class, "FallingSand", 21);
+ addMapping(EntityMinecart.class, "Minecart", 40);
+ addMapping(EntityBoat.class, "Boat", 41);
+ }
+}
diff --git a/src/net/minecraft/src/EntityLiving.java b/src/net/minecraft/src/EntityLiving.java
new file mode 100644
index 0000000..33b93ee
--- /dev/null
+++ b/src/net/minecraft/src/EntityLiving.java
@@ -0,0 +1,803 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public abstract class EntityLiving extends Entity {
+ public int field_9099_av = 20;
+ public float field_9098_aw;
+ public float field_9096_ay;
+ public float renderYawOffset = 0.0F;
+ public float prevRenderYawOffset = 0.0F;
+ protected float field_9124_aB;
+ protected float field_9123_aC;
+ protected float field_9122_aD;
+ protected float field_9121_aE;
+ protected boolean field_9120_aF = true;
+ protected String texture = "/mob/char.png";
+ protected boolean field_9118_aH = true;
+ protected float field_9117_aI = 0.0F;
+ protected String entityType = null;
+ protected float field_9115_aK = 1.0F;
+ protected int scoreValue = 0;
+ protected float field_9113_aM = 0.0F;
+ public boolean isMultiplayerEntity = false;
+ public float prevSwingProgress;
+ public float swingProgress;
+ public int health = 10;
+ public int prevHealth;
+ private int livingSoundTime;
+ public int hurtTime;
+ public int maxHurtTime;
+ public float attackedAtYaw = 0.0F;
+ public int deathTime = 0;
+ public int attackTime = 0;
+ public float field_9102_aX;
+ public float field_9101_aY;
+ protected boolean unused_flag = false;
+ public int field_9144_ba = -1;
+ public float field_9143_bb = (float)(Math.random() * (double)0.9F + (double)0.1F);
+ public float field_9142_bc;
+ public float field_9141_bd;
+ public float field_386_ba;
+ protected int field_9140_bf;
+ protected double field_9139_bg;
+ protected double field_9138_bh;
+ protected double field_9137_bi;
+ protected double field_9136_bj;
+ protected double field_9135_bk;
+ float field_9134_bl = 0.0F;
+ protected int field_9133_bm = 0;
+ protected int age = 0;
+ protected float moveStrafing;
+ protected float moveForward;
+ protected float randomYawVelocity;
+ protected boolean isJumping = false;
+ protected float defaultPitch = 0.0F;
+ protected float moveSpeed = 0.7F;
+ private Entity currentTarget;
+ protected int numTicksToChaseTarget = 0;
+
+ public EntityLiving(World var1) {
+ super(var1);
+ this.preventEntitySpawning = true;
+ this.field_9096_ay = (float)(Math.random() + 1.0D) * 0.01F;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.field_9098_aw = (float)Math.random() * 12398.0F;
+ this.rotationYaw = (float)(Math.random() * (double)((float)Math.PI) * 2.0D);
+ this.stepHeight = 0.5F;
+ }
+
+ protected void entityInit() {
+ }
+
+ public boolean canEntityBeSeen(Entity var1) {
+ return this.worldObj.rayTraceBlocks(Vec3D.createVector(this.posX, this.posY + (double)this.getEyeHeight(), this.posZ), Vec3D.createVector(var1.posX, var1.posY + (double)var1.getEyeHeight(), var1.posZ)) == null;
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public boolean canBePushed() {
+ return !this.isDead;
+ }
+
+ public float getEyeHeight() {
+ return this.height * 0.85F;
+ }
+
+ public int getTalkInterval() {
+ return 80;
+ }
+
+ public void playLivingSound() {
+ String var1 = this.getLivingSound();
+ if(var1 != null) {
+ this.worldObj.playSoundAtEntity(this, var1, this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ }
+
+ public void onEntityUpdate() {
+ this.prevSwingProgress = this.swingProgress;
+ super.onEntityUpdate();
+ if(this.rand.nextInt(1000) < this.livingSoundTime++) {
+ this.livingSoundTime = -this.getTalkInterval();
+ this.playLivingSound();
+ }
+
+ if(this.isEntityAlive() && this.isEntityInsideOpaqueBlock()) {
+ this.attackEntityFrom((Entity)null, 1);
+ }
+
+ if(this.isImmuneToFire || this.worldObj.singleplayerWorld) {
+ this.fire = 0;
+ }
+
+ int var1;
+ if(this.isEntityAlive() && this.isInsideOfMaterial(Material.water) && !this.canBreatheUnderwater()) {
+ --this.air;
+ if(this.air == -20) {
+ this.air = 0;
+
+ for(var1 = 0; var1 < 8; ++var1) {
+ float var2 = this.rand.nextFloat() - this.rand.nextFloat();
+ float var3 = this.rand.nextFloat() - this.rand.nextFloat();
+ float var4 = this.rand.nextFloat() - this.rand.nextFloat();
+ this.worldObj.spawnParticle("bubble", this.posX + (double)var2, this.posY + (double)var3, this.posZ + (double)var4, this.motionX, this.motionY, this.motionZ);
+ }
+
+ this.attackEntityFrom((Entity)null, 2);
+ }
+
+ this.fire = 0;
+ } else {
+ this.air = this.maxAir;
+ }
+
+ this.field_9102_aX = this.field_9101_aY;
+ if(this.attackTime > 0) {
+ --this.attackTime;
+ }
+
+ if(this.hurtTime > 0) {
+ --this.hurtTime;
+ }
+
+ if(this.field_9083_ac > 0) {
+ --this.field_9083_ac;
+ }
+
+ if(this.health <= 0) {
+ ++this.deathTime;
+ if(this.deathTime > 20) {
+ this.func_6101_K();
+ this.setEntityDead();
+
+ for(var1 = 0; var1 < 20; ++var1) {
+ double var8 = this.rand.nextGaussian() * 0.02D;
+ double var9 = this.rand.nextGaussian() * 0.02D;
+ double var6 = this.rand.nextGaussian() * 0.02D;
+ this.worldObj.spawnParticle("explode", this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, this.posY + (double)(this.rand.nextFloat() * this.height), this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, var8, var9, var6);
+ }
+ }
+ }
+
+ this.field_9121_aE = this.field_9122_aD;
+ this.prevRenderYawOffset = this.renderYawOffset;
+ this.prevRotationYaw = this.rotationYaw;
+ this.prevRotationPitch = this.rotationPitch;
+ }
+
+ public void spawnExplosionParticle() {
+ for(int var1 = 0; var1 < 20; ++var1) {
+ double var2 = this.rand.nextGaussian() * 0.02D;
+ double var4 = this.rand.nextGaussian() * 0.02D;
+ double var6 = this.rand.nextGaussian() * 0.02D;
+ double var8 = 10.0D;
+ this.worldObj.spawnParticle("explode", this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width - var2 * var8, this.posY + (double)(this.rand.nextFloat() * this.height) - var4 * var8, this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width - var6 * var8, var2, var4, var6);
+ }
+
+ }
+
+ public void updateRidden() {
+ super.updateRidden();
+ this.field_9124_aB = this.field_9123_aC;
+ this.field_9123_aC = 0.0F;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ this.onLivingUpdate();
+ double var1 = this.posX - this.prevPosX;
+ double var3 = this.posZ - this.prevPosZ;
+ float var5 = MathHelper.sqrt_double(var1 * var1 + var3 * var3);
+ float var6 = this.renderYawOffset;
+ float var7 = 0.0F;
+ this.field_9124_aB = this.field_9123_aC;
+ float var8 = 0.0F;
+ if(var5 > 0.05F) {
+ var8 = 1.0F;
+ var7 = var5 * 3.0F;
+ var6 = (float)Math.atan2(var3, var1) * 180.0F / (float)Math.PI - 90.0F;
+ }
+
+ if(this.swingProgress > 0.0F) {
+ var6 = this.rotationYaw;
+ }
+
+ if(!this.onGround) {
+ var8 = 0.0F;
+ }
+
+ this.field_9123_aC += (var8 - this.field_9123_aC) * 0.3F;
+
+ float var9;
+ for(var9 = var6 - this.renderYawOffset; var9 < -180.0F; var9 += 360.0F) {
+ }
+
+ while(var9 >= 180.0F) {
+ var9 -= 360.0F;
+ }
+
+ this.renderYawOffset += var9 * 0.3F;
+
+ float var10;
+ for(var10 = this.rotationYaw - this.renderYawOffset; var10 < -180.0F; var10 += 360.0F) {
+ }
+
+ while(var10 >= 180.0F) {
+ var10 -= 360.0F;
+ }
+
+ boolean var11 = var10 < -90.0F || var10 >= 90.0F;
+ if(var10 < -75.0F) {
+ var10 = -75.0F;
+ }
+
+ if(var10 >= 75.0F) {
+ var10 = 75.0F;
+ }
+
+ this.renderYawOffset = this.rotationYaw - var10;
+ if(var10 * var10 > 2500.0F) {
+ this.renderYawOffset += var10 * 0.2F;
+ }
+
+ if(var11) {
+ var7 *= -1.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ while(this.renderYawOffset - this.prevRenderYawOffset < -180.0F) {
+ this.prevRenderYawOffset -= 360.0F;
+ }
+
+ while(this.renderYawOffset - this.prevRenderYawOffset >= 180.0F) {
+ this.prevRenderYawOffset += 360.0F;
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch < -180.0F) {
+ this.prevRotationPitch -= 360.0F;
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ this.field_9122_aD += var7;
+ }
+
+ protected void setSize(float var1, float var2) {
+ super.setSize(var1, var2);
+ }
+
+ public void heal(int var1) {
+ if(this.health > 0) {
+ this.health += var1;
+ if(this.health > 20) {
+ this.health = 20;
+ }
+
+ this.field_9083_ac = this.field_9099_av / 2;
+ }
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ if(this.worldObj.singleplayerWorld) {
+ return false;
+ } else {
+ this.age = 0;
+ if(this.health <= 0) {
+ return false;
+ } else {
+ this.field_9141_bd = 1.5F;
+ boolean var3 = true;
+ if((float)this.field_9083_ac > (float)this.field_9099_av / 2.0F) {
+ if(var2 <= this.field_9133_bm) {
+ return false;
+ }
+
+ this.damageEntity(var2 - this.field_9133_bm);
+ this.field_9133_bm = var2;
+ var3 = false;
+ } else {
+ this.field_9133_bm = var2;
+ this.prevHealth = this.health;
+ this.field_9083_ac = this.field_9099_av;
+ this.damageEntity(var2);
+ this.hurtTime = this.maxHurtTime = 10;
+ }
+
+ this.attackedAtYaw = 0.0F;
+ if(var3) {
+ this.worldObj.sendTrackedEntityStatusUpdatePacket(this, (byte)2);
+ this.setBeenAttacked();
+ if(var1 != null) {
+ double var4 = var1.posX - this.posX;
+
+ double var6;
+ for(var6 = var1.posZ - this.posZ; var4 * var4 + var6 * var6 < 1.0E-4D; var6 = (Math.random() - Math.random()) * 0.01D) {
+ var4 = (Math.random() - Math.random()) * 0.01D;
+ }
+
+ this.attackedAtYaw = (float)(Math.atan2(var6, var4) * 180.0D / (double)((float)Math.PI)) - this.rotationYaw;
+ this.knockBack(var1, var2, var4, var6);
+ } else {
+ this.attackedAtYaw = (float)((int)(Math.random() * 2.0D) * 180);
+ }
+ }
+
+ if(this.health <= 0) {
+ if(var3) {
+ this.worldObj.playSoundAtEntity(this, this.getDeathSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ this.onDeath(var1);
+ } else if(var3) {
+ this.worldObj.playSoundAtEntity(this, this.getHurtSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ return true;
+ }
+ }
+ }
+
+ protected void damageEntity(int var1) {
+ this.health -= var1;
+ }
+
+ protected float getSoundVolume() {
+ return 1.0F;
+ }
+
+ protected String getLivingSound() {
+ return null;
+ }
+
+ protected String getHurtSound() {
+ return "random.hurt";
+ }
+
+ protected String getDeathSound() {
+ return "random.hurt";
+ }
+
+ public void knockBack(Entity var1, int var2, double var3, double var5) {
+ float var7 = MathHelper.sqrt_double(var3 * var3 + var5 * var5);
+ float var8 = 0.4F;
+ this.motionX /= 2.0D;
+ this.motionY /= 2.0D;
+ this.motionZ /= 2.0D;
+ this.motionX -= var3 / (double)var7 * (double)var8;
+ this.motionY += (double)0.4F;
+ this.motionZ -= var5 / (double)var7 * (double)var8;
+ if(this.motionY > (double)0.4F) {
+ this.motionY = (double)0.4F;
+ }
+
+ }
+
+ public void onDeath(Entity var1) {
+ if(this.scoreValue >= 0 && var1 != null) {
+ var1.addToPlayerScore(this, this.scoreValue);
+ }
+
+ if(var1 != null) {
+ var1.func_27010_a(this);
+ }
+
+ this.unused_flag = true;
+ if(!this.worldObj.singleplayerWorld) {
+ this.dropFewItems();
+ }
+
+ this.worldObj.sendTrackedEntityStatusUpdatePacket(this, (byte)3);
+ }
+
+ protected void dropFewItems() {
+ int var1 = this.getDropItemId();
+ if(var1 > 0) {
+ int var2 = this.rand.nextInt(3);
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ this.dropItem(var1, 1);
+ }
+ }
+
+ }
+
+ protected int getDropItemId() {
+ return 0;
+ }
+
+ protected void fall(float var1) {
+ super.fall(var1);
+ int var2 = (int)Math.ceil((double)(var1 - 3.0F));
+ if(var2 > 0) {
+ this.attackEntityFrom((Entity)null, var2);
+ int var3 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY - (double)0.2F - (double)this.yOffset), MathHelper.floor_double(this.posZ));
+ if(var3 > 0) {
+ StepSound var4 = Block.blocksList[var3].stepSound;
+ this.worldObj.playSoundAtEntity(this, var4.func_737_c(), var4.getVolume() * 0.5F, var4.getPitch() * (12.0F / 16.0F));
+ }
+ }
+
+ }
+
+ public void moveEntityWithHeading(float var1, float var2) {
+ double var3;
+ if(this.isInWater()) {
+ var3 = this.posY;
+ this.moveFlying(var1, var2, 0.02F);
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.8F;
+ this.motionY *= (double)0.8F;
+ this.motionZ *= (double)0.8F;
+ this.motionY -= 0.02D;
+ if(this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, this.motionY + (double)0.6F - this.posY + var3, this.motionZ)) {
+ this.motionY = (double)0.3F;
+ }
+ } else if(this.handleLavaMovement()) {
+ var3 = this.posY;
+ this.moveFlying(var1, var2, 0.02F);
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= 0.5D;
+ this.motionY *= 0.5D;
+ this.motionZ *= 0.5D;
+ this.motionY -= 0.02D;
+ if(this.isCollidedHorizontally && this.isOffsetPositionInLiquid(this.motionX, this.motionY + (double)0.6F - this.posY + var3, this.motionZ)) {
+ this.motionY = (double)0.3F;
+ }
+ } else {
+ float var8 = 0.91F;
+ if(this.onGround) {
+ var8 = 546.0F * 0.1F * 0.1F * 0.1F;
+ int var4 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var4 > 0) {
+ var8 = Block.blocksList[var4].slipperiness * 0.91F;
+ }
+ }
+
+ float var9 = 0.16277136F / (var8 * var8 * var8);
+ this.moveFlying(var1, var2, this.onGround ? 0.1F * var9 : 0.02F);
+ var8 = 0.91F;
+ if(this.onGround) {
+ var8 = 546.0F * 0.1F * 0.1F * 0.1F;
+ int var5 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var5 > 0) {
+ var8 = Block.blocksList[var5].slipperiness * 0.91F;
+ }
+ }
+
+ if(this.isOnLadder()) {
+ float var10 = 0.15F;
+ if(this.motionX < (double)(-var10)) {
+ this.motionX = (double)(-var10);
+ }
+
+ if(this.motionX > (double)var10) {
+ this.motionX = (double)var10;
+ }
+
+ if(this.motionZ < (double)(-var10)) {
+ this.motionZ = (double)(-var10);
+ }
+
+ if(this.motionZ > (double)var10) {
+ this.motionZ = (double)var10;
+ }
+
+ this.fallDistance = 0.0F;
+ if(this.motionY < -0.15D) {
+ this.motionY = -0.15D;
+ }
+
+ if(this.isSneaking() && this.motionY < 0.0D) {
+ this.motionY = 0.0D;
+ }
+ }
+
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ if(this.isCollidedHorizontally && this.isOnLadder()) {
+ this.motionY = 0.2D;
+ }
+
+ this.motionY -= 0.08D;
+ this.motionY *= (double)0.98F;
+ this.motionX *= (double)var8;
+ this.motionZ *= (double)var8;
+ }
+
+ this.field_9142_bc = this.field_9141_bd;
+ var3 = this.posX - this.prevPosX;
+ double var11 = this.posZ - this.prevPosZ;
+ float var7 = MathHelper.sqrt_double(var3 * var3 + var11 * var11) * 4.0F;
+ if(var7 > 1.0F) {
+ var7 = 1.0F;
+ }
+
+ this.field_9141_bd += (var7 - this.field_9141_bd) * 0.4F;
+ this.field_386_ba += this.field_9141_bd;
+ }
+
+ public boolean isOnLadder() {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.boundingBox.minY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ return this.worldObj.getBlockId(var1, var2, var3) == Block.ladder.blockID;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("Health", (short)this.health);
+ var1.setShort("HurtTime", (short)this.hurtTime);
+ var1.setShort("DeathTime", (short)this.deathTime);
+ var1.setShort("AttackTime", (short)this.attackTime);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.health = var1.getShort("Health");
+ if(!var1.hasKey("Health")) {
+ this.health = 10;
+ }
+
+ this.hurtTime = var1.getShort("HurtTime");
+ this.deathTime = var1.getShort("DeathTime");
+ this.attackTime = var1.getShort("AttackTime");
+ }
+
+ public boolean isEntityAlive() {
+ return !this.isDead && this.health > 0;
+ }
+
+ public boolean canBreatheUnderwater() {
+ return false;
+ }
+
+ public void onLivingUpdate() {
+ if(this.field_9140_bf > 0) {
+ double var1 = this.posX + (this.field_9139_bg - this.posX) / (double)this.field_9140_bf;
+ double var3 = this.posY + (this.field_9138_bh - this.posY) / (double)this.field_9140_bf;
+ double var5 = this.posZ + (this.field_9137_bi - this.posZ) / (double)this.field_9140_bf;
+
+ double var7;
+ for(var7 = this.field_9136_bj - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D) {
+ }
+
+ while(var7 >= 180.0D) {
+ var7 -= 360.0D;
+ }
+
+ this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.field_9140_bf);
+ this.rotationPitch = (float)((double)this.rotationPitch + (this.field_9135_bk - (double)this.rotationPitch) / (double)this.field_9140_bf);
+ --this.field_9140_bf;
+ this.setPosition(var1, var3, var5);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ List var9 = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.getInsetBoundingBox(1.0D / 32.0D, 0.0D, 1.0D / 32.0D));
+ if(var9.size() > 0) {
+ double var10 = 0.0D;
+
+ for(int var12 = 0; var12 < var9.size(); ++var12) {
+ AxisAlignedBB var13 = (AxisAlignedBB)var9.get(var12);
+ if(var13.maxY > var10) {
+ var10 = var13.maxY;
+ }
+ }
+
+ var3 += var10 - this.boundingBox.minY;
+ this.setPosition(var1, var3, var5);
+ }
+ }
+
+ if(this.isMovementBlocked()) {
+ this.isJumping = false;
+ this.moveStrafing = 0.0F;
+ this.moveForward = 0.0F;
+ this.randomYawVelocity = 0.0F;
+ } else if(!this.isMultiplayerEntity) {
+ this.updatePlayerActionState();
+ }
+
+ boolean var14 = this.isInWater();
+ boolean var2 = this.handleLavaMovement();
+ if(this.isJumping) {
+ if(var14) {
+ this.motionY += (double)0.04F;
+ } else if(var2) {
+ this.motionY += (double)0.04F;
+ } else if(this.onGround) {
+ this.jump();
+ }
+ }
+
+ this.moveStrafing *= 0.98F;
+ this.moveForward *= 0.98F;
+ this.randomYawVelocity *= 0.9F;
+ this.moveEntityWithHeading(this.moveStrafing, this.moveForward);
+ List var15 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand((double)0.2F, 0.0D, (double)0.2F));
+ if(var15 != null && var15.size() > 0) {
+ for(int var4 = 0; var4 < var15.size(); ++var4) {
+ Entity var16 = (Entity)var15.get(var4);
+ if(var16.canBePushed()) {
+ var16.applyEntityCollision(this);
+ }
+ }
+ }
+
+ }
+
+ protected boolean isMovementBlocked() {
+ return this.health <= 0;
+ }
+
+ protected void jump() {
+ this.motionY = (double)0.42F;
+ }
+
+ protected boolean func_25020_s() {
+ return true;
+ }
+
+ protected void func_27013_Q() {
+ EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, -1.0D);
+ if(this.func_25020_s() && var1 != null) {
+ double var2 = var1.posX - this.posX;
+ double var4 = var1.posY - this.posY;
+ double var6 = var1.posZ - this.posZ;
+ double var8 = var2 * var2 + var4 * var4 + var6 * var6;
+ if(var8 > 16384.0D) {
+ this.setEntityDead();
+ }
+
+ if(this.age > 600 && this.rand.nextInt(800) == 0) {
+ if(var8 < 1024.0D) {
+ this.age = 0;
+ } else {
+ this.setEntityDead();
+ }
+ }
+ }
+
+ }
+
+ protected void updatePlayerActionState() {
+ ++this.age;
+ EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, -1.0D);
+ this.func_27013_Q();
+ this.moveStrafing = 0.0F;
+ this.moveForward = 0.0F;
+ float var2 = 8.0F;
+ if(this.rand.nextFloat() < 0.02F) {
+ var1 = this.worldObj.getClosestPlayerToEntity(this, (double)var2);
+ if(var1 != null) {
+ this.currentTarget = var1;
+ this.numTicksToChaseTarget = 10 + this.rand.nextInt(20);
+ } else {
+ this.randomYawVelocity = (this.rand.nextFloat() - 0.5F) * 20.0F;
+ }
+ }
+
+ if(this.currentTarget != null) {
+ this.faceEntity(this.currentTarget, 10.0F, (float)this.func_25018_n_());
+ if(this.numTicksToChaseTarget-- <= 0 || this.currentTarget.isDead || this.currentTarget.getDistanceSqToEntity(this) > (double)(var2 * var2)) {
+ this.currentTarget = null;
+ }
+ } else {
+ if(this.rand.nextFloat() < 0.05F) {
+ this.randomYawVelocity = (this.rand.nextFloat() - 0.5F) * 20.0F;
+ }
+
+ this.rotationYaw += this.randomYawVelocity;
+ this.rotationPitch = this.defaultPitch;
+ }
+
+ boolean var3 = this.isInWater();
+ boolean var4 = this.handleLavaMovement();
+ if(var3 || var4) {
+ this.isJumping = this.rand.nextFloat() < 0.8F;
+ }
+
+ }
+
+ protected int func_25018_n_() {
+ return 40;
+ }
+
+ public void faceEntity(Entity var1, float var2, float var3) {
+ double var4 = var1.posX - this.posX;
+ double var8 = var1.posZ - this.posZ;
+ double var6;
+ if(var1 instanceof EntityLiving) {
+ EntityLiving var10 = (EntityLiving)var1;
+ var6 = this.posY + (double)this.getEyeHeight() - (var10.posY + (double)var10.getEyeHeight());
+ } else {
+ var6 = (var1.boundingBox.minY + var1.boundingBox.maxY) / 2.0D - (this.posY + (double)this.getEyeHeight());
+ }
+
+ double var14 = (double)MathHelper.sqrt_double(var4 * var4 + var8 * var8);
+ float var12 = (float)(Math.atan2(var8, var4) * 180.0D / (double)((float)Math.PI)) - 90.0F;
+ float var13 = (float)(-(Math.atan2(var6, var14) * 180.0D / (double)((float)Math.PI)));
+ this.rotationPitch = -this.updateRotation(this.rotationPitch, var13, var3);
+ this.rotationYaw = this.updateRotation(this.rotationYaw, var12, var2);
+ }
+
+ public boolean func_25021_O() {
+ return this.currentTarget != null;
+ }
+
+ public Entity getCurrentTarget() {
+ return this.currentTarget;
+ }
+
+ private float updateRotation(float var1, float var2, float var3) {
+ float var4;
+ for(var4 = var2 - var1; var4 < -180.0F; var4 += 360.0F) {
+ }
+
+ while(var4 >= 180.0F) {
+ var4 -= 360.0F;
+ }
+
+ if(var4 > var3) {
+ var4 = var3;
+ }
+
+ if(var4 < -var3) {
+ var4 = -var3;
+ }
+
+ return var1 + var4;
+ }
+
+ public void func_6101_K() {
+ }
+
+ public boolean getCanSpawnHere() {
+ return this.worldObj.checkIfAABBIsClear(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() == 0 && !this.worldObj.getIsAnyLiquid(this.boundingBox);
+ }
+
+ protected void kill() {
+ this.attackEntityFrom((Entity)null, 4);
+ }
+
+ public Vec3D getLookVec() {
+ return this.getLook(1.0F);
+ }
+
+ public Vec3D getLook(float var1) {
+ float var2;
+ float var3;
+ float var4;
+ float var5;
+ if(var1 == 1.0F) {
+ var2 = MathHelper.cos(-this.rotationYaw * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ var3 = MathHelper.sin(-this.rotationYaw * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ var4 = -MathHelper.cos(-this.rotationPitch * ((float)Math.PI / 180.0F));
+ var5 = MathHelper.sin(-this.rotationPitch * ((float)Math.PI / 180.0F));
+ return Vec3D.createVector((double)(var3 * var4), (double)var5, (double)(var2 * var4));
+ } else {
+ var2 = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * var1;
+ var3 = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * var1;
+ var4 = MathHelper.cos(-var3 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ var5 = MathHelper.sin(-var3 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var6 = -MathHelper.cos(-var2 * ((float)Math.PI / 180.0F));
+ float var7 = MathHelper.sin(-var2 * ((float)Math.PI / 180.0F));
+ return Vec3D.createVector((double)(var5 * var6), (double)var7, (double)(var4 * var6));
+ }
+ }
+
+ public int getMaxSpawnedInChunk() {
+ return 4;
+ }
+
+ public boolean func_22057_E() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/EntityMinecart.java b/src/net/minecraft/src/EntityMinecart.java
new file mode 100644
index 0000000..3cf227a
--- /dev/null
+++ b/src/net/minecraft/src/EntityMinecart.java
@@ -0,0 +1,742 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityMinecart extends Entity implements IInventory {
+ private ItemStack[] cargoItems;
+ public int damageTaken;
+ public int field_9167_b;
+ public int forwardDirection;
+ private boolean field_469_aj;
+ public int minecartType;
+ public int fuel;
+ public double pushX;
+ public double pushZ;
+ private static final int[][][] field_468_ak = new int[][][]{{{0, 0, -1}, {0, 0, 1}}, {{-1, 0, 0}, {1, 0, 0}}, {{-1, -1, 0}, {1, 0, 0}}, {{-1, 0, 0}, {1, -1, 0}}, {{0, 0, -1}, {0, -1, 1}}, {{0, -1, -1}, {0, 0, 1}}, {{0, 0, 1}, {1, 0, 0}}, {{0, 0, 1}, {-1, 0, 0}}, {{0, 0, -1}, {-1, 0, 0}}, {{0, 0, -1}, {1, 0, 0}}};
+ private int field_9163_an;
+ private double field_9162_ao;
+ private double field_9161_ap;
+ private double field_9160_aq;
+ private double field_9159_ar;
+ private double field_9158_as;
+
+ public EntityMinecart(World var1) {
+ super(var1);
+ this.cargoItems = new ItemStack[36];
+ this.damageTaken = 0;
+ this.field_9167_b = 0;
+ this.forwardDirection = 1;
+ this.field_469_aj = false;
+ this.preventEntitySpawning = true;
+ this.setSize(0.98F, 0.7F);
+ this.yOffset = this.height / 2.0F;
+ }
+
+ protected boolean func_25017_l() {
+ return false;
+ }
+
+ protected void entityInit() {
+ }
+
+ public AxisAlignedBB func_89_d(Entity var1) {
+ return var1.boundingBox;
+ }
+
+ public AxisAlignedBB getBoundingBox() {
+ return null;
+ }
+
+ public boolean canBePushed() {
+ return true;
+ }
+
+ public EntityMinecart(World var1, double var2, double var4, double var6, int var8) {
+ this(var1);
+ this.setPosition(var2, var4 + (double)this.yOffset, var6);
+ this.motionX = 0.0D;
+ this.motionY = 0.0D;
+ this.motionZ = 0.0D;
+ this.prevPosX = var2;
+ this.prevPosY = var4;
+ this.prevPosZ = var6;
+ this.minecartType = var8;
+ }
+
+ public double getMountedYOffset() {
+ return (double)this.height * 0.0D - (double)0.3F;
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ if(!this.worldObj.singleplayerWorld && !this.isDead) {
+ this.forwardDirection = -this.forwardDirection;
+ this.field_9167_b = 10;
+ this.setBeenAttacked();
+ this.damageTaken += var2 * 10;
+ if(this.damageTaken > 40) {
+ if(this.riddenByEntity != null) {
+ this.riddenByEntity.mountEntity(this);
+ }
+
+ this.setEntityDead();
+ this.dropItemWithOffset(Item.minecartEmpty.shiftedIndex, 1, 0.0F);
+ if(this.minecartType == 1) {
+ EntityMinecart var3 = this;
+
+ for(int var4 = 0; var4 < var3.getSizeInventory(); ++var4) {
+ ItemStack var5 = var3.getStackInSlot(var4);
+ if(var5 != null) {
+ float var6 = this.rand.nextFloat() * 0.8F + 0.1F;
+ float var7 = this.rand.nextFloat() * 0.8F + 0.1F;
+ float var8 = this.rand.nextFloat() * 0.8F + 0.1F;
+
+ while(var5.stackSize > 0) {
+ int var9 = this.rand.nextInt(21) + 10;
+ if(var9 > var5.stackSize) {
+ var9 = var5.stackSize;
+ }
+
+ var5.stackSize -= var9;
+ EntityItem var10 = new EntityItem(this.worldObj, this.posX + (double)var6, this.posY + (double)var7, this.posZ + (double)var8, new ItemStack(var5.itemID, var9, var5.getItemDamage()));
+ float var11 = 0.05F;
+ var10.motionX = (double)((float)this.rand.nextGaussian() * var11);
+ var10.motionY = (double)((float)this.rand.nextGaussian() * var11 + 0.2F);
+ var10.motionZ = (double)((float)this.rand.nextGaussian() * var11);
+ this.worldObj.entityJoinedWorld(var10);
+ }
+ }
+ }
+
+ this.dropItemWithOffset(Block.chest.blockID, 1, 0.0F);
+ } else if(this.minecartType == 2) {
+ this.dropItemWithOffset(Block.stoneOvenIdle.blockID, 1, 0.0F);
+ }
+ }
+
+ return true;
+ } else {
+ return true;
+ }
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public void setEntityDead() {
+ for(int var1 = 0; var1 < this.getSizeInventory(); ++var1) {
+ ItemStack var2 = this.getStackInSlot(var1);
+ if(var2 != null) {
+ float var3 = this.rand.nextFloat() * 0.8F + 0.1F;
+ float var4 = this.rand.nextFloat() * 0.8F + 0.1F;
+ float var5 = this.rand.nextFloat() * 0.8F + 0.1F;
+
+ while(var2.stackSize > 0) {
+ int var6 = this.rand.nextInt(21) + 10;
+ if(var6 > var2.stackSize) {
+ var6 = var2.stackSize;
+ }
+
+ var2.stackSize -= var6;
+ EntityItem var7 = new EntityItem(this.worldObj, this.posX + (double)var3, this.posY + (double)var4, this.posZ + (double)var5, new ItemStack(var2.itemID, var6, var2.getItemDamage()));
+ float var8 = 0.05F;
+ var7.motionX = (double)((float)this.rand.nextGaussian() * var8);
+ var7.motionY = (double)((float)this.rand.nextGaussian() * var8 + 0.2F);
+ var7.motionZ = (double)((float)this.rand.nextGaussian() * var8);
+ this.worldObj.entityJoinedWorld(var7);
+ }
+ }
+ }
+
+ super.setEntityDead();
+ }
+
+ public void onUpdate() {
+ if(this.field_9167_b > 0) {
+ --this.field_9167_b;
+ }
+
+ if(this.damageTaken > 0) {
+ --this.damageTaken;
+ }
+
+ double var7;
+ if(this.worldObj.singleplayerWorld && this.field_9163_an > 0) {
+ if(this.field_9163_an > 0) {
+ double var46 = this.posX + (this.field_9162_ao - this.posX) / (double)this.field_9163_an;
+ double var47 = this.posY + (this.field_9161_ap - this.posY) / (double)this.field_9163_an;
+ double var5 = this.posZ + (this.field_9160_aq - this.posZ) / (double)this.field_9163_an;
+
+ for(var7 = this.field_9159_ar - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D) {
+ }
+
+ while(var7 >= 180.0D) {
+ var7 -= 360.0D;
+ }
+
+ this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.field_9163_an);
+ this.rotationPitch = (float)((double)this.rotationPitch + (this.field_9158_as - (double)this.rotationPitch) / (double)this.field_9163_an);
+ --this.field_9163_an;
+ this.setPosition(var46, var47, var5);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ } else {
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ }
+
+ } else {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY -= (double)0.04F;
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.posY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ if(BlockRail.func_27029_g(this.worldObj, var1, var2 - 1, var3)) {
+ --var2;
+ }
+
+ double var4 = 0.4D;
+ boolean var6 = false;
+ var7 = 1.0D / 128.0D;
+ int var9 = this.worldObj.getBlockId(var1, var2, var3);
+ if(BlockRail.func_27030_c(var9)) {
+ Vec3D var10 = this.func_182_g(this.posX, this.posY, this.posZ);
+ int var11 = this.worldObj.getBlockMetadata(var1, var2, var3);
+ this.posY = (double)var2;
+ boolean var12 = false;
+ boolean var13 = false;
+ if(var9 == Block.railPowered.blockID) {
+ var12 = (var11 & 8) != 0;
+ var13 = !var12;
+ }
+
+ if(((BlockRail)Block.blocksList[var9]).func_27028_d()) {
+ var11 &= 7;
+ }
+
+ if(var11 >= 2 && var11 <= 5) {
+ this.posY = (double)(var2 + 1);
+ }
+
+ if(var11 == 2) {
+ this.motionX -= var7;
+ }
+
+ if(var11 == 3) {
+ this.motionX += var7;
+ }
+
+ if(var11 == 4) {
+ this.motionZ += var7;
+ }
+
+ if(var11 == 5) {
+ this.motionZ -= var7;
+ }
+
+ int[][] var14 = field_468_ak[var11];
+ double var15 = (double)(var14[1][0] - var14[0][0]);
+ double var17 = (double)(var14[1][2] - var14[0][2]);
+ double var19 = Math.sqrt(var15 * var15 + var17 * var17);
+ double var21 = this.motionX * var15 + this.motionZ * var17;
+ if(var21 < 0.0D) {
+ var15 = -var15;
+ var17 = -var17;
+ }
+
+ double var23 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.motionX = var23 * var15 / var19;
+ this.motionZ = var23 * var17 / var19;
+ double var25;
+ if(var13) {
+ var25 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ if(var25 < 0.03D) {
+ this.motionX *= 0.0D;
+ this.motionY *= 0.0D;
+ this.motionZ *= 0.0D;
+ } else {
+ this.motionX *= 0.5D;
+ this.motionY *= 0.0D;
+ this.motionZ *= 0.5D;
+ }
+ }
+
+ var25 = 0.0D;
+ double var27 = (double)var1 + 0.5D + (double)var14[0][0] * 0.5D;
+ double var29 = (double)var3 + 0.5D + (double)var14[0][2] * 0.5D;
+ double var31 = (double)var1 + 0.5D + (double)var14[1][0] * 0.5D;
+ double var33 = (double)var3 + 0.5D + (double)var14[1][2] * 0.5D;
+ var15 = var31 - var27;
+ var17 = var33 - var29;
+ double var35;
+ double var37;
+ double var39;
+ if(var15 == 0.0D) {
+ this.posX = (double)var1 + 0.5D;
+ var25 = this.posZ - (double)var3;
+ } else if(var17 == 0.0D) {
+ this.posZ = (double)var3 + 0.5D;
+ var25 = this.posX - (double)var1;
+ } else {
+ var35 = this.posX - var27;
+ var37 = this.posZ - var29;
+ var39 = (var35 * var15 + var37 * var17) * 2.0D;
+ var25 = var39;
+ }
+
+ this.posX = var27 + var15 * var25;
+ this.posZ = var29 + var17 * var25;
+ this.setPosition(this.posX, this.posY + (double)this.yOffset, this.posZ);
+ var35 = this.motionX;
+ var37 = this.motionZ;
+ if(this.riddenByEntity != null) {
+ var35 *= 0.75D;
+ var37 *= 0.75D;
+ }
+
+ if(var35 < -var4) {
+ var35 = -var4;
+ }
+
+ if(var35 > var4) {
+ var35 = var4;
+ }
+
+ if(var37 < -var4) {
+ var37 = -var4;
+ }
+
+ if(var37 > var4) {
+ var37 = var4;
+ }
+
+ this.moveEntity(var35, 0.0D, var37);
+ if(var14[0][1] != 0 && MathHelper.floor_double(this.posX) - var1 == var14[0][0] && MathHelper.floor_double(this.posZ) - var3 == var14[0][2]) {
+ this.setPosition(this.posX, this.posY + (double)var14[0][1], this.posZ);
+ } else if(var14[1][1] != 0 && MathHelper.floor_double(this.posX) - var1 == var14[1][0] && MathHelper.floor_double(this.posZ) - var3 == var14[1][2]) {
+ this.setPosition(this.posX, this.posY + (double)var14[1][1], this.posZ);
+ }
+
+ if(this.riddenByEntity != null) {
+ this.motionX *= (double)0.997F;
+ this.motionY *= 0.0D;
+ this.motionZ *= (double)0.997F;
+ } else {
+ if(this.minecartType == 2) {
+ var39 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ);
+ if(var39 > 0.01D) {
+ var6 = true;
+ this.pushX /= var39;
+ this.pushZ /= var39;
+ double var41 = 0.04D;
+ this.motionX *= (double)0.8F;
+ this.motionY *= 0.0D;
+ this.motionZ *= (double)0.8F;
+ this.motionX += this.pushX * var41;
+ this.motionZ += this.pushZ * var41;
+ } else {
+ this.motionX *= (double)0.9F;
+ this.motionY *= 0.0D;
+ this.motionZ *= (double)0.9F;
+ }
+ }
+
+ this.motionX *= (double)0.96F;
+ this.motionY *= 0.0D;
+ this.motionZ *= (double)0.96F;
+ }
+
+ Vec3D var52 = this.func_182_g(this.posX, this.posY, this.posZ);
+ if(var52 != null && var10 != null) {
+ double var40 = (var10.yCoord - var52.yCoord) * 0.05D;
+ var23 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ if(var23 > 0.0D) {
+ this.motionX = this.motionX / var23 * (var23 + var40);
+ this.motionZ = this.motionZ / var23 * (var23 + var40);
+ }
+
+ this.setPosition(this.posX, var52.yCoord, this.posZ);
+ }
+
+ int var53 = MathHelper.floor_double(this.posX);
+ int var54 = MathHelper.floor_double(this.posZ);
+ if(var53 != var1 || var54 != var3) {
+ var23 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.motionX = var23 * (double)(var53 - var1);
+ this.motionZ = var23 * (double)(var54 - var3);
+ }
+
+ double var42;
+ if(this.minecartType == 2) {
+ var42 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ);
+ if(var42 > 0.01D && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.001D) {
+ this.pushX /= var42;
+ this.pushZ /= var42;
+ if(this.pushX * this.motionX + this.pushZ * this.motionZ < 0.0D) {
+ this.pushX = 0.0D;
+ this.pushZ = 0.0D;
+ } else {
+ this.pushX = this.motionX;
+ this.pushZ = this.motionZ;
+ }
+ }
+ }
+
+ if(var12) {
+ var42 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ if(var42 > 0.01D) {
+ double var44 = 0.06D;
+ this.motionX += this.motionX / var42 * var44;
+ this.motionZ += this.motionZ / var42 * var44;
+ } else if(var11 == 1) {
+ if(this.worldObj.isBlockNormalCube(var1 - 1, var2, var3)) {
+ this.motionX = 0.02D;
+ } else if(this.worldObj.isBlockNormalCube(var1 + 1, var2, var3)) {
+ this.motionX = -0.02D;
+ }
+ } else if(var11 == 0) {
+ if(this.worldObj.isBlockNormalCube(var1, var2, var3 - 1)) {
+ this.motionZ = 0.02D;
+ } else if(this.worldObj.isBlockNormalCube(var1, var2, var3 + 1)) {
+ this.motionZ = -0.02D;
+ }
+ }
+ }
+ } else {
+ if(this.motionX < -var4) {
+ this.motionX = -var4;
+ }
+
+ if(this.motionX > var4) {
+ this.motionX = var4;
+ }
+
+ if(this.motionZ < -var4) {
+ this.motionZ = -var4;
+ }
+
+ if(this.motionZ > var4) {
+ this.motionZ = var4;
+ }
+
+ if(this.onGround) {
+ this.motionX *= 0.5D;
+ this.motionY *= 0.5D;
+ this.motionZ *= 0.5D;
+ }
+
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ if(!this.onGround) {
+ this.motionX *= (double)0.95F;
+ this.motionY *= (double)0.95F;
+ this.motionZ *= (double)0.95F;
+ }
+ }
+
+ this.rotationPitch = 0.0F;
+ double var48 = this.prevPosX - this.posX;
+ double var49 = this.prevPosZ - this.posZ;
+ if(var48 * var48 + var49 * var49 > 0.001D) {
+ this.rotationYaw = (float)(Math.atan2(var49, var48) * 180.0D / Math.PI);
+ if(this.field_469_aj) {
+ this.rotationYaw += 180.0F;
+ }
+ }
+
+ double var50;
+ for(var50 = (double)(this.rotationYaw - this.prevRotationYaw); var50 >= 180.0D; var50 -= 360.0D) {
+ }
+
+ while(var50 < -180.0D) {
+ var50 += 360.0D;
+ }
+
+ if(var50 < -170.0D || var50 >= 170.0D) {
+ this.rotationYaw += 180.0F;
+ this.field_469_aj = !this.field_469_aj;
+ }
+
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ List var16 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand((double)0.2F, 0.0D, (double)0.2F));
+ if(var16 != null && var16.size() > 0) {
+ for(int var51 = 0; var51 < var16.size(); ++var51) {
+ Entity var18 = (Entity)var16.get(var51);
+ if(var18 != this.riddenByEntity && var18.canBePushed() && var18 instanceof EntityMinecart) {
+ var18.applyEntityCollision(this);
+ }
+ }
+ }
+
+ if(this.riddenByEntity != null && this.riddenByEntity.isDead) {
+ this.riddenByEntity = null;
+ }
+
+ if(var6 && this.rand.nextInt(4) == 0) {
+ --this.fuel;
+ if(this.fuel < 0) {
+ this.pushX = this.pushZ = 0.0D;
+ }
+
+ this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.8D, this.posZ, 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+ }
+
+ public Vec3D func_182_g(double var1, double var3, double var5) {
+ int var7 = MathHelper.floor_double(var1);
+ int var8 = MathHelper.floor_double(var3);
+ int var9 = MathHelper.floor_double(var5);
+ if(BlockRail.func_27029_g(this.worldObj, var7, var8 - 1, var9)) {
+ --var8;
+ }
+
+ int var10 = this.worldObj.getBlockId(var7, var8, var9);
+ if(BlockRail.func_27030_c(var10)) {
+ int var11 = this.worldObj.getBlockMetadata(var7, var8, var9);
+ var3 = (double)var8;
+ if(((BlockRail)Block.blocksList[var10]).func_27028_d()) {
+ var11 &= 7;
+ }
+
+ if(var11 >= 2 && var11 <= 5) {
+ var3 = (double)(var8 + 1);
+ }
+
+ int[][] var12 = field_468_ak[var11];
+ double var13 = 0.0D;
+ double var15 = (double)var7 + 0.5D + (double)var12[0][0] * 0.5D;
+ double var17 = (double)var8 + 0.5D + (double)var12[0][1] * 0.5D;
+ double var19 = (double)var9 + 0.5D + (double)var12[0][2] * 0.5D;
+ double var21 = (double)var7 + 0.5D + (double)var12[1][0] * 0.5D;
+ double var23 = (double)var8 + 0.5D + (double)var12[1][1] * 0.5D;
+ double var25 = (double)var9 + 0.5D + (double)var12[1][2] * 0.5D;
+ double var27 = var21 - var15;
+ double var29 = (var23 - var17) * 2.0D;
+ double var31 = var25 - var19;
+ if(var27 == 0.0D) {
+ var1 = (double)var7 + 0.5D;
+ var13 = var5 - (double)var9;
+ } else if(var31 == 0.0D) {
+ var5 = (double)var9 + 0.5D;
+ var13 = var1 - (double)var7;
+ } else {
+ double var33 = var1 - var15;
+ double var35 = var5 - var19;
+ double var37 = (var33 * var27 + var35 * var31) * 2.0D;
+ var13 = var37;
+ }
+
+ var1 = var15 + var27 * var13;
+ var3 = var17 + var29 * var13;
+ var5 = var19 + var31 * var13;
+ if(var29 < 0.0D) {
+ ++var3;
+ }
+
+ if(var29 > 0.0D) {
+ var3 += 0.5D;
+ }
+
+ return Vec3D.createVector(var1, var3, var5);
+ } else {
+ return null;
+ }
+ }
+
+ protected void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setInteger("Type", this.minecartType);
+ if(this.minecartType == 2) {
+ var1.setDouble("PushX", this.pushX);
+ var1.setDouble("PushZ", this.pushZ);
+ var1.setShort("Fuel", (short)this.fuel);
+ } else if(this.minecartType == 1) {
+ NBTTagList var2 = new NBTTagList();
+
+ for(int var3 = 0; var3 < this.cargoItems.length; ++var3) {
+ if(this.cargoItems[var3] != null) {
+ NBTTagCompound var4 = new NBTTagCompound();
+ var4.setByte("Slot", (byte)var3);
+ this.cargoItems[var3].writeToNBT(var4);
+ var2.setTag(var4);
+ }
+ }
+
+ var1.setTag("Items", var2);
+ }
+
+ }
+
+ protected void readEntityFromNBT(NBTTagCompound var1) {
+ this.minecartType = var1.getInteger("Type");
+ if(this.minecartType == 2) {
+ this.pushX = var1.getDouble("PushX");
+ this.pushZ = var1.getDouble("PushZ");
+ this.fuel = var1.getShort("Fuel");
+ } else if(this.minecartType == 1) {
+ NBTTagList var2 = var1.getTagList("Items");
+ this.cargoItems = new ItemStack[this.getSizeInventory()];
+
+ for(int var3 = 0; var3 < var2.tagCount(); ++var3) {
+ NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+ int var5 = var4.getByte("Slot") & 255;
+ if(var5 >= 0 && var5 < this.cargoItems.length) {
+ this.cargoItems[var5] = new ItemStack(var4);
+ }
+ }
+ }
+
+ }
+
+ public void applyEntityCollision(Entity var1) {
+ if(!this.worldObj.singleplayerWorld) {
+ if(var1 != this.riddenByEntity) {
+ if(var1 instanceof EntityLiving && !(var1 instanceof EntityPlayer) && this.minecartType == 0 && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.01D && this.riddenByEntity == null && var1.ridingEntity == null) {
+ var1.mountEntity(this);
+ }
+
+ double var2 = var1.posX - this.posX;
+ double var4 = var1.posZ - this.posZ;
+ double var6 = var2 * var2 + var4 * var4;
+ if(var6 >= (double)1.0E-4F) {
+ var6 = (double)MathHelper.sqrt_double(var6);
+ var2 /= var6;
+ var4 /= var6;
+ double var8 = 1.0D / var6;
+ if(var8 > 1.0D) {
+ var8 = 1.0D;
+ }
+
+ var2 *= var8;
+ var4 *= var8;
+ var2 *= (double)0.1F;
+ var4 *= (double)0.1F;
+ var2 *= (double)(1.0F - this.entityCollisionReduction);
+ var4 *= (double)(1.0F - this.entityCollisionReduction);
+ var2 *= 0.5D;
+ var4 *= 0.5D;
+ if(var1 instanceof EntityMinecart) {
+ double var10 = var1.posX - this.posX;
+ double var12 = var1.posZ - this.posZ;
+ double var14 = var10 * var1.motionZ + var12 * var1.prevPosX;
+ var14 *= var14;
+ if(var14 > 5.0D) {
+ return;
+ }
+
+ double var16 = var1.motionX + this.motionX;
+ double var18 = var1.motionZ + this.motionZ;
+ if(((EntityMinecart)var1).minecartType == 2 && this.minecartType != 2) {
+ this.motionX *= (double)0.2F;
+ this.motionZ *= (double)0.2F;
+ this.addVelocity(var1.motionX - var2, 0.0D, var1.motionZ - var4);
+ var1.motionX *= (double)0.7F;
+ var1.motionZ *= (double)0.7F;
+ } else if(((EntityMinecart)var1).minecartType != 2 && this.minecartType == 2) {
+ var1.motionX *= (double)0.2F;
+ var1.motionZ *= (double)0.2F;
+ var1.addVelocity(this.motionX + var2, 0.0D, this.motionZ + var4);
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ } else {
+ var16 /= 2.0D;
+ var18 /= 2.0D;
+ this.motionX *= (double)0.2F;
+ this.motionZ *= (double)0.2F;
+ this.addVelocity(var16 - var2, 0.0D, var18 - var4);
+ var1.motionX *= (double)0.2F;
+ var1.motionZ *= (double)0.2F;
+ var1.addVelocity(var16 + var2, 0.0D, var18 + var4);
+ }
+ } else {
+ this.addVelocity(-var2, 0.0D, -var4);
+ var1.addVelocity(var2 / 4.0D, 0.0D, var4 / 4.0D);
+ }
+ }
+
+ }
+ }
+ }
+
+ public int getSizeInventory() {
+ return 27;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.cargoItems[var1];
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.cargoItems[var1] != null) {
+ ItemStack var3;
+ if(this.cargoItems[var1].stackSize <= var2) {
+ var3 = this.cargoItems[var1];
+ this.cargoItems[var1] = null;
+ return var3;
+ } else {
+ var3 = this.cargoItems[var1].splitStack(var2);
+ if(this.cargoItems[var1].stackSize == 0) {
+ this.cargoItems[var1] = null;
+ }
+
+ return var3;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.cargoItems[var1] = var2;
+ if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) {
+ var2.stackSize = this.getInventoryStackLimit();
+ }
+
+ }
+
+ public String getInvName() {
+ return "Minecart";
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public void onInventoryChanged() {
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ if(this.minecartType == 0) {
+ if(this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != var1) {
+ return true;
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ var1.mountEntity(this);
+ }
+ } else if(this.minecartType == 1) {
+ if(!this.worldObj.singleplayerWorld) {
+ var1.displayGUIChest(this);
+ }
+ } else if(this.minecartType == 2) {
+ ItemStack var2 = var1.inventory.getCurrentItem();
+ if(var2 != null && var2.itemID == Item.coal.shiftedIndex) {
+ if(--var2.stackSize == 0) {
+ var1.inventory.setInventorySlotContents(var1.inventory.currentItem, (ItemStack)null);
+ }
+
+ this.fuel += 1200;
+ }
+
+ this.pushX = this.posX - var1.posX;
+ this.pushZ = this.posZ - var1.posZ;
+ }
+
+ return true;
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.isDead ? false : var1.getDistanceSqToEntity(this) <= 64.0D;
+ }
+}
diff --git a/src/net/minecraft/src/EntityMob.java b/src/net/minecraft/src/EntityMob.java
new file mode 100644
index 0000000..0d5d50d
--- /dev/null
+++ b/src/net/minecraft/src/EntityMob.java
@@ -0,0 +1,87 @@
+package net.minecraft.src;
+
+public class EntityMob extends EntityCreature implements IMob {
+ protected int attackStrength = 2;
+
+ public EntityMob(World var1) {
+ super(var1);
+ this.health = 20;
+ }
+
+ public void onLivingUpdate() {
+ float var1 = this.getEntityBrightness(1.0F);
+ if(var1 > 0.5F) {
+ this.age += 2;
+ }
+
+ super.onLivingUpdate();
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(!this.worldObj.singleplayerWorld && this.worldObj.difficultySetting == 0) {
+ this.setEntityDead();
+ }
+
+ }
+
+ protected Entity findPlayerToAttack() {
+ EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, 16.0D);
+ return var1 != null && this.canEntityBeSeen(var1) ? var1 : null;
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ if(super.attackEntityFrom(var1, var2)) {
+ if(this.riddenByEntity != var1 && this.ridingEntity != var1) {
+ if(var1 != this) {
+ this.playerToAttack = var1;
+ }
+
+ return true;
+ } else {
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ if(this.attackTime <= 0 && var2 < 2.0F && var1.boundingBox.maxY > this.boundingBox.minY && var1.boundingBox.minY < this.boundingBox.maxY) {
+ this.attackTime = 20;
+ var1.attackEntityFrom(this, this.attackStrength);
+ }
+
+ }
+
+ protected float getBlockPathWeight(int var1, int var2, int var3) {
+ return 0.5F - this.worldObj.getLightBrightness(var1, var2, var3);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ public boolean getCanSpawnHere() {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.boundingBox.minY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ if(this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, var1, var2, var3) > this.rand.nextInt(32)) {
+ return false;
+ } else {
+ int var4 = this.worldObj.getBlockLightValue(var1, var2, var3);
+ if(this.worldObj.func_27067_u()) {
+ int var5 = this.worldObj.skylightSubtracted;
+ this.worldObj.skylightSubtracted = 10;
+ var4 = this.worldObj.getBlockLightValue(var1, var2, var3);
+ this.worldObj.skylightSubtracted = var5;
+ }
+
+ return var4 <= this.rand.nextInt(8) && super.getCanSpawnHere();
+ }
+ }
+}
diff --git a/src/net/minecraft/src/EntityPainting.java b/src/net/minecraft/src/EntityPainting.java
new file mode 100644
index 0000000..e7d224d
--- /dev/null
+++ b/src/net/minecraft/src/EntityPainting.java
@@ -0,0 +1,237 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class EntityPainting extends Entity {
+ private int field_452_ad;
+ public int direction;
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public EnumArt art;
+
+ public EntityPainting(World var1) {
+ super(var1);
+ this.field_452_ad = 0;
+ this.direction = 0;
+ this.yOffset = 0.0F;
+ this.setSize(0.5F, 0.5F);
+ }
+
+ public EntityPainting(World var1, int var2, int var3, int var4, int var5) {
+ this(var1);
+ this.xPosition = var2;
+ this.yPosition = var3;
+ this.zPosition = var4;
+ ArrayList var6 = new ArrayList();
+ EnumArt[] var7 = EnumArt.values();
+ int var8 = var7.length;
+
+ for(int var9 = 0; var9 < var8; ++var9) {
+ EnumArt var10 = var7[var9];
+ this.art = var10;
+ this.func_179_a(var5);
+ if(this.onValidSurface()) {
+ var6.add(var10);
+ }
+ }
+
+ if(var6.size() > 0) {
+ this.art = (EnumArt)var6.get(this.rand.nextInt(var6.size()));
+ }
+
+ this.func_179_a(var5);
+ }
+
+ protected void entityInit() {
+ }
+
+ public void func_179_a(int var1) {
+ this.direction = var1;
+ this.prevRotationYaw = this.rotationYaw = (float)(var1 * 90);
+ float var2 = (float)this.art.sizeX;
+ float var3 = (float)this.art.sizeY;
+ float var4 = (float)this.art.sizeX;
+ if(var1 != 0 && var1 != 2) {
+ var2 = 0.5F;
+ } else {
+ var4 = 0.5F;
+ }
+
+ var2 /= 32.0F;
+ var3 /= 32.0F;
+ var4 /= 32.0F;
+ float var5 = (float)this.xPosition + 0.5F;
+ float var6 = (float)this.yPosition + 0.5F;
+ float var7 = (float)this.zPosition + 0.5F;
+ float var8 = 9.0F / 16.0F;
+ if(var1 == 0) {
+ var7 -= var8;
+ }
+
+ if(var1 == 1) {
+ var5 -= var8;
+ }
+
+ if(var1 == 2) {
+ var7 += var8;
+ }
+
+ if(var1 == 3) {
+ var5 += var8;
+ }
+
+ if(var1 == 0) {
+ var5 -= this.func_180_c(this.art.sizeX);
+ }
+
+ if(var1 == 1) {
+ var7 += this.func_180_c(this.art.sizeX);
+ }
+
+ if(var1 == 2) {
+ var5 += this.func_180_c(this.art.sizeX);
+ }
+
+ if(var1 == 3) {
+ var7 -= this.func_180_c(this.art.sizeX);
+ }
+
+ var6 += this.func_180_c(this.art.sizeY);
+ this.setPosition((double)var5, (double)var6, (double)var7);
+ float var9 = -(0.1F / 16.0F);
+ this.boundingBox.setBounds((double)(var5 - var2 - var9), (double)(var6 - var3 - var9), (double)(var7 - var4 - var9), (double)(var5 + var2 + var9), (double)(var6 + var3 + var9), (double)(var7 + var4 + var9));
+ }
+
+ private float func_180_c(int var1) {
+ return var1 == 32 ? 0.5F : (var1 == 64 ? 0.5F : 0.0F);
+ }
+
+ public void onUpdate() {
+ if(this.field_452_ad++ == 100 && !this.worldObj.singleplayerWorld) {
+ this.field_452_ad = 0;
+ if(!this.onValidSurface()) {
+ this.setEntityDead();
+ this.worldObj.entityJoinedWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
+ }
+ }
+
+ }
+
+ public boolean onValidSurface() {
+ if(this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() > 0) {
+ return false;
+ } else {
+ int var1 = this.art.sizeX / 16;
+ int var2 = this.art.sizeY / 16;
+ int var3 = this.xPosition;
+ int var4 = this.yPosition;
+ int var5 = this.zPosition;
+ if(this.direction == 0) {
+ var3 = MathHelper.floor_double(this.posX - (double)((float)this.art.sizeX / 32.0F));
+ }
+
+ if(this.direction == 1) {
+ var5 = MathHelper.floor_double(this.posZ - (double)((float)this.art.sizeX / 32.0F));
+ }
+
+ if(this.direction == 2) {
+ var3 = MathHelper.floor_double(this.posX - (double)((float)this.art.sizeX / 32.0F));
+ }
+
+ if(this.direction == 3) {
+ var5 = MathHelper.floor_double(this.posZ - (double)((float)this.art.sizeX / 32.0F));
+ }
+
+ var4 = MathHelper.floor_double(this.posY - (double)((float)this.art.sizeY / 32.0F));
+
+ int var7;
+ for(int var6 = 0; var6 < var1; ++var6) {
+ for(var7 = 0; var7 < var2; ++var7) {
+ Material var8;
+ if(this.direction != 0 && this.direction != 2) {
+ var8 = this.worldObj.getBlockMaterial(this.xPosition, var4 + var7, var5 + var6);
+ } else {
+ var8 = this.worldObj.getBlockMaterial(var3 + var6, var4 + var7, this.zPosition);
+ }
+
+ if(!var8.isSolid()) {
+ return false;
+ }
+ }
+ }
+
+ List var9 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox);
+
+ for(var7 = 0; var7 < var9.size(); ++var7) {
+ if(var9.get(var7) instanceof EntityPainting) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+
+ public boolean canBeCollidedWith() {
+ return true;
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ if(!this.isDead && !this.worldObj.singleplayerWorld) {
+ this.setEntityDead();
+ this.setBeenAttacked();
+ this.worldObj.entityJoinedWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
+ }
+
+ return true;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setByte("Dir", (byte)this.direction);
+ var1.setString("Motive", this.art.title);
+ var1.setInteger("TileX", this.xPosition);
+ var1.setInteger("TileY", this.yPosition);
+ var1.setInteger("TileZ", this.zPosition);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.direction = var1.getByte("Dir");
+ this.xPosition = var1.getInteger("TileX");
+ this.yPosition = var1.getInteger("TileY");
+ this.zPosition = var1.getInteger("TileZ");
+ String var2 = var1.getString("Motive");
+ EnumArt[] var3 = EnumArt.values();
+ int var4 = var3.length;
+
+ for(int var5 = 0; var5 < var4; ++var5) {
+ EnumArt var6 = var3[var5];
+ if(var6.title.equals(var2)) {
+ this.art = var6;
+ }
+ }
+
+ if(this.art == null) {
+ this.art = EnumArt.Kebab;
+ }
+
+ this.func_179_a(this.direction);
+ }
+
+ public void moveEntity(double var1, double var3, double var5) {
+ if(!this.worldObj.singleplayerWorld && var1 * var1 + var3 * var3 + var5 * var5 > 0.0D) {
+ this.setEntityDead();
+ this.worldObj.entityJoinedWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
+ }
+
+ }
+
+ public void addVelocity(double var1, double var3, double var5) {
+ if(!this.worldObj.singleplayerWorld && var1 * var1 + var3 * var3 + var5 * var5 > 0.0D) {
+ this.setEntityDead();
+ this.worldObj.entityJoinedWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/EntityPig.java b/src/net/minecraft/src/EntityPig.java
new file mode 100644
index 0000000..7ac8237
--- /dev/null
+++ b/src/net/minecraft/src/EntityPig.java
@@ -0,0 +1,78 @@
+package net.minecraft.src;
+
+public class EntityPig extends EntityAnimal {
+ public EntityPig(World var1) {
+ super(var1);
+ this.texture = "/mob/pig.png";
+ this.setSize(0.9F, 0.9F);
+ }
+
+ protected void entityInit() {
+ this.dataWatcher.addObject(16, Byte.valueOf((byte)0));
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setBoolean("Saddle", this.getSaddled());
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.setSaddled(var1.getBoolean("Saddle"));
+ }
+
+ protected String getLivingSound() {
+ return "mob.pig";
+ }
+
+ protected String getHurtSound() {
+ return "mob.pig";
+ }
+
+ protected String getDeathSound() {
+ return "mob.pigdeath";
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ if(!this.getSaddled() || this.worldObj.singleplayerWorld || this.riddenByEntity != null && this.riddenByEntity != var1) {
+ return false;
+ } else {
+ var1.mountEntity(this);
+ return true;
+ }
+ }
+
+ protected int getDropItemId() {
+ return this.fire > 0 ? Item.porkCooked.shiftedIndex : Item.porkRaw.shiftedIndex;
+ }
+
+ public boolean getSaddled() {
+ return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;
+ }
+
+ public void setSaddled(boolean var1) {
+ if(var1) {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)1));
+ } else {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)0));
+ }
+
+ }
+
+ public void onStruckByLightning(EntityLightningBolt var1) {
+ if(!this.worldObj.singleplayerWorld) {
+ EntityPigZombie var2 = new EntityPigZombie(this.worldObj);
+ var2.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch);
+ this.worldObj.entityJoinedWorld(var2);
+ this.setEntityDead();
+ }
+ }
+
+ protected void fall(float var1) {
+ super.fall(var1);
+ if(var1 > 5.0F && this.riddenByEntity instanceof EntityPlayer) {
+ ((EntityPlayer)this.riddenByEntity).func_27017_a(AchievementList.field_27098_u);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/EntityPigZombie.java b/src/net/minecraft/src/EntityPigZombie.java
new file mode 100644
index 0000000..df7eee9
--- /dev/null
+++ b/src/net/minecraft/src/EntityPigZombie.java
@@ -0,0 +1,88 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityPigZombie extends EntityZombie {
+ private int angerLevel = 0;
+ private int randomSoundDelay = 0;
+ private static final ItemStack defaultHeldItem = new ItemStack(Item.swordGold, 1);
+
+ public EntityPigZombie(World var1) {
+ super(var1);
+ this.texture = "/mob/pigzombie.png";
+ this.moveSpeed = 0.5F;
+ this.attackStrength = 5;
+ this.isImmuneToFire = true;
+ }
+
+ public void onUpdate() {
+ this.moveSpeed = this.playerToAttack != null ? 0.95F : 0.5F;
+ if(this.randomSoundDelay > 0 && --this.randomSoundDelay == 0) {
+ this.worldObj.playSoundAtEntity(this, "mob.zombiepig.zpigangry", this.getSoundVolume() * 2.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 1.8F);
+ }
+
+ super.onUpdate();
+ }
+
+ public boolean getCanSpawnHere() {
+ return this.worldObj.difficultySetting > 0 && this.worldObj.checkIfAABBIsClear(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() == 0 && !this.worldObj.getIsAnyLiquid(this.boundingBox);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setShort("Anger", (short)this.angerLevel);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.angerLevel = var1.getShort("Anger");
+ }
+
+ protected Entity findPlayerToAttack() {
+ return this.angerLevel == 0 ? null : super.findPlayerToAttack();
+ }
+
+ public void onLivingUpdate() {
+ super.onLivingUpdate();
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ if(var1 instanceof EntityPlayer) {
+ List var3 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(32.0D, 32.0D, 32.0D));
+
+ for(int var4 = 0; var4 < var3.size(); ++var4) {
+ Entity var5 = (Entity)var3.get(var4);
+ if(var5 instanceof EntityPigZombie) {
+ EntityPigZombie var6 = (EntityPigZombie)var5;
+ var6.becomeAngryAt(var1);
+ }
+ }
+
+ this.becomeAngryAt(var1);
+ }
+
+ return super.attackEntityFrom(var1, var2);
+ }
+
+ private void becomeAngryAt(Entity var1) {
+ this.playerToAttack = var1;
+ this.angerLevel = 400 + this.rand.nextInt(400);
+ this.randomSoundDelay = this.rand.nextInt(40);
+ }
+
+ protected String getLivingSound() {
+ return "mob.zombiepig.zpig";
+ }
+
+ protected String getHurtSound() {
+ return "mob.zombiepig.zpighurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.zombiepig.zpigdeath";
+ }
+
+ protected int getDropItemId() {
+ return Item.porkCooked.shiftedIndex;
+ }
+}
diff --git a/src/net/minecraft/src/EntityPlayer.java b/src/net/minecraft/src/EntityPlayer.java
new file mode 100644
index 0000000..38e1f90
--- /dev/null
+++ b/src/net/minecraft/src/EntityPlayer.java
@@ -0,0 +1,757 @@
+package net.minecraft.src;
+
+import java.util.Iterator;
+import java.util.List;
+
+public abstract class EntityPlayer extends EntityLiving {
+ public InventoryPlayer inventory = new InventoryPlayer(this);
+ public Container personalCraftingInventory;
+ public Container currentCraftingInventory;
+ public byte field_9152_am = 0;
+ public int score = 0;
+ public float field_9150_ao;
+ public float field_9149_ap;
+ public boolean isSwinging = false;
+ public int swingProgressInt = 0;
+ public String username;
+ public int dimension;
+ public double field_20047_ay;
+ public double field_20046_az;
+ public double field_20051_aA;
+ public double field_20050_aB;
+ public double field_20049_aC;
+ public double field_20048_aD;
+ protected boolean sleeping;
+ public ChunkCoordinates playerLocation;
+ private int sleepTimer;
+ public float field_22066_z;
+ public float field_22067_A;
+ private ChunkCoordinates spawnChunk;
+ private ChunkCoordinates field_27995_d;
+ public int timeUntilPortal = 20;
+ protected boolean inPortal = false;
+ public float timeInPortal;
+ private int damageRemainder = 0;
+ public EntityFish fishEntity = null;
+
+ public EntityPlayer(World var1) {
+ super(var1);
+ this.personalCraftingInventory = new ContainerPlayer(this.inventory, !var1.singleplayerWorld);
+ this.currentCraftingInventory = this.personalCraftingInventory;
+ this.yOffset = 1.62F;
+ ChunkCoordinates var2 = var1.getSpawnPoint();
+ this.setLocationAndAngles((double)var2.posX + 0.5D, (double)(var2.posY + 1), (double)var2.posZ + 0.5D, 0.0F, 0.0F);
+ this.health = 20;
+ this.entityType = "humanoid";
+ this.field_9117_aI = 180.0F;
+ this.fireResistance = 20;
+ this.texture = "/mob/char.png";
+ }
+
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(16, Byte.valueOf((byte)0));
+ }
+
+ public void onUpdate() {
+ if(this.func_22057_E()) {
+ ++this.sleepTimer;
+ if(this.sleepTimer > 100) {
+ this.sleepTimer = 100;
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ if(!this.isInBed()) {
+ this.wakeUpPlayer(true, true, false);
+ } else if(this.worldObj.isDaytime()) {
+ this.wakeUpPlayer(false, true, true);
+ }
+ }
+ } else if(this.sleepTimer > 0) {
+ ++this.sleepTimer;
+ if(this.sleepTimer >= 110) {
+ this.sleepTimer = 0;
+ }
+ }
+
+ super.onUpdate();
+ if(!this.worldObj.singleplayerWorld && this.currentCraftingInventory != null && !this.currentCraftingInventory.canInteractWith(this)) {
+ this.usePersonalCraftingInventory();
+ this.currentCraftingInventory = this.personalCraftingInventory;
+ }
+
+ this.field_20047_ay = this.field_20050_aB;
+ this.field_20046_az = this.field_20049_aC;
+ this.field_20051_aA = this.field_20048_aD;
+ double var1 = this.posX - this.field_20050_aB;
+ double var3 = this.posY - this.field_20049_aC;
+ double var5 = this.posZ - this.field_20048_aD;
+ double var7 = 10.0D;
+ if(var1 > var7) {
+ this.field_20047_ay = this.field_20050_aB = this.posX;
+ }
+
+ if(var5 > var7) {
+ this.field_20051_aA = this.field_20048_aD = this.posZ;
+ }
+
+ if(var3 > var7) {
+ this.field_20046_az = this.field_20049_aC = this.posY;
+ }
+
+ if(var1 < -var7) {
+ this.field_20047_ay = this.field_20050_aB = this.posX;
+ }
+
+ if(var5 < -var7) {
+ this.field_20051_aA = this.field_20048_aD = this.posZ;
+ }
+
+ if(var3 < -var7) {
+ this.field_20046_az = this.field_20049_aC = this.posY;
+ }
+
+ this.field_20050_aB += var1 * 0.25D;
+ this.field_20048_aD += var5 * 0.25D;
+ this.field_20049_aC += var3 * 0.25D;
+ this.addStat(StatList.field_25114_j, 1);
+ if(this.ridingEntity == null) {
+ this.field_27995_d = null;
+ }
+
+ }
+
+ protected boolean isMovementBlocked() {
+ return this.health <= 0 || this.func_22057_E();
+ }
+
+ protected void usePersonalCraftingInventory() {
+ this.currentCraftingInventory = this.personalCraftingInventory;
+ }
+
+ public void updateRidden() {
+ double var1 = this.posX;
+ double var3 = this.posY;
+ double var5 = this.posZ;
+ super.updateRidden();
+ this.field_9150_ao = this.field_9149_ap;
+ this.field_9149_ap = 0.0F;
+ this.func_27015_h(this.posX - var1, this.posY - var3, this.posZ - var5);
+ }
+
+ protected void updatePlayerActionState() {
+ if(this.isSwinging) {
+ ++this.swingProgressInt;
+ if(this.swingProgressInt >= 8) {
+ this.swingProgressInt = 0;
+ this.isSwinging = false;
+ }
+ } else {
+ this.swingProgressInt = 0;
+ }
+
+ this.swingProgress = (float)this.swingProgressInt / 8.0F;
+ }
+
+ public void onLivingUpdate() {
+ if(this.worldObj.difficultySetting == 0 && this.health < 20 && this.ticksExisted % 20 * 12 == 0) {
+ this.heal(1);
+ }
+
+ this.inventory.decrementAnimations();
+ this.field_9150_ao = this.field_9149_ap;
+ super.onLivingUpdate();
+ float var1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ float var2 = (float)Math.atan(-this.motionY * (double)0.2F) * 15.0F;
+ if(var1 > 0.1F) {
+ var1 = 0.1F;
+ }
+
+ if(!this.onGround || this.health <= 0) {
+ var1 = 0.0F;
+ }
+
+ if(this.onGround || this.health <= 0) {
+ var2 = 0.0F;
+ }
+
+ this.field_9149_ap += (var1 - this.field_9149_ap) * 0.4F;
+ this.field_9101_aY += (var2 - this.field_9101_aY) * 0.8F;
+ if(this.health > 0) {
+ List var3 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(1.0D, 0.0D, 1.0D));
+ if(var3 != null) {
+ for(int var4 = 0; var4 < var3.size(); ++var4) {
+ Entity var5 = (Entity)var3.get(var4);
+ if(!var5.isDead) {
+ this.func_171_h(var5);
+ }
+ }
+ }
+ }
+
+ }
+
+ private void func_171_h(Entity var1) {
+ var1.onCollideWithPlayer(this);
+ }
+
+ public void onDeath(Entity var1) {
+ super.onDeath(var1);
+ this.setSize(0.2F, 0.2F);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.motionY = (double)0.1F;
+ if(this.username.equals("Notch")) {
+ this.dropPlayerItemWithRandomChoice(new ItemStack(Item.appleRed, 1), true);
+ }
+
+ this.inventory.dropAllItems();
+ if(var1 != null) {
+ this.motionX = (double)(-MathHelper.cos((this.attackedAtYaw + this.rotationYaw) * (float)Math.PI / 180.0F) * 0.1F);
+ this.motionZ = (double)(-MathHelper.sin((this.attackedAtYaw + this.rotationYaw) * (float)Math.PI / 180.0F) * 0.1F);
+ } else {
+ this.motionX = this.motionZ = 0.0D;
+ }
+
+ this.yOffset = 0.1F;
+ this.addStat(StatList.field_25098_u, 1);
+ }
+
+ public void addToPlayerScore(Entity var1, int var2) {
+ this.score += var2;
+ if(var1 instanceof EntityPlayer) {
+ this.addStat(StatList.field_25096_w, 1);
+ } else {
+ this.addStat(StatList.field_25097_v, 1);
+ }
+
+ }
+
+ public void dropCurrentItem() {
+ this.dropPlayerItemWithRandomChoice(this.inventory.decrStackSize(this.inventory.currentItem, 1), false);
+ }
+
+ public void dropPlayerItem(ItemStack var1) {
+ this.dropPlayerItemWithRandomChoice(var1, false);
+ }
+
+ public void dropPlayerItemWithRandomChoice(ItemStack var1, boolean var2) {
+ if(var1 != null) {
+ EntityItem var3 = new EntityItem(this.worldObj, this.posX, this.posY - (double)0.3F + (double)this.getEyeHeight(), this.posZ, var1);
+ var3.delayBeforeCanPickup = 40;
+ float var4 = 0.1F;
+ float var5;
+ if(var2) {
+ var5 = this.rand.nextFloat() * 0.5F;
+ float var6 = this.rand.nextFloat() * (float)Math.PI * 2.0F;
+ var3.motionX = (double)(-MathHelper.sin(var6) * var5);
+ var3.motionZ = (double)(MathHelper.cos(var6) * var5);
+ var3.motionY = (double)0.2F;
+ } else {
+ var4 = 0.3F;
+ var3.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var4);
+ var3.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var4);
+ var3.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var4 + 0.1F);
+ var4 = 0.02F;
+ var5 = this.rand.nextFloat() * (float)Math.PI * 2.0F;
+ var4 *= this.rand.nextFloat();
+ var3.motionX += Math.cos((double)var5) * (double)var4;
+ var3.motionY += (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F);
+ var3.motionZ += Math.sin((double)var5) * (double)var4;
+ }
+
+ this.joinEntityItemWithWorld(var3);
+ this.addStat(StatList.field_25103_r, 1);
+ }
+ }
+
+ protected void joinEntityItemWithWorld(EntityItem var1) {
+ this.worldObj.entityJoinedWorld(var1);
+ }
+
+ public float getCurrentPlayerStrVsBlock(Block var1) {
+ float var2 = this.inventory.getStrVsBlock(var1);
+ if(this.isInsideOfMaterial(Material.water)) {
+ var2 /= 5.0F;
+ }
+
+ if(!this.onGround) {
+ var2 /= 5.0F;
+ }
+
+ return var2;
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return this.inventory.canHarvestBlock(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ NBTTagList var2 = var1.getTagList("Inventory");
+ this.inventory.readFromNBT(var2);
+ this.dimension = var1.getInteger("Dimension");
+ this.sleeping = var1.getBoolean("Sleeping");
+ this.sleepTimer = var1.getShort("SleepTimer");
+ if(this.sleeping) {
+ this.playerLocation = new ChunkCoordinates(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ));
+ this.wakeUpPlayer(true, true, false);
+ }
+
+ if(var1.hasKey("SpawnX") && var1.hasKey("SpawnY") && var1.hasKey("SpawnZ")) {
+ this.spawnChunk = new ChunkCoordinates(var1.getInteger("SpawnX"), var1.getInteger("SpawnY"), var1.getInteger("SpawnZ"));
+ }
+
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setTag("Inventory", this.inventory.writeToNBT(new NBTTagList()));
+ var1.setInteger("Dimension", this.dimension);
+ var1.setBoolean("Sleeping", this.sleeping);
+ var1.setShort("SleepTimer", (short)this.sleepTimer);
+ if(this.spawnChunk != null) {
+ var1.setInteger("SpawnX", this.spawnChunk.posX);
+ var1.setInteger("SpawnY", this.spawnChunk.posY);
+ var1.setInteger("SpawnZ", this.spawnChunk.posZ);
+ }
+
+ }
+
+ public void displayGUIChest(IInventory var1) {
+ }
+
+ public void displayWorkbenchGUI(int var1, int var2, int var3) {
+ }
+
+ public void onItemPickup(Entity var1, int var2) {
+ }
+
+ public float getEyeHeight() {
+ return 0.12F;
+ }
+
+ protected void resetHeight() {
+ this.yOffset = 1.62F;
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ this.age = 0;
+ if(this.health <= 0) {
+ return false;
+ } else {
+ if(this.func_22057_E() && !this.worldObj.singleplayerWorld) {
+ this.wakeUpPlayer(true, true, false);
+ }
+
+ if(var1 instanceof EntityMob || var1 instanceof EntityArrow) {
+ if(this.worldObj.difficultySetting == 0) {
+ var2 = 0;
+ }
+
+ if(this.worldObj.difficultySetting == 1) {
+ var2 = var2 / 3 + 1;
+ }
+
+ if(this.worldObj.difficultySetting == 3) {
+ var2 = var2 * 3 / 2;
+ }
+ }
+
+ if(var2 == 0) {
+ return false;
+ } else {
+ Object var3 = var1;
+ if(var1 instanceof EntityArrow && ((EntityArrow)var1).owner != null) {
+ var3 = ((EntityArrow)var1).owner;
+ }
+
+ if(var3 instanceof EntityLiving) {
+ this.func_25047_a((EntityLiving)var3, false);
+ }
+
+ this.addStat(StatList.field_25100_t, var2);
+ return super.attackEntityFrom(var1, var2);
+ }
+ }
+ }
+
+ protected boolean isPVPEnabled() {
+ return false;
+ }
+
+ protected void func_25047_a(EntityLiving var1, boolean var2) {
+ if(!(var1 instanceof EntityCreeper) && !(var1 instanceof EntityGhast)) {
+ if(var1 instanceof EntityWolf) {
+ EntityWolf var3 = (EntityWolf)var1;
+ if(var3.func_25030_y() && this.username.equals(var3.getOwner())) {
+ return;
+ }
+ }
+
+ if(!(var1 instanceof EntityPlayer) || this.isPVPEnabled()) {
+ List var7 = this.worldObj.getEntitiesWithinAABB(EntityWolf.class, AxisAlignedBB.getBoundingBoxFromPool(this.posX, this.posY, this.posZ, this.posX + 1.0D, this.posY + 1.0D, this.posZ + 1.0D).expand(16.0D, 4.0D, 16.0D));
+ Iterator var4 = var7.iterator();
+
+ while(true) {
+ EntityWolf var6;
+ do {
+ do {
+ do {
+ do {
+ if(!var4.hasNext()) {
+ return;
+ }
+
+ Entity var5 = (Entity)var4.next();
+ var6 = (EntityWolf)var5;
+ } while(!var6.func_25030_y());
+ } while(var6.getEntityToAttack() != null);
+ } while(!this.username.equals(var6.getOwner()));
+ } while(var2 && var6.getIsSitting());
+
+ var6.setIsSitting(false);
+ var6.setEntityToAttack(var1);
+ }
+ }
+ }
+ }
+
+ protected void damageEntity(int var1) {
+ int var2 = 25 - this.inventory.getTotalArmorValue();
+ int var3 = var1 * var2 + this.damageRemainder;
+ this.inventory.damageArmor(var1);
+ var1 = var3 / 25;
+ this.damageRemainder = var3 % 25;
+ super.damageEntity(var1);
+ }
+
+ public void displayGUIFurnace(TileEntityFurnace var1) {
+ }
+
+ public void displayGUIDispenser(TileEntityDispenser var1) {
+ }
+
+ public void displayGUIEditSign(TileEntitySign var1) {
+ }
+
+ public void useCurrentItemOnEntity(Entity var1) {
+ if(!var1.interact(this)) {
+ ItemStack var2 = this.getCurrentEquippedItem();
+ if(var2 != null && var1 instanceof EntityLiving) {
+ var2.useItemOnEntity((EntityLiving)var1);
+ if(var2.stackSize <= 0) {
+ var2.func_577_a(this);
+ this.destroyCurrentEquippedItem();
+ }
+ }
+
+ }
+ }
+
+ public ItemStack getCurrentEquippedItem() {
+ return this.inventory.getCurrentItem();
+ }
+
+ public void destroyCurrentEquippedItem() {
+ this.inventory.setInventorySlotContents(this.inventory.currentItem, (ItemStack)null);
+ }
+
+ public double getYOffset() {
+ return (double)(this.yOffset - 0.5F);
+ }
+
+ public void swingItem() {
+ this.swingProgressInt = -1;
+ this.isSwinging = true;
+ }
+
+ public void attackTargetEntityWithCurrentItem(Entity var1) {
+ int var2 = this.inventory.getDamageVsEntity(var1);
+ if(var2 > 0) {
+ if(this.motionY < 0.0D) {
+ ++var2;
+ }
+
+ var1.attackEntityFrom(this, var2);
+ ItemStack var3 = this.getCurrentEquippedItem();
+ if(var3 != null && var1 instanceof EntityLiving) {
+ var3.hitEntity((EntityLiving)var1, this);
+ if(var3.stackSize <= 0) {
+ var3.func_577_a(this);
+ this.destroyCurrentEquippedItem();
+ }
+ }
+
+ if(var1 instanceof EntityLiving) {
+ if(var1.isEntityAlive()) {
+ this.func_25047_a((EntityLiving)var1, true);
+ }
+
+ this.addStat(StatList.field_25102_s, var2);
+ }
+ }
+
+ }
+
+ public void onItemStackChanged(ItemStack var1) {
+ }
+
+ public void setEntityDead() {
+ super.setEntityDead();
+ this.personalCraftingInventory.onCraftGuiClosed(this);
+ if(this.currentCraftingInventory != null) {
+ this.currentCraftingInventory.onCraftGuiClosed(this);
+ }
+
+ }
+
+ public boolean isEntityInsideOpaqueBlock() {
+ return !this.sleeping && super.isEntityInsideOpaqueBlock();
+ }
+
+ public EnumStatus goToSleep(int var1, int var2, int var3) {
+ if(!this.worldObj.singleplayerWorld) {
+ if(this.func_22057_E() || !this.isEntityAlive()) {
+ return EnumStatus.OTHER_PROBLEM;
+ }
+
+ if(this.worldObj.worldProvider.field_6167_c) {
+ return EnumStatus.NOT_POSSIBLE_HERE;
+ }
+
+ if(this.worldObj.isDaytime()) {
+ return EnumStatus.NOT_POSSIBLE_NOW;
+ }
+
+ if(Math.abs(this.posX - (double)var1) > 3.0D || Math.abs(this.posY - (double)var2) > 2.0D || Math.abs(this.posZ - (double)var3) > 3.0D) {
+ return EnumStatus.TOO_FAR_AWAY;
+ }
+ }
+
+ this.setSize(0.2F, 0.2F);
+ this.yOffset = 0.2F;
+ if(this.worldObj.blockExists(var1, var2, var3)) {
+ int var4 = this.worldObj.getBlockMetadata(var1, var2, var3);
+ int var5 = BlockBed.func_22019_c(var4);
+ float var6 = 0.5F;
+ float var7 = 0.5F;
+ switch(var5) {
+ case 0:
+ var7 = 0.9F;
+ break;
+ case 1:
+ var6 = 0.1F;
+ break;
+ case 2:
+ var7 = 0.1F;
+ break;
+ case 3:
+ var6 = 0.9F;
+ }
+
+ this.func_22059_e(var5);
+ this.setPosition((double)((float)var1 + var6), (double)((float)var2 + 15.0F / 16.0F), (double)((float)var3 + var7));
+ } else {
+ this.setPosition((double)((float)var1 + 0.5F), (double)((float)var2 + 15.0F / 16.0F), (double)((float)var3 + 0.5F));
+ }
+
+ this.sleeping = true;
+ this.sleepTimer = 0;
+ this.playerLocation = new ChunkCoordinates(var1, var2, var3);
+ this.motionX = this.motionZ = this.motionY = 0.0D;
+ if(!this.worldObj.singleplayerWorld) {
+ this.worldObj.updateAllPlayersSleepingFlag();
+ }
+
+ return EnumStatus.OK;
+ }
+
+ private void func_22059_e(int var1) {
+ this.field_22066_z = 0.0F;
+ this.field_22067_A = 0.0F;
+ switch(var1) {
+ case 0:
+ this.field_22067_A = -1.8F;
+ break;
+ case 1:
+ this.field_22066_z = 1.8F;
+ break;
+ case 2:
+ this.field_22067_A = 1.8F;
+ break;
+ case 3:
+ this.field_22066_z = -1.8F;
+ }
+
+ }
+
+ public void wakeUpPlayer(boolean var1, boolean var2, boolean var3) {
+ this.setSize(0.6F, 1.8F);
+ this.resetHeight();
+ ChunkCoordinates var4 = this.playerLocation;
+ ChunkCoordinates var5 = this.playerLocation;
+ if(var4 != null && this.worldObj.getBlockId(var4.posX, var4.posY, var4.posZ) == Block.bed.blockID) {
+ BlockBed.func_22022_a(this.worldObj, var4.posX, var4.posY, var4.posZ, false);
+ var5 = BlockBed.func_22021_g(this.worldObj, var4.posX, var4.posY, var4.posZ, 0);
+ if(var5 == null) {
+ var5 = new ChunkCoordinates(var4.posX, var4.posY + 1, var4.posZ);
+ }
+
+ this.setPosition((double)((float)var5.posX + 0.5F), (double)((float)var5.posY + this.yOffset + 0.1F), (double)((float)var5.posZ + 0.5F));
+ }
+
+ this.sleeping = false;
+ if(!this.worldObj.singleplayerWorld && var2) {
+ this.worldObj.updateAllPlayersSleepingFlag();
+ }
+
+ if(var1) {
+ this.sleepTimer = 0;
+ } else {
+ this.sleepTimer = 100;
+ }
+
+ if(var3) {
+ this.setSpawnChunk(this.playerLocation);
+ }
+
+ }
+
+ private boolean isInBed() {
+ return this.worldObj.getBlockId(this.playerLocation.posX, this.playerLocation.posY, this.playerLocation.posZ) == Block.bed.blockID;
+ }
+
+ public static ChunkCoordinates func_25051_a(World var0, ChunkCoordinates var1) {
+ IChunkProvider var2 = var0.o();
+ var2.loadChunk(var1.posX - 3 >> 4, var1.posZ - 3 >> 4);
+ var2.loadChunk(var1.posX + 3 >> 4, var1.posZ - 3 >> 4);
+ var2.loadChunk(var1.posX - 3 >> 4, var1.posZ + 3 >> 4);
+ var2.loadChunk(var1.posX + 3 >> 4, var1.posZ + 3 >> 4);
+ if(var0.getBlockId(var1.posX, var1.posY, var1.posZ) != Block.bed.blockID) {
+ return null;
+ } else {
+ ChunkCoordinates var3 = BlockBed.func_22021_g(var0, var1.posX, var1.posY, var1.posZ, 0);
+ return var3;
+ }
+ }
+
+ public boolean func_22057_E() {
+ return this.sleeping;
+ }
+
+ public boolean isPlayerFullyAsleep() {
+ return this.sleeping && this.sleepTimer >= 100;
+ }
+
+ public void func_22061_a(String var1) {
+ }
+
+ public ChunkCoordinates getSpawnChunk() {
+ return this.spawnChunk;
+ }
+
+ public void setSpawnChunk(ChunkCoordinates var1) {
+ if(var1 != null) {
+ this.spawnChunk = new ChunkCoordinates(var1);
+ } else {
+ this.spawnChunk = null;
+ }
+
+ }
+
+ public void func_27017_a(StatBase var1) {
+ this.addStat(var1, 1);
+ }
+
+ public void addStat(StatBase var1, int var2) {
+ }
+
+ protected void jump() {
+ super.jump();
+ this.addStat(StatList.field_25106_q, 1);
+ }
+
+ public void moveEntityWithHeading(float var1, float var2) {
+ double var3 = this.posX;
+ double var5 = this.posY;
+ double var7 = this.posZ;
+ super.moveEntityWithHeading(var1, var2);
+ this.func_25045_g(this.posX - var3, this.posY - var5, this.posZ - var7);
+ }
+
+ private void func_25045_g(double var1, double var3, double var5) {
+ if(this.ridingEntity == null) {
+ int var7;
+ if(this.isInsideOfMaterial(Material.water)) {
+ var7 = Math.round(MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5) * 100.0F);
+ if(var7 > 0) {
+ this.addStat(StatList.field_25108_p, var7);
+ }
+ } else if(this.isInWater()) {
+ var7 = Math.round(MathHelper.sqrt_double(var1 * var1 + var5 * var5) * 100.0F);
+ if(var7 > 0) {
+ this.addStat(StatList.field_25112_l, var7);
+ }
+ } else if(this.isOnLadder()) {
+ if(var3 > 0.0D) {
+ this.addStat(StatList.field_25110_n, (int)Math.round(var3 * 100.0D));
+ }
+ } else if(this.onGround) {
+ var7 = Math.round(MathHelper.sqrt_double(var1 * var1 + var5 * var5) * 100.0F);
+ if(var7 > 0) {
+ this.addStat(StatList.field_25113_k, var7);
+ }
+ } else {
+ var7 = Math.round(MathHelper.sqrt_double(var1 * var1 + var5 * var5) * 100.0F);
+ if(var7 > 25) {
+ this.addStat(StatList.field_25109_o, var7);
+ }
+ }
+
+ }
+ }
+
+ private void func_27015_h(double var1, double var3, double var5) {
+ if(this.ridingEntity != null) {
+ int var7 = Math.round(MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5) * 100.0F);
+ if(var7 > 0) {
+ if(this.ridingEntity instanceof EntityMinecart) {
+ this.addStat(StatList.field_27095_r, var7);
+ if(this.field_27995_d == null) {
+ this.field_27995_d = new ChunkCoordinates(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ));
+ } else if(this.field_27995_d.getSqDistanceTo(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) >= 1000.0D) {
+ this.addStat(AchievementList.field_27102_q, 1);
+ }
+ } else if(this.ridingEntity instanceof EntityBoat) {
+ this.addStat(StatList.field_27094_s, var7);
+ } else if(this.ridingEntity instanceof EntityPig) {
+ this.addStat(StatList.field_27093_t, var7);
+ }
+ }
+ }
+
+ }
+
+ protected void fall(float var1) {
+ if(var1 >= 2.0F) {
+ this.addStat(StatList.field_25111_m, (int)Math.round((double)var1 * 100.0D));
+ }
+
+ super.fall(var1);
+ }
+
+ public void func_27010_a(EntityLiving var1) {
+ if(var1 instanceof EntityMob) {
+ this.func_27017_a(AchievementList.field_27100_s);
+ }
+
+ }
+
+ public void setInPortal() {
+ if(this.timeUntilPortal > 0) {
+ this.timeUntilPortal = 10;
+ } else {
+ this.inPortal = true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/EntityPlayerMP.java b/src/net/minecraft/src/EntityPlayerMP.java
new file mode 100644
index 0000000..8c3cd7f
--- /dev/null
+++ b/src/net/minecraft/src/EntityPlayerMP.java
@@ -0,0 +1,397 @@
+package net.minecraft.src;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import net.minecraft.server.MinecraftServer;
+
+public class EntityPlayerMP extends EntityPlayer implements ICrafting {
+ public NetServerHandler playerNetServerHandler;
+ public MinecraftServer mcServer;
+ public ItemInWorldManager itemInWorldManager;
+ public double field_9155_d;
+ public double field_9154_e;
+ public List loadedChunks = new LinkedList();
+ public Set field_420_ah = new HashSet();
+ private int lastHealth = -99999999;
+ private int ticksOfInvuln = 60;
+ private ItemStack[] playerInventory = new ItemStack[]{null, null, null, null, null};
+ private int currentWindowId = 0;
+ public boolean isChangingQuantityOnly;
+
+ public EntityPlayerMP(MinecraftServer var1, World var2, String var3, ItemInWorldManager var4) {
+ super(var2);
+ var4.thisPlayer = this;
+ this.itemInWorldManager = var4;
+ ChunkCoordinates var5 = var2.getSpawnPoint();
+ int var6 = var5.posX;
+ int var7 = var5.posZ;
+ int var8 = var5.posY;
+ if(!var2.worldProvider.field_4306_c) {
+ var6 += this.rand.nextInt(20) - 10;
+ var8 = var2.findTopSolidBlock(var6, var7);
+ var7 += this.rand.nextInt(20) - 10;
+ }
+
+ this.setLocationAndAngles((double)var6 + 0.5D, (double)var8, (double)var7 + 0.5D, 0.0F, 0.0F);
+ this.mcServer = var1;
+ this.stepHeight = 0.0F;
+ this.username = var3;
+ this.yOffset = 0.0F;
+ }
+
+ public void setWorldHandler(World var1) {
+ super.setWorldHandler(var1);
+ this.itemInWorldManager = new ItemInWorldManager((WorldServer)var1);
+ this.itemInWorldManager.thisPlayer = this;
+ }
+
+ public void func_20057_k() {
+ this.currentCraftingInventory.onCraftGuiOpened(this);
+ }
+
+ public ItemStack[] getInventory() {
+ return this.playerInventory;
+ }
+
+ protected void resetHeight() {
+ this.yOffset = 0.0F;
+ }
+
+ public float getEyeHeight() {
+ return 1.62F;
+ }
+
+ public void onUpdate() {
+ this.itemInWorldManager.func_328_a();
+ --this.ticksOfInvuln;
+ this.currentCraftingInventory.updateCraftingMatrix();
+
+ for(int var1 = 0; var1 < 5; ++var1) {
+ ItemStack var2 = this.getEquipmentInSlot(var1);
+ if(var2 != this.playerInventory[var1]) {
+ this.mcServer.getEntityTracker(this.dimension).sendPacketToTrackedPlayers(this, new Packet5PlayerInventory(this.entityId, var1, var2));
+ this.playerInventory[var1] = var2;
+ }
+ }
+
+ }
+
+ public ItemStack getEquipmentInSlot(int var1) {
+ return var1 == 0 ? this.inventory.getCurrentItem() : this.inventory.armorInventory[var1 - 1];
+ }
+
+ public void onDeath(Entity var1) {
+ this.inventory.dropAllItems();
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ if(this.ticksOfInvuln > 0) {
+ return false;
+ } else {
+ if(!this.mcServer.pvpOn) {
+ if(var1 instanceof EntityPlayer) {
+ return false;
+ }
+
+ if(var1 instanceof EntityArrow) {
+ EntityArrow var3 = (EntityArrow)var1;
+ if(var3.owner instanceof EntityPlayer) {
+ return false;
+ }
+ }
+ }
+
+ return super.attackEntityFrom(var1, var2);
+ }
+ }
+
+ protected boolean isPVPEnabled() {
+ return this.mcServer.pvpOn;
+ }
+
+ public void heal(int var1) {
+ super.heal(var1);
+ }
+
+ public void onUpdateEntity(boolean var1) {
+ super.onUpdate();
+
+ for(int var2 = 0; var2 < this.inventory.getSizeInventory(); ++var2) {
+ ItemStack var3 = this.inventory.getStackInSlot(var2);
+ if(var3 != null && Item.itemsList[var3.itemID].func_28019_b() && this.playerNetServerHandler.getNumChunkDataPackets() <= 2) {
+ Packet var4 = ((ItemMapBase)Item.itemsList[var3.itemID]).func_28022_b(var3, this.worldObj, this);
+ if(var4 != null) {
+ this.playerNetServerHandler.sendPacket(var4);
+ }
+ }
+ }
+
+ if(var1 && !this.loadedChunks.isEmpty()) {
+ ChunkCoordIntPair var7 = (ChunkCoordIntPair)this.loadedChunks.get(0);
+ if(var7 != null) {
+ boolean var8 = false;
+ if(this.playerNetServerHandler.getNumChunkDataPackets() < 4) {
+ var8 = true;
+ }
+
+ if(var8) {
+ WorldServer var9 = this.mcServer.getWorldManager(this.dimension);
+ this.loadedChunks.remove(var7);
+ this.playerNetServerHandler.sendPacket(new Packet51MapChunk(var7.chunkXPos * 16, 0, var7.chunkZPos * 16, 16, 128, 16, var9));
+ List var5 = var9.getTileEntityList(var7.chunkXPos * 16, 0, var7.chunkZPos * 16, var7.chunkXPos * 16 + 16, 128, var7.chunkZPos * 16 + 16);
+
+ for(int var6 = 0; var6 < var5.size(); ++var6) {
+ this.getTileEntityInfo((TileEntity)var5.get(var6));
+ }
+ }
+ }
+ }
+
+ if(this.inPortal) {
+ if(this.mcServer.propertyManagerObj.getBooleanProperty("allow-nether", true)) {
+ if(this.currentCraftingInventory != this.personalCraftingInventory) {
+ this.usePersonalCraftingInventory();
+ }
+
+ if(this.ridingEntity != null) {
+ this.mountEntity(this.ridingEntity);
+ } else {
+ this.timeInPortal += 0.0125F;
+ if(this.timeInPortal >= 1.0F) {
+ this.timeInPortal = 1.0F;
+ this.timeUntilPortal = 10;
+ this.mcServer.configManager.sendPlayerToOtherDimension(this);
+ }
+ }
+
+ this.inPortal = false;
+ }
+ } else {
+ if(this.timeInPortal > 0.0F) {
+ this.timeInPortal -= 0.05F;
+ }
+
+ if(this.timeInPortal < 0.0F) {
+ this.timeInPortal = 0.0F;
+ }
+ }
+
+ if(this.timeUntilPortal > 0) {
+ --this.timeUntilPortal;
+ }
+
+ if(this.health != this.lastHealth) {
+ this.playerNetServerHandler.sendPacket(new Packet8UpdateHealth(this.health));
+ this.lastHealth = this.health;
+ }
+
+ }
+
+ private void getTileEntityInfo(TileEntity var1) {
+ if(var1 != null) {
+ Packet var2 = var1.getDescriptionPacket();
+ if(var2 != null) {
+ this.playerNetServerHandler.sendPacket(var2);
+ }
+ }
+
+ }
+
+ public void onLivingUpdate() {
+ super.onLivingUpdate();
+ }
+
+ public void onItemPickup(Entity var1, int var2) {
+ if(!var1.isDead) {
+ EntityTracker var3 = this.mcServer.getEntityTracker(this.dimension);
+ if(var1 instanceof EntityItem) {
+ var3.sendPacketToTrackedPlayers(var1, new Packet22Collect(var1.entityId, this.entityId));
+ }
+
+ if(var1 instanceof EntityArrow) {
+ var3.sendPacketToTrackedPlayers(var1, new Packet22Collect(var1.entityId, this.entityId));
+ }
+ }
+
+ super.onItemPickup(var1, var2);
+ this.currentCraftingInventory.updateCraftingMatrix();
+ }
+
+ public void swingItem() {
+ if(!this.isSwinging) {
+ this.swingProgressInt = -1;
+ this.isSwinging = true;
+ EntityTracker var1 = this.mcServer.getEntityTracker(this.dimension);
+ var1.sendPacketToTrackedPlayers(this, new Packet18Animation(this, 1));
+ }
+
+ }
+
+ public void func_22068_s() {
+ }
+
+ public EnumStatus goToSleep(int var1, int var2, int var3) {
+ EnumStatus var4 = super.goToSleep(var1, var2, var3);
+ if(var4 == EnumStatus.OK) {
+ EntityTracker var5 = this.mcServer.getEntityTracker(this.dimension);
+ Packet17Sleep var6 = new Packet17Sleep(this, 0, var1, var2, var3);
+ var5.sendPacketToTrackedPlayers(this, var6);
+ this.playerNetServerHandler.teleportTo(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch);
+ this.playerNetServerHandler.sendPacket(var6);
+ }
+
+ return var4;
+ }
+
+ public void wakeUpPlayer(boolean var1, boolean var2, boolean var3) {
+ if(this.func_22057_E()) {
+ EntityTracker var4 = this.mcServer.getEntityTracker(this.dimension);
+ var4.sendPacketToTrackedPlayersAndTrackedEntity(this, new Packet18Animation(this, 3));
+ }
+
+ super.wakeUpPlayer(var1, var2, var3);
+ if(this.playerNetServerHandler != null) {
+ this.playerNetServerHandler.teleportTo(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch);
+ }
+
+ }
+
+ public void mountEntity(Entity var1) {
+ super.mountEntity(var1);
+ this.playerNetServerHandler.sendPacket(new Packet39AttachEntity(this, this.ridingEntity));
+ this.playerNetServerHandler.teleportTo(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch);
+ }
+
+ protected void updateFallState(double var1, boolean var3) {
+ }
+
+ public void handleFalling(double var1, boolean var3) {
+ super.updateFallState(var1, var3);
+ }
+
+ private void getNextWidowId() {
+ this.currentWindowId = this.currentWindowId % 100 + 1;
+ }
+
+ public void displayWorkbenchGUI(int var1, int var2, int var3) {
+ this.getNextWidowId();
+ this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 1, "Crafting", 9));
+ this.currentCraftingInventory = new ContainerWorkbench(this.inventory, this.worldObj, var1, var2, var3);
+ this.currentCraftingInventory.windowId = this.currentWindowId;
+ this.currentCraftingInventory.onCraftGuiOpened(this);
+ }
+
+ public void displayGUIChest(IInventory var1) {
+ this.getNextWidowId();
+ this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 0, var1.getInvName(), var1.getSizeInventory()));
+ this.currentCraftingInventory = new ContainerChest(this.inventory, var1);
+ this.currentCraftingInventory.windowId = this.currentWindowId;
+ this.currentCraftingInventory.onCraftGuiOpened(this);
+ }
+
+ public void displayGUIFurnace(TileEntityFurnace var1) {
+ this.getNextWidowId();
+ this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 2, var1.getInvName(), var1.getSizeInventory()));
+ this.currentCraftingInventory = new ContainerFurnace(this.inventory, var1);
+ this.currentCraftingInventory.windowId = this.currentWindowId;
+ this.currentCraftingInventory.onCraftGuiOpened(this);
+ }
+
+ public void displayGUIDispenser(TileEntityDispenser var1) {
+ this.getNextWidowId();
+ this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 3, var1.getInvName(), var1.getSizeInventory()));
+ this.currentCraftingInventory = new ContainerDispenser(this.inventory, var1);
+ this.currentCraftingInventory.windowId = this.currentWindowId;
+ this.currentCraftingInventory.onCraftGuiOpened(this);
+ }
+
+ public void updateCraftingInventorySlot(Container var1, int var2, ItemStack var3) {
+ if(!(var1.getSlot(var2) instanceof SlotCrafting)) {
+ if(!this.isChangingQuantityOnly) {
+ this.playerNetServerHandler.sendPacket(new Packet103SetSlot(var1.windowId, var2, var3));
+ }
+ }
+ }
+
+ public void func_28017_a(Container var1) {
+ this.updateCraftingInventory(var1, var1.func_28127_b());
+ }
+
+ public void updateCraftingInventory(Container var1, List var2) {
+ this.playerNetServerHandler.sendPacket(new Packet104WindowItems(var1.windowId, var2));
+ this.playerNetServerHandler.sendPacket(new Packet103SetSlot(-1, -1, this.inventory.getItemStack()));
+ }
+
+ public void updateCraftingInventoryInfo(Container var1, int var2, int var3) {
+ this.playerNetServerHandler.sendPacket(new Packet105UpdateProgressbar(var1.windowId, var2, var3));
+ }
+
+ public void onItemStackChanged(ItemStack var1) {
+ }
+
+ public void usePersonalCraftingInventory() {
+ this.playerNetServerHandler.sendPacket(new Packet101CloseWindow(this.currentCraftingInventory.windowId));
+ this.closeCraftingGui();
+ }
+
+ public void updateHeldItem() {
+ if(!this.isChangingQuantityOnly) {
+ this.playerNetServerHandler.sendPacket(new Packet103SetSlot(-1, -1, this.inventory.getItemStack()));
+ }
+ }
+
+ public void closeCraftingGui() {
+ this.currentCraftingInventory.onCraftGuiClosed(this);
+ this.currentCraftingInventory = this.personalCraftingInventory;
+ }
+
+ public void setMovementType(float var1, float var2, boolean var3, boolean var4, float var5, float var6) {
+ this.moveStrafing = var1;
+ this.moveForward = var2;
+ this.isJumping = var3;
+ this.setSneaking(var4);
+ this.rotationPitch = var5;
+ this.rotationYaw = var6;
+ }
+
+ public void addStat(StatBase var1, int var2) {
+ if(var1 != null) {
+ if(!var1.field_27058_g) {
+ while(var2 > 100) {
+ this.playerNetServerHandler.sendPacket(new Packet200Statistic(var1.statId, 100));
+ var2 -= 100;
+ }
+
+ this.playerNetServerHandler.sendPacket(new Packet200Statistic(var1.statId, var2));
+ }
+
+ }
+ }
+
+ public void func_30002_A() {
+ if(this.ridingEntity != null) {
+ this.mountEntity(this.ridingEntity);
+ }
+
+ if(this.riddenByEntity != null) {
+ this.riddenByEntity.mountEntity(this);
+ }
+
+ if(this.sleeping) {
+ this.wakeUpPlayer(true, false, false);
+ }
+
+ }
+
+ public void func_30001_B() {
+ this.lastHealth = -99999999;
+ }
+
+ public void func_22061_a(String var1) {
+ StringTranslate var2 = StringTranslate.getInstance();
+ String var3 = var2.translateKey(var1);
+ this.playerNetServerHandler.sendPacket(new Packet3Chat(var3));
+ }
+}
diff --git a/src/net/minecraft/src/EntitySheep.java b/src/net/minecraft/src/EntitySheep.java
new file mode 100644
index 0000000..a4fe7c3
--- /dev/null
+++ b/src/net/minecraft/src/EntitySheep.java
@@ -0,0 +1,106 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class EntitySheep extends EntityAnimal {
+ public static final float[][] field_21071_a = new float[][]{{1.0F, 1.0F, 1.0F}, {0.95F, 0.7F, 0.2F}, {0.9F, 0.5F, 0.85F}, {0.6F, 0.7F, 0.95F}, {0.9F, 0.9F, 0.2F}, {0.5F, 0.8F, 0.1F}, {0.95F, 0.7F, 0.8F}, {0.3F, 0.3F, 0.3F}, {0.6F, 0.6F, 0.6F}, {0.3F, 0.6F, 0.7F}, {0.7F, 0.4F, 0.9F}, {0.2F, 0.4F, 0.8F}, {0.5F, 0.4F, 0.3F}, {0.4F, 0.5F, 0.2F}, {0.8F, 0.3F, 0.3F}, {0.1F, 0.1F, 0.1F}};
+
+ public EntitySheep(World var1) {
+ super(var1);
+ this.texture = "/mob/sheep.png";
+ this.setSize(0.9F, 1.3F);
+ }
+
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(16, new Byte((byte)0));
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ return super.attackEntityFrom(var1, var2);
+ }
+
+ protected void dropFewItems() {
+ if(!this.func_21069_f_()) {
+ this.entityDropItem(new ItemStack(Block.cloth.blockID, 1, this.getFleeceColor()), 0.0F);
+ }
+
+ }
+
+ protected int getDropItemId() {
+ return Block.cloth.blockID;
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ ItemStack var2 = var1.inventory.getCurrentItem();
+ if(var2 != null && var2.itemID == Item.field_31022_bc.shiftedIndex && !this.func_21069_f_()) {
+ if(!this.worldObj.singleplayerWorld) {
+ this.setSheared(true);
+ int var3 = 2 + this.rand.nextInt(3);
+
+ for(int var4 = 0; var4 < var3; ++var4) {
+ EntityItem var5 = this.entityDropItem(new ItemStack(Block.cloth.blockID, 1, this.getFleeceColor()), 1.0F);
+ var5.motionY += (double)(this.rand.nextFloat() * 0.05F);
+ var5.motionX += (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F);
+ var5.motionZ += (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F);
+ }
+ }
+
+ var2.damageItem(1, var1);
+ }
+
+ return false;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setBoolean("Sheared", this.func_21069_f_());
+ var1.setByte("Color", (byte)this.getFleeceColor());
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.setSheared(var1.getBoolean("Sheared"));
+ this.setFleeceColor(var1.getByte("Color"));
+ }
+
+ protected String getLivingSound() {
+ return "mob.sheep";
+ }
+
+ protected String getHurtSound() {
+ return "mob.sheep";
+ }
+
+ protected String getDeathSound() {
+ return "mob.sheep";
+ }
+
+ public int getFleeceColor() {
+ return this.dataWatcher.getWatchableObjectByte(16) & 15;
+ }
+
+ public void setFleeceColor(int var1) {
+ byte var2 = this.dataWatcher.getWatchableObjectByte(16);
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & 240 | var1 & 15)));
+ }
+
+ public boolean func_21069_f_() {
+ return (this.dataWatcher.getWatchableObjectByte(16) & 16) != 0;
+ }
+
+ public void setSheared(boolean var1) {
+ byte var2 = this.dataWatcher.getWatchableObjectByte(16);
+ if(var1) {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 16)));
+ } else {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -17)));
+ }
+
+ }
+
+ public static int func_21066_a(Random var0) {
+ int var1 = var0.nextInt(100);
+ return var1 < 5 ? 15 : (var1 < 10 ? 7 : (var1 < 15 ? 8 : (var1 < 18 ? 12 : (var0.nextInt(500) == 0 ? 6 : 0))));
+ }
+}
diff --git a/src/net/minecraft/src/EntitySkeleton.java b/src/net/minecraft/src/EntitySkeleton.java
new file mode 100644
index 0000000..38df440
--- /dev/null
+++ b/src/net/minecraft/src/EntitySkeleton.java
@@ -0,0 +1,82 @@
+package net.minecraft.src;
+
+public class EntitySkeleton extends EntityMob {
+ private static final ItemStack defaultHeldItem = new ItemStack(Item.bow, 1);
+
+ public EntitySkeleton(World var1) {
+ super(var1);
+ this.texture = "/mob/skeleton.png";
+ }
+
+ protected String getLivingSound() {
+ return "mob.skeleton";
+ }
+
+ protected String getHurtSound() {
+ return "mob.skeletonhurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.skeletonhurt";
+ }
+
+ public void onLivingUpdate() {
+ if(this.worldObj.isDaytime()) {
+ float var1 = this.getEntityBrightness(1.0F);
+ if(var1 > 0.5F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F) {
+ this.fire = 300;
+ }
+ }
+
+ super.onLivingUpdate();
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ if(var2 < 10.0F) {
+ double var3 = var1.posX - this.posX;
+ double var5 = var1.posZ - this.posZ;
+ if(this.attackTime == 0) {
+ EntityArrow var7 = new EntityArrow(this.worldObj, this);
+ var7.posY += (double)1.4F;
+ double var8 = var1.posY + (double)var1.getEyeHeight() - (double)0.2F - var7.posY;
+ float var10 = MathHelper.sqrt_double(var3 * var3 + var5 * var5) * 0.2F;
+ this.worldObj.playSoundAtEntity(this, "random.bow", 1.0F, 1.0F / (this.rand.nextFloat() * 0.4F + 0.8F));
+ this.worldObj.entityJoinedWorld(var7);
+ var7.setArrowHeading(var3, var8 + (double)var10, var5, 0.6F, 12.0F);
+ this.attackTime = 30;
+ }
+
+ this.rotationYaw = (float)(Math.atan2(var5, var3) * 180.0D / (double)((float)Math.PI)) - 90.0F;
+ this.hasAttacked = true;
+ }
+
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ protected int getDropItemId() {
+ return Item.arrow.shiftedIndex;
+ }
+
+ protected void dropFewItems() {
+ int var1 = this.rand.nextInt(3);
+
+ int var2;
+ for(var2 = 0; var2 < var1; ++var2) {
+ this.dropItem(Item.arrow.shiftedIndex, 1);
+ }
+
+ var1 = this.rand.nextInt(3);
+
+ for(var2 = 0; var2 < var1; ++var2) {
+ this.dropItem(Item.bone.shiftedIndex, 1);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/EntitySlime.java b/src/net/minecraft/src/EntitySlime.java
new file mode 100644
index 0000000..1b5d7fa
--- /dev/null
+++ b/src/net/minecraft/src/EntitySlime.java
@@ -0,0 +1,142 @@
+package net.minecraft.src;
+
+public class EntitySlime extends EntityLiving implements IMob {
+ public float field_401_a;
+ public float field_400_b;
+ private int ticksTillJump = 0;
+
+ public EntitySlime(World var1) {
+ super(var1);
+ this.texture = "/mob/slime.png";
+ int var2 = 1 << this.rand.nextInt(3);
+ this.yOffset = 0.0F;
+ this.ticksTillJump = this.rand.nextInt(20) + 10;
+ this.setSlimeSize(var2);
+ }
+
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(16, new Byte((byte)1));
+ }
+
+ public void setSlimeSize(int var1) {
+ this.dataWatcher.updateObject(16, new Byte((byte)var1));
+ this.setSize(0.6F * (float)var1, 0.6F * (float)var1);
+ this.health = var1 * var1;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public int func_25027_m() {
+ return this.dataWatcher.getWatchableObjectByte(16);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setInteger("Size", this.func_25027_m() - 1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.setSlimeSize(var1.getInteger("Size") + 1);
+ }
+
+ public void onUpdate() {
+ this.field_400_b = this.field_401_a;
+ boolean var1 = this.onGround;
+ super.onUpdate();
+ if(this.onGround && !var1) {
+ int var2 = this.func_25027_m();
+
+ for(int var3 = 0; var3 < var2 * 8; ++var3) {
+ float var4 = this.rand.nextFloat() * (float)Math.PI * 2.0F;
+ float var5 = this.rand.nextFloat() * 0.5F + 0.5F;
+ float var6 = MathHelper.sin(var4) * (float)var2 * 0.5F * var5;
+ float var7 = MathHelper.cos(var4) * (float)var2 * 0.5F * var5;
+ this.worldObj.spawnParticle("slime", this.posX + (double)var6, this.boundingBox.minY, this.posZ + (double)var7, 0.0D, 0.0D, 0.0D);
+ }
+
+ if(var2 > 2) {
+ this.worldObj.playSoundAtEntity(this, "mob.slime", this.getSoundVolume(), ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) / 0.8F);
+ }
+
+ this.field_401_a = -0.5F;
+ }
+
+ this.field_401_a *= 0.6F;
+ }
+
+ protected void updatePlayerActionState() {
+ this.func_27013_Q();
+ EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, 16.0D);
+ if(var1 != null) {
+ this.faceEntity(var1, 10.0F, 20.0F);
+ }
+
+ if(this.onGround && this.ticksTillJump-- <= 0) {
+ this.ticksTillJump = this.rand.nextInt(20) + 10;
+ if(var1 != null) {
+ this.ticksTillJump /= 3;
+ }
+
+ this.isJumping = true;
+ if(this.func_25027_m() > 1) {
+ this.worldObj.playSoundAtEntity(this, "mob.slime", this.getSoundVolume(), ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 0.8F);
+ }
+
+ this.field_401_a = 1.0F;
+ this.moveStrafing = 1.0F - this.rand.nextFloat() * 2.0F;
+ this.moveForward = (float)(1 * this.func_25027_m());
+ } else {
+ this.isJumping = false;
+ if(this.onGround) {
+ this.moveStrafing = this.moveForward = 0.0F;
+ }
+ }
+
+ }
+
+ public void setEntityDead() {
+ int var1 = this.func_25027_m();
+ if(!this.worldObj.singleplayerWorld && var1 > 1 && this.health == 0) {
+ for(int var2 = 0; var2 < 4; ++var2) {
+ float var3 = ((float)(var2 % 2) - 0.5F) * (float)var1 / 4.0F;
+ float var4 = ((float)(var2 / 2) - 0.5F) * (float)var1 / 4.0F;
+ EntitySlime var5 = new EntitySlime(this.worldObj);
+ var5.setSlimeSize(var1 / 2);
+ var5.setLocationAndAngles(this.posX + (double)var3, this.posY + 0.5D, this.posZ + (double)var4, this.rand.nextFloat() * 360.0F, 0.0F);
+ this.worldObj.entityJoinedWorld(var5);
+ }
+ }
+
+ super.setEntityDead();
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ int var2 = this.func_25027_m();
+ if(var2 > 1 && this.canEntityBeSeen(var1) && (double)this.getDistanceToEntity(var1) < 0.6D * (double)var2 && var1.attackEntityFrom(this, var2)) {
+ this.worldObj.playSoundAtEntity(this, "mob.slimeattack", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ }
+
+ protected String getHurtSound() {
+ return "mob.slime";
+ }
+
+ protected String getDeathSound() {
+ return "mob.slime";
+ }
+
+ protected int getDropItemId() {
+ return this.func_25027_m() == 1 ? Item.slimeBall.shiftedIndex : 0;
+ }
+
+ public boolean getCanSpawnHere() {
+ Chunk var1 = this.worldObj.getChunkFromBlockCoords(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posZ));
+ return (this.func_25027_m() == 1 || this.worldObj.difficultySetting > 0) && this.rand.nextInt(10) == 0 && var1.func_334_a(987234911L).nextInt(10) == 0 && this.posY < 16.0D;
+ }
+
+ protected float getSoundVolume() {
+ return 0.6F;
+ }
+}
diff --git a/src/net/minecraft/src/EntitySnowball.java b/src/net/minecraft/src/EntitySnowball.java
new file mode 100644
index 0000000..34f1b9f
--- /dev/null
+++ b/src/net/minecraft/src/EntitySnowball.java
@@ -0,0 +1,212 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntitySnowball extends Entity {
+ private int xTileSnowball = -1;
+ private int yTileSnowball = -1;
+ private int zTileSnowball = -1;
+ private int inTileSnowball = 0;
+ private boolean inGroundSnowball = false;
+ public int shakeSnowball = 0;
+ private EntityLiving owner;
+ private int ticksOnGround;
+ private int ticksInAir = 0;
+
+ public EntitySnowball(World var1) {
+ super(var1);
+ this.setSize(0.25F, 0.25F);
+ }
+
+ protected void entityInit() {
+ }
+
+ public EntitySnowball(World var1, EntityLiving var2) {
+ super(var1);
+ this.owner = var2;
+ this.setSize(0.25F, 0.25F);
+ this.setLocationAndAngles(var2.posX, var2.posY + (double)var2.getEyeHeight(), var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.posY -= (double)0.1F;
+ this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.yOffset = 0.0F;
+ float var3 = 0.4F;
+ this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.func_6141_a(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F);
+ }
+
+ public EntitySnowball(World var1, double var2, double var4, double var6) {
+ super(var1);
+ this.ticksOnGround = 0;
+ this.setSize(0.25F, 0.25F);
+ this.setPosition(var2, var4, var6);
+ this.yOffset = 0.0F;
+ }
+
+ public void func_6141_a(double var1, double var3, double var5, float var7, float var8) {
+ float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);
+ var1 /= (double)var9;
+ var3 /= (double)var9;
+ var5 /= (double)var9;
+ var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var1 *= (double)var7;
+ var3 *= (double)var7;
+ var5 *= (double)var7;
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI));
+ this.ticksOnGround = 0;
+ }
+
+ public void onUpdate() {
+ this.lastTickPosX = this.posX;
+ this.lastTickPosY = this.posY;
+ this.lastTickPosZ = this.posZ;
+ super.onUpdate();
+ if(this.shakeSnowball > 0) {
+ --this.shakeSnowball;
+ }
+
+ if(this.inGroundSnowball) {
+ int var1 = this.worldObj.getBlockId(this.xTileSnowball, this.yTileSnowball, this.zTileSnowball);
+ if(var1 == this.inTileSnowball) {
+ ++this.ticksOnGround;
+ if(this.ticksOnGround == 1200) {
+ this.setEntityDead();
+ }
+
+ return;
+ }
+
+ this.inGroundSnowball = false;
+ this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
+ this.ticksOnGround = 0;
+ this.ticksInAir = 0;
+ } else {
+ ++this.ticksInAir;
+ }
+
+ Vec3D var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var15, var2);
+ var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if(var3 != null) {
+ var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord);
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ Entity var4 = null;
+ List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(1.0D, 1.0D, 1.0D));
+ double var6 = 0.0D;
+
+ for(int var8 = 0; var8 < var5.size(); ++var8) {
+ Entity var9 = (Entity)var5.get(var8);
+ if(var9.canBeCollidedWith() && (var9 != this.owner || this.ticksInAir >= 5)) {
+ float var10 = 0.3F;
+ AxisAlignedBB var11 = var9.boundingBox.expand((double)var10, (double)var10, (double)var10);
+ MovingObjectPosition var12 = var11.func_706_a(var15, var2);
+ if(var12 != null) {
+ double var13 = var15.distanceTo(var12.hitVec);
+ if(var13 < var6 || var6 == 0.0D) {
+ var4 = var9;
+ var6 = var13;
+ }
+ }
+ }
+ }
+
+ if(var4 != null) {
+ var3 = new MovingObjectPosition(var4);
+ }
+ }
+
+ if(var3 != null) {
+ if(var3.entityHit != null && var3.entityHit.attackEntityFrom(this.owner, 0)) {
+ }
+
+ for(int var16 = 0; var16 < 8; ++var16) {
+ this.worldObj.spawnParticle("snowballpoof", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D);
+ }
+
+ this.setEntityDead();
+ }
+
+ this.posX += this.motionX;
+ this.posY += this.motionY;
+ this.posZ += this.motionZ;
+ float var17 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+
+ for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var17) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float var18 = 0.99F;
+ float var19 = 0.03F;
+ if(this.isInWater()) {
+ for(int var7 = 0; var7 < 4; ++var7) {
+ float var20 = 0.25F;
+ this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var20, this.posY - this.motionY * (double)var20, this.posZ - this.motionZ * (double)var20, this.motionX, this.motionY, this.motionZ);
+ }
+
+ var18 = 0.8F;
+ }
+
+ this.motionX *= (double)var18;
+ this.motionY *= (double)var18;
+ this.motionZ *= (double)var18;
+ this.motionY -= (double)var19;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("xTile", (short)this.xTileSnowball);
+ var1.setShort("yTile", (short)this.yTileSnowball);
+ var1.setShort("zTile", (short)this.zTileSnowball);
+ var1.setByte("inTile", (byte)this.inTileSnowball);
+ var1.setByte("shake", (byte)this.shakeSnowball);
+ var1.setByte("inGround", (byte)(this.inGroundSnowball ? 1 : 0));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.xTileSnowball = var1.getShort("xTile");
+ this.yTileSnowball = var1.getShort("yTile");
+ this.zTileSnowball = var1.getShort("zTile");
+ this.inTileSnowball = var1.getByte("inTile") & 255;
+ this.shakeSnowball = var1.getByte("shake") & 255;
+ this.inGroundSnowball = var1.getByte("inGround") == 1;
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ if(this.inGroundSnowball && this.owner == var1 && this.shakeSnowball <= 0 && var1.inventory.addItemStackToInventory(new ItemStack(Item.arrow, 1))) {
+ this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
+ var1.onItemPickup(this, 1);
+ this.setEntityDead();
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/EntitySpider.java b/src/net/minecraft/src/EntitySpider.java
new file mode 100644
index 0000000..d80967b
--- /dev/null
+++ b/src/net/minecraft/src/EntitySpider.java
@@ -0,0 +1,77 @@
+package net.minecraft.src;
+
+public class EntitySpider extends EntityMob {
+ public EntitySpider(World var1) {
+ super(var1);
+ this.texture = "/mob/spider.png";
+ this.setSize(1.4F, 0.9F);
+ this.moveSpeed = 0.8F;
+ }
+
+ public double getMountedYOffset() {
+ return (double)this.height * 0.75D - 0.5D;
+ }
+
+ protected boolean func_25017_l() {
+ return false;
+ }
+
+ protected Entity findPlayerToAttack() {
+ float var1 = this.getEntityBrightness(1.0F);
+ if(var1 < 0.5F) {
+ double var2 = 16.0D;
+ return this.worldObj.getClosestPlayerToEntity(this, var2);
+ } else {
+ return null;
+ }
+ }
+
+ protected String getLivingSound() {
+ return "mob.spider";
+ }
+
+ protected String getHurtSound() {
+ return "mob.spider";
+ }
+
+ protected String getDeathSound() {
+ return "mob.spiderdeath";
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ float var3 = this.getEntityBrightness(1.0F);
+ if(var3 > 0.5F && this.rand.nextInt(100) == 0) {
+ this.playerToAttack = null;
+ } else {
+ if(var2 > 2.0F && var2 < 6.0F && this.rand.nextInt(10) == 0) {
+ if(this.onGround) {
+ double var4 = var1.posX - this.posX;
+ double var6 = var1.posZ - this.posZ;
+ float var8 = MathHelper.sqrt_double(var4 * var4 + var6 * var6);
+ this.motionX = var4 / (double)var8 * 0.5D * (double)0.8F + this.motionX * (double)0.2F;
+ this.motionZ = var6 / (double)var8 * 0.5D * (double)0.8F + this.motionZ * (double)0.2F;
+ this.motionY = (double)0.4F;
+ }
+ } else {
+ super.attackEntity(var1, var2);
+ }
+
+ }
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ protected int getDropItemId() {
+ return Item.silk.shiftedIndex;
+ }
+
+ public boolean isOnLadder() {
+ return this.isCollidedHorizontally;
+ }
+}
diff --git a/src/net/minecraft/src/EntitySquid.java b/src/net/minecraft/src/EntitySquid.java
new file mode 100644
index 0000000..8eb712e
--- /dev/null
+++ b/src/net/minecraft/src/EntitySquid.java
@@ -0,0 +1,141 @@
+package net.minecraft.src;
+
+public class EntitySquid extends EntityWaterMob {
+ public float field_21063_a = 0.0F;
+ public float field_21062_b = 0.0F;
+ public float field_21061_c = 0.0F;
+ public float field_21059_f = 0.0F;
+ public float field_21060_ak = 0.0F;
+ public float field_21058_al = 0.0F;
+ public float field_21057_am = 0.0F;
+ public float field_21056_an = 0.0F;
+ private float field_21055_ao = 0.0F;
+ private float field_21054_ap = 0.0F;
+ private float field_21053_aq = 0.0F;
+ private float field_21052_ar = 0.0F;
+ private float field_21051_as = 0.0F;
+ private float field_21050_at = 0.0F;
+
+ public EntitySquid(World var1) {
+ super(var1);
+ this.texture = "/mob/squid.png";
+ this.setSize(0.95F, 0.95F);
+ this.field_21054_ap = 1.0F / (this.rand.nextFloat() + 1.0F) * 0.2F;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ protected String getLivingSound() {
+ return null;
+ }
+
+ protected String getHurtSound() {
+ return null;
+ }
+
+ protected String getDeathSound() {
+ return null;
+ }
+
+ protected float getSoundVolume() {
+ return 0.4F;
+ }
+
+ protected int getDropItemId() {
+ return 0;
+ }
+
+ protected void dropFewItems() {
+ int var1 = this.rand.nextInt(3) + 1;
+
+ for(int var2 = 0; var2 < var1; ++var2) {
+ this.entityDropItem(new ItemStack(Item.dyePowder, 1, 0), 0.0F);
+ }
+
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ return false;
+ }
+
+ public boolean isInWater() {
+ return this.worldObj.handleMaterialAcceleration(this.boundingBox.expand(0.0D, (double)-0.6F, 0.0D), Material.water, this);
+ }
+
+ public void onLivingUpdate() {
+ super.onLivingUpdate();
+ this.field_21062_b = this.field_21063_a;
+ this.field_21059_f = this.field_21061_c;
+ this.field_21058_al = this.field_21060_ak;
+ this.field_21056_an = this.field_21057_am;
+ this.field_21060_ak += this.field_21054_ap;
+ if(this.field_21060_ak > (float)Math.PI * 2.0F) {
+ this.field_21060_ak -= (float)Math.PI * 2.0F;
+ if(this.rand.nextInt(10) == 0) {
+ this.field_21054_ap = 1.0F / (this.rand.nextFloat() + 1.0F) * 0.2F;
+ }
+ }
+
+ if(this.isInWater()) {
+ float var1;
+ if(this.field_21060_ak < (float)Math.PI) {
+ var1 = this.field_21060_ak / (float)Math.PI;
+ this.field_21057_am = MathHelper.sin(var1 * var1 * (float)Math.PI) * (float)Math.PI * 0.25F;
+ if((double)var1 > 0.75D) {
+ this.field_21055_ao = 1.0F;
+ this.field_21053_aq = 1.0F;
+ } else {
+ this.field_21053_aq *= 0.8F;
+ }
+ } else {
+ this.field_21057_am = 0.0F;
+ this.field_21055_ao *= 0.9F;
+ this.field_21053_aq *= 0.99F;
+ }
+
+ if(!this.isMultiplayerEntity) {
+ this.motionX = (double)(this.field_21052_ar * this.field_21055_ao);
+ this.motionY = (double)(this.field_21051_as * this.field_21055_ao);
+ this.motionZ = (double)(this.field_21050_at * this.field_21055_ao);
+ }
+
+ var1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.renderYawOffset += (-((float)Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float)Math.PI - this.renderYawOffset) * 0.1F;
+ this.rotationYaw = this.renderYawOffset;
+ this.field_21061_c += (float)Math.PI * this.field_21053_aq * 1.5F;
+ this.field_21063_a += (-((float)Math.atan2((double)var1, this.motionY)) * 180.0F / (float)Math.PI - this.field_21063_a) * 0.1F;
+ } else {
+ this.field_21057_am = MathHelper.abs(MathHelper.sin(this.field_21060_ak)) * (float)Math.PI * 0.25F;
+ if(!this.isMultiplayerEntity) {
+ this.motionX = 0.0D;
+ this.motionY -= 0.08D;
+ this.motionY *= (double)0.98F;
+ this.motionZ = 0.0D;
+ }
+
+ this.field_21063_a = (float)((double)this.field_21063_a + (double)(-90.0F - this.field_21063_a) * 0.02D);
+ }
+
+ }
+
+ public void moveEntityWithHeading(float var1, float var2) {
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ }
+
+ protected void updatePlayerActionState() {
+ if(this.rand.nextInt(50) == 0 || !this.inWater || this.field_21052_ar == 0.0F && this.field_21051_as == 0.0F && this.field_21050_at == 0.0F) {
+ float var1 = this.rand.nextFloat() * (float)Math.PI * 2.0F;
+ this.field_21052_ar = MathHelper.cos(var1) * 0.2F;
+ this.field_21051_as = -0.1F + this.rand.nextFloat() * 0.2F;
+ this.field_21050_at = MathHelper.sin(var1) * 0.2F;
+ }
+
+ this.func_27013_Q();
+ }
+}
diff --git a/src/net/minecraft/src/EntityTNTPrimed.java b/src/net/minecraft/src/EntityTNTPrimed.java
new file mode 100644
index 0000000..4d31838
--- /dev/null
+++ b/src/net/minecraft/src/EntityTNTPrimed.java
@@ -0,0 +1,78 @@
+package net.minecraft.src;
+
+public class EntityTNTPrimed extends Entity {
+ public int fuse;
+
+ public EntityTNTPrimed(World var1) {
+ super(var1);
+ this.fuse = 0;
+ this.preventEntitySpawning = true;
+ this.setSize(0.98F, 0.98F);
+ this.yOffset = this.height / 2.0F;
+ }
+
+ public EntityTNTPrimed(World var1, double var2, double var4, double var6) {
+ this(var1);
+ this.setPosition(var2, var4, var6);
+ float var8 = (float)(Math.random() * (double)((float)Math.PI) * 2.0D);
+ this.motionX = (double)(-MathHelper.sin(var8 * (float)Math.PI / 180.0F) * 0.02F);
+ this.motionY = (double)0.2F;
+ this.motionZ = (double)(-MathHelper.cos(var8 * (float)Math.PI / 180.0F) * 0.02F);
+ this.fuse = 80;
+ this.prevPosX = var2;
+ this.prevPosY = var4;
+ this.prevPosZ = var6;
+ }
+
+ protected void entityInit() {
+ }
+
+ protected boolean func_25017_l() {
+ return false;
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY -= (double)0.04F;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.98F;
+ this.motionY *= (double)0.98F;
+ this.motionZ *= (double)0.98F;
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ this.motionY *= -0.5D;
+ }
+
+ if(this.fuse-- <= 0) {
+ if(!this.worldObj.singleplayerWorld) {
+ this.setEntityDead();
+ this.explode();
+ } else {
+ this.setEntityDead();
+ }
+ } else {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+
+ private void explode() {
+ float var1 = 4.0F;
+ this.worldObj.createExplosion((Entity)null, this.posX, this.posY, this.posZ, var1);
+ }
+
+ protected void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setByte("Fuse", (byte)this.fuse);
+ }
+
+ protected void readEntityFromNBT(NBTTagCompound var1) {
+ this.fuse = var1.getByte("Fuse");
+ }
+}
diff --git a/src/net/minecraft/src/EntityTracker.java b/src/net/minecraft/src/EntityTracker.java
new file mode 100644
index 0000000..d29d3e2
--- /dev/null
+++ b/src/net/minecraft/src/EntityTracker.java
@@ -0,0 +1,153 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import net.minecraft.server.MinecraftServer;
+
+public class EntityTracker {
+ private Set trackedEntitySet = new HashSet();
+ private MCHash trackedEntityHashTable = new MCHash();
+ private MinecraftServer mcServer;
+ private int maxTrackingDistanceThreshold;
+ private int field_28113_e;
+
+ public EntityTracker(MinecraftServer var1, int var2) {
+ this.mcServer = var1;
+ this.field_28113_e = var2;
+ this.maxTrackingDistanceThreshold = var1.configManager.getMaxTrackingDistance();
+ }
+
+ public void trackEntity(Entity var1) {
+ if(var1 instanceof EntityPlayerMP) {
+ this.trackEntity(var1, 512, 2);
+ EntityPlayerMP var2 = (EntityPlayerMP)var1;
+ Iterator var3 = this.trackedEntitySet.iterator();
+
+ while(var3.hasNext()) {
+ EntityTrackerEntry var4 = (EntityTrackerEntry)var3.next();
+ if(var4.trackedEntity != var2) {
+ var4.updatePlayerEntity(var2);
+ }
+ }
+ } else if(var1 instanceof EntityFish) {
+ this.trackEntity(var1, 64, 5, true);
+ } else if(var1 instanceof EntityArrow) {
+ this.trackEntity(var1, 64, 20, false);
+ } else if(var1 instanceof EntityFireball) {
+ this.trackEntity(var1, 64, 10, false);
+ } else if(var1 instanceof EntitySnowball) {
+ this.trackEntity(var1, 64, 10, true);
+ } else if(var1 instanceof EntityEgg) {
+ this.trackEntity(var1, 64, 10, true);
+ } else if(var1 instanceof EntityItem) {
+ this.trackEntity(var1, 64, 20, true);
+ } else if(var1 instanceof EntityMinecart) {
+ this.trackEntity(var1, 160, 5, true);
+ } else if(var1 instanceof EntityBoat) {
+ this.trackEntity(var1, 160, 5, true);
+ } else if(var1 instanceof EntitySquid) {
+ this.trackEntity(var1, 160, 3, true);
+ } else if(var1 instanceof IAnimals) {
+ this.trackEntity(var1, 160, 3);
+ } else if(var1 instanceof EntityTNTPrimed) {
+ this.trackEntity(var1, 160, 10, true);
+ } else if(var1 instanceof EntityFallingSand) {
+ this.trackEntity(var1, 160, 20, true);
+ } else if(var1 instanceof EntityPainting) {
+ this.trackEntity(var1, 160, Integer.MAX_VALUE, false);
+ }
+
+ }
+
+ public void trackEntity(Entity var1, int var2, int var3) {
+ this.trackEntity(var1, var2, var3, false);
+ }
+
+ public void trackEntity(Entity var1, int var2, int var3, boolean var4) {
+ if(var2 > this.maxTrackingDistanceThreshold) {
+ var2 = this.maxTrackingDistanceThreshold;
+ }
+
+ if(this.trackedEntityHashTable.containsItem(var1.entityId)) {
+ throw new IllegalStateException("Entity is already tracked!");
+ } else {
+ EntityTrackerEntry var5 = new EntityTrackerEntry(var1, var2, var3, var4);
+ this.trackedEntitySet.add(var5);
+ this.trackedEntityHashTable.addKey(var1.entityId, var5);
+ var5.updatePlayerEntities(this.mcServer.getWorldManager(this.field_28113_e).playerEntities);
+ }
+ }
+
+ public void untrackEntity(Entity var1) {
+ if(var1 instanceof EntityPlayerMP) {
+ EntityPlayerMP var2 = (EntityPlayerMP)var1;
+ Iterator var3 = this.trackedEntitySet.iterator();
+
+ while(var3.hasNext()) {
+ EntityTrackerEntry var4 = (EntityTrackerEntry)var3.next();
+ var4.removeFromTrackedPlayers(var2);
+ }
+ }
+
+ EntityTrackerEntry var5 = (EntityTrackerEntry)this.trackedEntityHashTable.removeObject(var1.entityId);
+ if(var5 != null) {
+ this.trackedEntitySet.remove(var5);
+ var5.sendDestroyEntityPacketToTrackedPlayers();
+ }
+
+ }
+
+ public void updateTrackedEntities() {
+ ArrayList var1 = new ArrayList();
+ Iterator var2 = this.trackedEntitySet.iterator();
+
+ while(var2.hasNext()) {
+ EntityTrackerEntry var3 = (EntityTrackerEntry)var2.next();
+ var3.updatePlayerList(this.mcServer.getWorldManager(this.field_28113_e).playerEntities);
+ if(var3.playerEntitiesUpdated && var3.trackedEntity instanceof EntityPlayerMP) {
+ var1.add((EntityPlayerMP)var3.trackedEntity);
+ }
+ }
+
+ for(int var6 = 0; var6 < var1.size(); ++var6) {
+ EntityPlayerMP var7 = (EntityPlayerMP)var1.get(var6);
+ Iterator var4 = this.trackedEntitySet.iterator();
+
+ while(var4.hasNext()) {
+ EntityTrackerEntry var5 = (EntityTrackerEntry)var4.next();
+ if(var5.trackedEntity != var7) {
+ var5.updatePlayerEntity(var7);
+ }
+ }
+ }
+
+ }
+
+ public void sendPacketToTrackedPlayers(Entity var1, Packet var2) {
+ EntityTrackerEntry var3 = (EntityTrackerEntry)this.trackedEntityHashTable.lookup(var1.entityId);
+ if(var3 != null) {
+ var3.sendPacketToTrackedPlayers(var2);
+ }
+
+ }
+
+ public void sendPacketToTrackedPlayersAndTrackedEntity(Entity var1, Packet var2) {
+ EntityTrackerEntry var3 = (EntityTrackerEntry)this.trackedEntityHashTable.lookup(var1.entityId);
+ if(var3 != null) {
+ var3.sendPacketToTrackedPlayersAndTrackedEntity(var2);
+ }
+
+ }
+
+ public void removeTrackedPlayerSymmetric(EntityPlayerMP var1) {
+ Iterator var2 = this.trackedEntitySet.iterator();
+
+ while(var2.hasNext()) {
+ EntityTrackerEntry var3 = (EntityTrackerEntry)var2.next();
+ var3.removeTrackedPlayerSymmetric(var1);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/EntityTrackerEntry.java b/src/net/minecraft/src/EntityTrackerEntry.java
new file mode 100644
index 0000000..a6e1aaa
--- /dev/null
+++ b/src/net/minecraft/src/EntityTrackerEntry.java
@@ -0,0 +1,278 @@
+package net.minecraft.src;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+public class EntityTrackerEntry {
+ public Entity trackedEntity;
+ public int trackingDistanceThreshold;
+ public int field_9234_e;
+ public int encodedPosX;
+ public int encodedPosY;
+ public int encodedPosZ;
+ public int encodedRotationYaw;
+ public int encodedRotationPitch;
+ public double lastTrackedEntityMotionX;
+ public double lastTrackedEntityMotionY;
+ public double lastTrackedEntityMotionZ;
+ public int updateCounter = 0;
+ private double lastTrackedEntityPosX;
+ private double lastTrackedEntityPosY;
+ private double lastTrackedEntityPosZ;
+ private boolean firstUpdateDone = false;
+ private boolean shouldSendMotionUpdates;
+ private int field_28165_t = 0;
+ public boolean playerEntitiesUpdated = false;
+ public Set trackedPlayers = new HashSet();
+
+ public EntityTrackerEntry(Entity var1, int var2, int var3, boolean var4) {
+ this.trackedEntity = var1;
+ this.trackingDistanceThreshold = var2;
+ this.field_9234_e = var3;
+ this.shouldSendMotionUpdates = var4;
+ this.encodedPosX = MathHelper.floor_double(var1.posX * 32.0D);
+ this.encodedPosY = MathHelper.floor_double(var1.posY * 32.0D);
+ this.encodedPosZ = MathHelper.floor_double(var1.posZ * 32.0D);
+ this.encodedRotationYaw = MathHelper.floor_float(var1.rotationYaw * 256.0F / 360.0F);
+ this.encodedRotationPitch = MathHelper.floor_float(var1.rotationPitch * 256.0F / 360.0F);
+ }
+
+ public boolean equals(Object var1) {
+ return var1 instanceof EntityTrackerEntry ? ((EntityTrackerEntry)var1).trackedEntity.entityId == this.trackedEntity.entityId : false;
+ }
+
+ public int hashCode() {
+ return this.trackedEntity.entityId;
+ }
+
+ public void updatePlayerList(List var1) {
+ this.playerEntitiesUpdated = false;
+ if(!this.firstUpdateDone || this.trackedEntity.getDistanceSq(this.lastTrackedEntityPosX, this.lastTrackedEntityPosY, this.lastTrackedEntityPosZ) > 16.0D) {
+ this.lastTrackedEntityPosX = this.trackedEntity.posX;
+ this.lastTrackedEntityPosY = this.trackedEntity.posY;
+ this.lastTrackedEntityPosZ = this.trackedEntity.posZ;
+ this.firstUpdateDone = true;
+ this.playerEntitiesUpdated = true;
+ this.updatePlayerEntities(var1);
+ }
+
+ ++this.field_28165_t;
+ if(++this.updateCounter % this.field_9234_e == 0) {
+ int var2 = MathHelper.floor_double(this.trackedEntity.posX * 32.0D);
+ int var3 = MathHelper.floor_double(this.trackedEntity.posY * 32.0D);
+ int var4 = MathHelper.floor_double(this.trackedEntity.posZ * 32.0D);
+ int var5 = MathHelper.floor_float(this.trackedEntity.rotationYaw * 256.0F / 360.0F);
+ int var6 = MathHelper.floor_float(this.trackedEntity.rotationPitch * 256.0F / 360.0F);
+ int var7 = var2 - this.encodedPosX;
+ int var8 = var3 - this.encodedPosY;
+ int var9 = var4 - this.encodedPosZ;
+ Object var10 = null;
+ boolean var11 = Math.abs(var2) >= 8 || Math.abs(var3) >= 8 || Math.abs(var4) >= 8;
+ boolean var12 = Math.abs(var5 - this.encodedRotationYaw) >= 8 || Math.abs(var6 - this.encodedRotationPitch) >= 8;
+ if(var7 >= -128 && var7 < 128 && var8 >= -128 && var8 < 128 && var9 >= -128 && var9 < 128 && this.field_28165_t <= 400) {
+ if(var11 && var12) {
+ var10 = new Packet33RelEntityMoveLook(this.trackedEntity.entityId, (byte)var7, (byte)var8, (byte)var9, (byte)var5, (byte)var6);
+ } else if(var11) {
+ var10 = new Packet31RelEntityMove(this.trackedEntity.entityId, (byte)var7, (byte)var8, (byte)var9);
+ } else if(var12) {
+ var10 = new Packet32EntityLook(this.trackedEntity.entityId, (byte)var5, (byte)var6);
+ }
+ } else {
+ this.field_28165_t = 0;
+ this.trackedEntity.posX = (double)var2 / 32.0D;
+ this.trackedEntity.posY = (double)var3 / 32.0D;
+ this.trackedEntity.posZ = (double)var4 / 32.0D;
+ var10 = new Packet34EntityTeleport(this.trackedEntity.entityId, var2, var3, var4, (byte)var5, (byte)var6);
+ }
+
+ if(this.shouldSendMotionUpdates) {
+ double var13 = this.trackedEntity.motionX - this.lastTrackedEntityMotionX;
+ double var15 = this.trackedEntity.motionY - this.lastTrackedEntityMotionY;
+ double var17 = this.trackedEntity.motionZ - this.lastTrackedEntityMotionZ;
+ double var19 = 0.02D;
+ double var21 = var13 * var13 + var15 * var15 + var17 * var17;
+ if(var21 > var19 * var19 || var21 > 0.0D && this.trackedEntity.motionX == 0.0D && this.trackedEntity.motionY == 0.0D && this.trackedEntity.motionZ == 0.0D) {
+ this.lastTrackedEntityMotionX = this.trackedEntity.motionX;
+ this.lastTrackedEntityMotionY = this.trackedEntity.motionY;
+ this.lastTrackedEntityMotionZ = this.trackedEntity.motionZ;
+ this.sendPacketToTrackedPlayers(new Packet28EntityVelocity(this.trackedEntity.entityId, this.lastTrackedEntityMotionX, this.lastTrackedEntityMotionY, this.lastTrackedEntityMotionZ));
+ }
+ }
+
+ if(var10 != null) {
+ this.sendPacketToTrackedPlayers((Packet)var10);
+ }
+
+ DataWatcher var23 = this.trackedEntity.getDataWatcher();
+ if(var23.hasObjectChanged()) {
+ this.sendPacketToTrackedPlayersAndTrackedEntity(new Packet40EntityMetadata(this.trackedEntity.entityId, var23));
+ }
+
+ if(var11) {
+ this.encodedPosX = var2;
+ this.encodedPosY = var3;
+ this.encodedPosZ = var4;
+ }
+
+ if(var12) {
+ this.encodedRotationYaw = var5;
+ this.encodedRotationPitch = var6;
+ }
+ }
+
+ if(this.trackedEntity.beenAttacked) {
+ this.sendPacketToTrackedPlayersAndTrackedEntity(new Packet28EntityVelocity(this.trackedEntity));
+ this.trackedEntity.beenAttacked = false;
+ }
+
+ }
+
+ public void sendPacketToTrackedPlayers(Packet var1) {
+ Iterator var2 = this.trackedPlayers.iterator();
+
+ while(var2.hasNext()) {
+ EntityPlayerMP var3 = (EntityPlayerMP)var2.next();
+ var3.playerNetServerHandler.sendPacket(var1);
+ }
+
+ }
+
+ public void sendPacketToTrackedPlayersAndTrackedEntity(Packet var1) {
+ this.sendPacketToTrackedPlayers(var1);
+ if(this.trackedEntity instanceof EntityPlayerMP) {
+ ((EntityPlayerMP)this.trackedEntity).playerNetServerHandler.sendPacket(var1);
+ }
+
+ }
+
+ public void sendDestroyEntityPacketToTrackedPlayers() {
+ this.sendPacketToTrackedPlayers(new Packet29DestroyEntity(this.trackedEntity.entityId));
+ }
+
+ public void removeFromTrackedPlayers(EntityPlayerMP var1) {
+ if(this.trackedPlayers.contains(var1)) {
+ this.trackedPlayers.remove(var1);
+ }
+
+ }
+
+ public void updatePlayerEntity(EntityPlayerMP var1) {
+ if(var1 != this.trackedEntity) {
+ double var2 = var1.posX - (double)(this.encodedPosX / 32);
+ double var4 = var1.posZ - (double)(this.encodedPosZ / 32);
+ if(var2 >= (double)(-this.trackingDistanceThreshold) && var2 <= (double)this.trackingDistanceThreshold && var4 >= (double)(-this.trackingDistanceThreshold) && var4 <= (double)this.trackingDistanceThreshold) {
+ if(!this.trackedPlayers.contains(var1)) {
+ this.trackedPlayers.add(var1);
+ var1.playerNetServerHandler.sendPacket(this.getSpawnPacket());
+ if(this.shouldSendMotionUpdates) {
+ var1.playerNetServerHandler.sendPacket(new Packet28EntityVelocity(this.trackedEntity.entityId, this.trackedEntity.motionX, this.trackedEntity.motionY, this.trackedEntity.motionZ));
+ }
+
+ ItemStack[] var6 = this.trackedEntity.getInventory();
+ if(var6 != null) {
+ for(int var7 = 0; var7 < var6.length; ++var7) {
+ var1.playerNetServerHandler.sendPacket(new Packet5PlayerInventory(this.trackedEntity.entityId, var7, var6[var7]));
+ }
+ }
+
+ if(this.trackedEntity instanceof EntityPlayer) {
+ EntityPlayer var8 = (EntityPlayer)this.trackedEntity;
+ if(var8.func_22057_E()) {
+ var1.playerNetServerHandler.sendPacket(new Packet17Sleep(this.trackedEntity, 0, MathHelper.floor_double(this.trackedEntity.posX), MathHelper.floor_double(this.trackedEntity.posY), MathHelper.floor_double(this.trackedEntity.posZ)));
+ }
+ }
+ }
+ } else if(this.trackedPlayers.contains(var1)) {
+ this.trackedPlayers.remove(var1);
+ var1.playerNetServerHandler.sendPacket(new Packet29DestroyEntity(this.trackedEntity.entityId));
+ }
+
+ }
+ }
+
+ public void updatePlayerEntities(List var1) {
+ for(int var2 = 0; var2 < var1.size(); ++var2) {
+ this.updatePlayerEntity((EntityPlayerMP)var1.get(var2));
+ }
+
+ }
+
+ private Packet getSpawnPacket() {
+ if(this.trackedEntity instanceof EntityItem) {
+ EntityItem var6 = (EntityItem)this.trackedEntity;
+ Packet21PickupSpawn var7 = new Packet21PickupSpawn(var6);
+ var6.posX = (double)var7.xPosition / 32.0D;
+ var6.posY = (double)var7.yPosition / 32.0D;
+ var6.posZ = (double)var7.zPosition / 32.0D;
+ return var7;
+ } else if(this.trackedEntity instanceof EntityPlayerMP) {
+ return new Packet20NamedEntitySpawn((EntityPlayer)this.trackedEntity);
+ } else {
+ if(this.trackedEntity instanceof EntityMinecart) {
+ EntityMinecart var1 = (EntityMinecart)this.trackedEntity;
+ if(var1.minecartType == 0) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 10);
+ }
+
+ if(var1.minecartType == 1) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 11);
+ }
+
+ if(var1.minecartType == 2) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 12);
+ }
+ }
+
+ if(this.trackedEntity instanceof EntityBoat) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 1);
+ } else if(this.trackedEntity instanceof IAnimals) {
+ return new Packet24MobSpawn((EntityLiving)this.trackedEntity);
+ } else if(this.trackedEntity instanceof EntityFish) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 90);
+ } else if(this.trackedEntity instanceof EntityArrow) {
+ EntityLiving var5 = ((EntityArrow)this.trackedEntity).owner;
+ return new Packet23VehicleSpawn(this.trackedEntity, 60, var5 != null ? var5.entityId : this.trackedEntity.entityId);
+ } else if(this.trackedEntity instanceof EntitySnowball) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 61);
+ } else if(this.trackedEntity instanceof EntityFireball) {
+ EntityFireball var4 = (EntityFireball)this.trackedEntity;
+ Packet23VehicleSpawn var2 = new Packet23VehicleSpawn(this.trackedEntity, 63, ((EntityFireball)this.trackedEntity).owner.entityId);
+ var2.field_28044_e = (int)(var4.field_9199_b * 8000.0D);
+ var2.field_28043_f = (int)(var4.field_9198_c * 8000.0D);
+ var2.field_28042_g = (int)(var4.field_9196_d * 8000.0D);
+ return var2;
+ } else if(this.trackedEntity instanceof EntityEgg) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 62);
+ } else if(this.trackedEntity instanceof EntityTNTPrimed) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 50);
+ } else {
+ if(this.trackedEntity instanceof EntityFallingSand) {
+ EntityFallingSand var3 = (EntityFallingSand)this.trackedEntity;
+ if(var3.blockID == Block.sand.blockID) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 70);
+ }
+
+ if(var3.blockID == Block.gravel.blockID) {
+ return new Packet23VehicleSpawn(this.trackedEntity, 71);
+ }
+ }
+
+ if(this.trackedEntity instanceof EntityPainting) {
+ return new Packet25EntityPainting((EntityPainting)this.trackedEntity);
+ } else {
+ throw new IllegalArgumentException("Don\'t know how to add " + this.trackedEntity.getClass() + "!");
+ }
+ }
+ }
+ }
+
+ public void removeTrackedPlayerSymmetric(EntityPlayerMP var1) {
+ if(this.trackedPlayers.contains(var1)) {
+ this.trackedPlayers.remove(var1);
+ var1.playerNetServerHandler.sendPacket(new Packet29DestroyEntity(this.trackedEntity.entityId));
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/EntityWaterMob.java b/src/net/minecraft/src/EntityWaterMob.java
new file mode 100644
index 0000000..29fac4b
--- /dev/null
+++ b/src/net/minecraft/src/EntityWaterMob.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+public class EntityWaterMob extends EntityCreature implements IAnimals {
+ public EntityWaterMob(World var1) {
+ super(var1);
+ }
+
+ public boolean canBreatheUnderwater() {
+ return true;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ public boolean getCanSpawnHere() {
+ return this.worldObj.checkIfAABBIsClear(this.boundingBox);
+ }
+
+ public int getTalkInterval() {
+ return 120;
+ }
+}
diff --git a/src/net/minecraft/src/EntityWeatherEffect.java b/src/net/minecraft/src/EntityWeatherEffect.java
new file mode 100644
index 0000000..cef0f6b
--- /dev/null
+++ b/src/net/minecraft/src/EntityWeatherEffect.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public abstract class EntityWeatherEffect extends Entity {
+ public EntityWeatherEffect(World var1) {
+ super(var1);
+ }
+}
diff --git a/src/net/minecraft/src/EntityWolf.java b/src/net/minecraft/src/EntityWolf.java
new file mode 100644
index 0000000..da5fe76
--- /dev/null
+++ b/src/net/minecraft/src/EntityWolf.java
@@ -0,0 +1,411 @@
+package net.minecraft.src;
+
+import java.util.Iterator;
+import java.util.List;
+
+public class EntityWolf extends EntityAnimal {
+ private boolean field_25039_a = false;
+ private float field_25038_b;
+ private float field_25044_c;
+ private boolean isWet;
+ private boolean field_25042_g;
+ private float field_25041_h;
+ private float field_25040_i;
+
+ public EntityWolf(World var1) {
+ super(var1);
+ this.texture = "/mob/wolf.png";
+ this.setSize(0.8F, 0.8F);
+ this.moveSpeed = 1.1F;
+ this.health = 8;
+ }
+
+ protected void entityInit() {
+ super.entityInit();
+ this.dataWatcher.addObject(16, Byte.valueOf((byte)0));
+ this.dataWatcher.addObject(17, "");
+ this.dataWatcher.addObject(18, new Integer(this.health));
+ }
+
+ protected boolean func_25017_l() {
+ return false;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setBoolean("Angry", this.getIsAngry());
+ var1.setBoolean("Sitting", this.getIsSitting());
+ if(this.getOwner() == null) {
+ var1.setString("Owner", "");
+ } else {
+ var1.setString("Owner", this.getOwner());
+ }
+
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.setIsAngry(var1.getBoolean("Angry"));
+ this.setIsSitting(var1.getBoolean("Sitting"));
+ String var2 = var1.getString("Owner");
+ if(var2.length() > 0) {
+ this.setOwner(var2);
+ this.setIsTamed(true);
+ }
+
+ }
+
+ protected boolean func_25020_s() {
+ return !this.func_25030_y();
+ }
+
+ protected String getLivingSound() {
+ return this.getIsAngry() ? "mob.wolf.growl" : (this.rand.nextInt(3) == 0 ? (this.func_25030_y() && this.dataWatcher.getWatchableObjectInteger(18) < 10 ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark");
+ }
+
+ protected String getHurtSound() {
+ return "mob.wolf.hurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.wolf.death";
+ }
+
+ protected float getSoundVolume() {
+ return 0.4F;
+ }
+
+ protected int getDropItemId() {
+ return -1;
+ }
+
+ protected void updatePlayerActionState() {
+ super.updatePlayerActionState();
+ if(!this.hasAttacked && !this.getGotPath() && this.func_25030_y() && this.ridingEntity == null) {
+ EntityPlayer var3 = this.worldObj.getPlayerEntityByName(this.getOwner());
+ if(var3 != null) {
+ float var2 = var3.getDistanceToEntity(this);
+ if(var2 > 5.0F) {
+ this.setPathEntity(var3, var2);
+ }
+ } else if(!this.isInWater()) {
+ this.setIsSitting(true);
+ }
+ } else if(this.playerToAttack == null && !this.getGotPath() && !this.func_25030_y() && this.worldObj.rand.nextInt(100) == 0) {
+ List var1 = this.worldObj.getEntitiesWithinAABB(EntitySheep.class, AxisAlignedBB.getBoundingBoxFromPool(this.posX, this.posY, this.posZ, this.posX + 1.0D, this.posY + 1.0D, this.posZ + 1.0D).expand(16.0D, 4.0D, 16.0D));
+ if(!var1.isEmpty()) {
+ this.setEntityToAttack((Entity)var1.get(this.worldObj.rand.nextInt(var1.size())));
+ }
+ }
+
+ if(this.isInWater()) {
+ this.setIsSitting(false);
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ this.dataWatcher.updateObject(18, Integer.valueOf(this.health));
+ }
+
+ }
+
+ public void onLivingUpdate() {
+ super.onLivingUpdate();
+ this.field_25039_a = false;
+ if(this.func_25021_O() && !this.getGotPath() && !this.getIsAngry()) {
+ Entity var1 = this.getCurrentTarget();
+ if(var1 instanceof EntityPlayer) {
+ EntityPlayer var2 = (EntityPlayer)var1;
+ ItemStack var3 = var2.inventory.getCurrentItem();
+ if(var3 != null) {
+ if(!this.func_25030_y() && var3.itemID == Item.bone.shiftedIndex) {
+ this.field_25039_a = true;
+ } else if(this.func_25030_y() && Item.itemsList[var3.itemID] instanceof ItemFood) {
+ this.field_25039_a = ((ItemFood)Item.itemsList[var3.itemID]).func_25010_k();
+ }
+ }
+ }
+ }
+
+ if(!this.isMultiplayerEntity && this.isWet && !this.field_25042_g && !this.getGotPath() && this.onGround) {
+ this.field_25042_g = true;
+ this.field_25041_h = 0.0F;
+ this.field_25040_i = 0.0F;
+ this.worldObj.sendTrackedEntityStatusUpdatePacket(this, (byte)8);
+ }
+
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ this.field_25044_c = this.field_25038_b;
+ if(this.field_25039_a) {
+ this.field_25038_b += (1.0F - this.field_25038_b) * 0.4F;
+ } else {
+ this.field_25038_b += (0.0F - this.field_25038_b) * 0.4F;
+ }
+
+ if(this.field_25039_a) {
+ this.numTicksToChaseTarget = 10;
+ }
+
+ if(this.func_27008_Y()) {
+ this.isWet = true;
+ this.field_25042_g = false;
+ this.field_25041_h = 0.0F;
+ this.field_25040_i = 0.0F;
+ } else if((this.isWet || this.field_25042_g) && this.field_25042_g) {
+ if(this.field_25041_h == 0.0F) {
+ this.worldObj.playSoundAtEntity(this, "mob.wolf.shake", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ this.field_25040_i = this.field_25041_h;
+ this.field_25041_h += 0.05F;
+ if(this.field_25040_i >= 2.0F) {
+ this.isWet = false;
+ this.field_25042_g = false;
+ this.field_25040_i = 0.0F;
+ this.field_25041_h = 0.0F;
+ }
+
+ if(this.field_25041_h > 0.4F) {
+ float var1 = (float)this.boundingBox.minY;
+ int var2 = (int)(MathHelper.sin((this.field_25041_h - 0.4F) * (float)Math.PI) * 7.0F);
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ float var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
+ float var5 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
+ this.worldObj.spawnParticle("splash", this.posX + (double)var4, (double)(var1 + 0.8F), this.posZ + (double)var5, this.motionX, this.motionY, this.motionZ);
+ }
+ }
+ }
+
+ }
+
+ public float getEyeHeight() {
+ return this.height * 0.8F;
+ }
+
+ protected int func_25018_n_() {
+ return this.getIsSitting() ? 20 : super.func_25018_n_();
+ }
+
+ private void setPathEntity(Entity var1, float var2) {
+ PathEntity var3 = this.worldObj.getPathToEntity(this, var1, 16.0F);
+ if(var3 == null && var2 > 12.0F) {
+ int var4 = MathHelper.floor_double(var1.posX) - 2;
+ int var5 = MathHelper.floor_double(var1.posZ) - 2;
+ int var6 = MathHelper.floor_double(var1.boundingBox.minY);
+
+ for(int var7 = 0; var7 <= 4; ++var7) {
+ for(int var8 = 0; var8 <= 4; ++var8) {
+ if((var7 < 1 || var8 < 1 || var7 > 3 || var8 > 3) && this.worldObj.isBlockNormalCube(var4 + var7, var6 - 1, var5 + var8) && !this.worldObj.isBlockNormalCube(var4 + var7, var6, var5 + var8) && !this.worldObj.isBlockNormalCube(var4 + var7, var6 + 1, var5 + var8)) {
+ this.setLocationAndAngles((double)((float)(var4 + var7) + 0.5F), (double)var6, (double)((float)(var5 + var8) + 0.5F), this.rotationYaw, this.rotationPitch);
+ return;
+ }
+ }
+ }
+ } else {
+ this.setPathToEntity(var3);
+ }
+
+ }
+
+ protected boolean func_25026_u() {
+ return this.getIsSitting() || this.field_25042_g;
+ }
+
+ public boolean attackEntityFrom(Entity var1, int var2) {
+ this.setIsSitting(false);
+ if(var1 != null && !(var1 instanceof EntityPlayer) && !(var1 instanceof EntityArrow)) {
+ var2 = (var2 + 1) / 2;
+ }
+
+ if(!super.attackEntityFrom((Entity)var1, var2)) {
+ return false;
+ } else {
+ if(!this.func_25030_y() && !this.getIsAngry()) {
+ if(var1 instanceof EntityPlayer) {
+ this.setIsAngry(true);
+ this.playerToAttack = (Entity)var1;
+ }
+
+ if(var1 instanceof EntityArrow && ((EntityArrow)var1).owner != null) {
+ var1 = ((EntityArrow)var1).owner;
+ }
+
+ if(var1 instanceof EntityLiving) {
+ List var3 = this.worldObj.getEntitiesWithinAABB(EntityWolf.class, AxisAlignedBB.getBoundingBoxFromPool(this.posX, this.posY, this.posZ, this.posX + 1.0D, this.posY + 1.0D, this.posZ + 1.0D).expand(16.0D, 4.0D, 16.0D));
+ Iterator var4 = var3.iterator();
+
+ while(var4.hasNext()) {
+ Entity var5 = (Entity)var4.next();
+ EntityWolf var6 = (EntityWolf)var5;
+ if(!var6.func_25030_y() && var6.playerToAttack == null) {
+ var6.playerToAttack = (Entity)var1;
+ if(var1 instanceof EntityPlayer) {
+ var6.setIsAngry(true);
+ }
+ }
+ }
+ }
+ } else if(var1 != this && var1 != null) {
+ if(this.func_25030_y() && var1 instanceof EntityPlayer && ((EntityPlayer)var1).username.equalsIgnoreCase(this.getOwner())) {
+ return true;
+ }
+
+ this.playerToAttack = (Entity)var1;
+ }
+
+ return true;
+ }
+ }
+
+ protected Entity findPlayerToAttack() {
+ return this.getIsAngry() ? this.worldObj.getClosestPlayerToEntity(this, 16.0D) : null;
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ if(var2 > 2.0F && var2 < 6.0F && this.rand.nextInt(10) == 0) {
+ if(this.onGround) {
+ double var8 = var1.posX - this.posX;
+ double var5 = var1.posZ - this.posZ;
+ float var7 = MathHelper.sqrt_double(var8 * var8 + var5 * var5);
+ this.motionX = var8 / (double)var7 * 0.5D * (double)0.8F + this.motionX * (double)0.2F;
+ this.motionZ = var5 / (double)var7 * 0.5D * (double)0.8F + this.motionZ * (double)0.2F;
+ this.motionY = (double)0.4F;
+ }
+ } else if((double)var2 < 1.5D && var1.boundingBox.maxY > this.boundingBox.minY && var1.boundingBox.minY < this.boundingBox.maxY) {
+ this.attackTime = 20;
+ byte var3 = 2;
+ if(this.func_25030_y()) {
+ var3 = 4;
+ }
+
+ var1.attackEntityFrom(this, var3);
+ }
+
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ ItemStack var2 = var1.inventory.getCurrentItem();
+ if(!this.func_25030_y()) {
+ if(var2 != null && var2.itemID == Item.bone.shiftedIndex && !this.getIsAngry()) {
+ --var2.stackSize;
+ if(var2.stackSize <= 0) {
+ var1.inventory.setInventorySlotContents(var1.inventory.currentItem, (ItemStack)null);
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ if(this.rand.nextInt(3) == 0) {
+ this.setIsTamed(true);
+ this.setPathToEntity((PathEntity)null);
+ this.setIsSitting(true);
+ this.health = 20;
+ this.setOwner(var1.username);
+ this.isNowTamed(true);
+ this.worldObj.sendTrackedEntityStatusUpdatePacket(this, (byte)7);
+ } else {
+ this.isNowTamed(false);
+ this.worldObj.sendTrackedEntityStatusUpdatePacket(this, (byte)6);
+ }
+ }
+
+ return true;
+ }
+ } else {
+ if(var2 != null && Item.itemsList[var2.itemID] instanceof ItemFood) {
+ ItemFood var3 = (ItemFood)Item.itemsList[var2.itemID];
+ if(var3.func_25010_k() && this.dataWatcher.getWatchableObjectInteger(18) < 20) {
+ --var2.stackSize;
+ if(var2.stackSize <= 0) {
+ var1.inventory.setInventorySlotContents(var1.inventory.currentItem, (ItemStack)null);
+ }
+
+ this.heal(((ItemFood)Item.porkRaw).getHealAmount());
+ return true;
+ }
+ }
+
+ if(var1.username.equalsIgnoreCase(this.getOwner())) {
+ if(!this.worldObj.singleplayerWorld) {
+ this.setIsSitting(!this.getIsSitting());
+ this.isJumping = false;
+ this.setPathToEntity((PathEntity)null);
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ void isNowTamed(boolean var1) {
+ String var2 = "heart";
+ if(!var1) {
+ var2 = "smoke";
+ }
+
+ for(int var3 = 0; var3 < 7; ++var3) {
+ double var4 = this.rand.nextGaussian() * 0.02D;
+ double var6 = this.rand.nextGaussian() * 0.02D;
+ double var8 = this.rand.nextGaussian() * 0.02D;
+ this.worldObj.spawnParticle(var2, this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, this.posY + 0.5D + (double)(this.rand.nextFloat() * this.height), this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, var4, var6, var8);
+ }
+
+ }
+
+ public int getMaxSpawnedInChunk() {
+ return 8;
+ }
+
+ public String getOwner() {
+ return this.dataWatcher.getWatchableObjectString(17);
+ }
+
+ public void setOwner(String var1) {
+ this.dataWatcher.updateObject(17, var1);
+ }
+
+ public boolean getIsSitting() {
+ return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;
+ }
+
+ public void setIsSitting(boolean var1) {
+ byte var2 = this.dataWatcher.getWatchableObjectByte(16);
+ if(var1) {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 1)));
+ } else {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -2)));
+ }
+
+ }
+
+ public boolean getIsAngry() {
+ return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0;
+ }
+
+ public void setIsAngry(boolean var1) {
+ byte var2 = this.dataWatcher.getWatchableObjectByte(16);
+ if(var1) {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 2)));
+ } else {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -3)));
+ }
+
+ }
+
+ public boolean func_25030_y() {
+ return (this.dataWatcher.getWatchableObjectByte(16) & 4) != 0;
+ }
+
+ public void setIsTamed(boolean var1) {
+ byte var2 = this.dataWatcher.getWatchableObjectByte(16);
+ if(var1) {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 4)));
+ } else {
+ this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -5)));
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/EntityZombie.java b/src/net/minecraft/src/EntityZombie.java
new file mode 100644
index 0000000..4282d65
--- /dev/null
+++ b/src/net/minecraft/src/EntityZombie.java
@@ -0,0 +1,37 @@
+package net.minecraft.src;
+
+public class EntityZombie extends EntityMob {
+ public EntityZombie(World var1) {
+ super(var1);
+ this.texture = "/mob/zombie.png";
+ this.moveSpeed = 0.5F;
+ this.attackStrength = 5;
+ }
+
+ public void onLivingUpdate() {
+ if(this.worldObj.isDaytime()) {
+ float var1 = this.getEntityBrightness(1.0F);
+ if(var1 > 0.5F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F) {
+ this.fire = 300;
+ }
+ }
+
+ super.onLivingUpdate();
+ }
+
+ protected String getLivingSound() {
+ return "mob.zombie";
+ }
+
+ protected String getHurtSound() {
+ return "mob.zombiehurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.zombiedeath";
+ }
+
+ protected int getDropItemId() {
+ return Item.feather.shiftedIndex;
+ }
+}
diff --git a/src/net/minecraft/src/EnumArt.java b/src/net/minecraft/src/EnumArt.java
new file mode 100644
index 0000000..8d8a4dd
--- /dev/null
+++ b/src/net/minecraft/src/EnumArt.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+public enum EnumArt {
+ Kebab("Kebab", 16, 16, 0, 0),
+ Aztec("Aztec", 16, 16, 16, 0),
+ Alban("Alban", 16, 16, 32, 0),
+ Aztec2("Aztec2", 16, 16, 48, 0),
+ Bomb("Bomb", 16, 16, 64, 0),
+ Plant("Plant", 16, 16, 80, 0),
+ Wasteland("Wasteland", 16, 16, 96, 0),
+ Pool("Pool", 32, 16, 0, 32),
+ Courbet("Courbet", 32, 16, 32, 32),
+ Sea("Sea", 32, 16, 64, 32),
+ Sunset("Sunset", 32, 16, 96, 32),
+ Creebet("Creebet", 32, 16, 128, 32),
+ Wanderer("Wanderer", 16, 32, 0, 64),
+ Graham("Graham", 16, 32, 16, 64),
+ Match("Match", 32, 32, 0, 128),
+ Bust("Bust", 32, 32, 32, 128),
+ Stage("Stage", 32, 32, 64, 128),
+ Void("Void", 32, 32, 96, 128),
+ SkullAndRoses("SkullAndRoses", 32, 32, 128, 128),
+ Fighters("Fighters", 64, 32, 0, 96),
+ Pointer("Pointer", 64, 64, 0, 192),
+ Pigscene("Pigscene", 64, 64, 64, 192),
+ BurningSkull("BurningSkull", 64, 64, 128, 192),
+ Skeleton("Skeleton", 64, 48, 192, 64),
+ DonkeyKong("DonkeyKong", 64, 48, 192, 112);
+
+ public static final int field_27096_z = "SkullAndRoses".length();
+ public final String title;
+ public final int sizeX;
+ public final int sizeY;
+ public final int offsetX;
+ public final int offsetY;
+
+ private EnumArt(String var3, int var4, int var5, int var6, int var7) {
+ this.title = var3;
+ this.sizeX = var4;
+ this.sizeY = var5;
+ this.offsetX = var6;
+ this.offsetY = var7;
+ }
+}
diff --git a/src/net/minecraft/src/EnumCreatureType.java b/src/net/minecraft/src/EnumCreatureType.java
new file mode 100644
index 0000000..431a93c
--- /dev/null
+++ b/src/net/minecraft/src/EnumCreatureType.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+public enum EnumCreatureType {
+ monster(IMob.class, 70, Material.air, false),
+ creature(EntityAnimal.class, 15, Material.air, true),
+ waterCreature(EntityWaterMob.class, 5, Material.water, true);
+
+ private final Class creatureClass;
+ private final int maxNumberOfCreature;
+ private final Material creatureMaterial;
+ private final boolean field_21106_g;
+
+ private EnumCreatureType(Class var3, int var4, Material var5, boolean var6) {
+ this.creatureClass = var3;
+ this.maxNumberOfCreature = var4;
+ this.creatureMaterial = var5;
+ this.field_21106_g = var6;
+ }
+
+ public Class getCreatureClass() {
+ return this.creatureClass;
+ }
+
+ public int getMaxNumberOfCreature() {
+ return this.maxNumberOfCreature;
+ }
+
+ public Material getCreatureMaterial() {
+ return this.creatureMaterial;
+ }
+
+ public boolean func_21103_d() {
+ return this.field_21106_g;
+ }
+}
diff --git a/src/net/minecraft/src/EnumMobType.java b/src/net/minecraft/src/EnumMobType.java
new file mode 100644
index 0000000..a4a69b6
--- /dev/null
+++ b/src/net/minecraft/src/EnumMobType.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public enum EnumMobType {
+ everything,
+ mobs,
+ players;
+}
diff --git a/src/net/minecraft/src/EnumMovingObjectType.java b/src/net/minecraft/src/EnumMovingObjectType.java
new file mode 100644
index 0000000..ace74a2
--- /dev/null
+++ b/src/net/minecraft/src/EnumMovingObjectType.java
@@ -0,0 +1,6 @@
+package net.minecraft.src;
+
+public enum EnumMovingObjectType {
+ TILE,
+ ENTITY;
+}
diff --git a/src/net/minecraft/src/EnumSkyBlock.java b/src/net/minecraft/src/EnumSkyBlock.java
new file mode 100644
index 0000000..dd07a83
--- /dev/null
+++ b/src/net/minecraft/src/EnumSkyBlock.java
@@ -0,0 +1,12 @@
+package net.minecraft.src;
+
+public enum EnumSkyBlock {
+ Sky(15),
+ Block(0);
+
+ public final int field_984_c;
+
+ private EnumSkyBlock(int var3) {
+ this.field_984_c = var3;
+ }
+}
diff --git a/src/net/minecraft/src/EnumStatus.java b/src/net/minecraft/src/EnumStatus.java
new file mode 100644
index 0000000..5776724
--- /dev/null
+++ b/src/net/minecraft/src/EnumStatus.java
@@ -0,0 +1,9 @@
+package net.minecraft.src;
+
+public enum EnumStatus {
+ OK,
+ NOT_POSSIBLE_HERE,
+ NOT_POSSIBLE_NOW,
+ TOO_FAR_AWAY,
+ OTHER_PROBLEM;
+}
diff --git a/src/net/minecraft/src/EnumToolMaterial.java b/src/net/minecraft/src/EnumToolMaterial.java
new file mode 100644
index 0000000..3d9e277
--- /dev/null
+++ b/src/net/minecraft/src/EnumToolMaterial.java
@@ -0,0 +1,37 @@
+package net.minecraft.src;
+
+public enum EnumToolMaterial {
+ WOOD(0, 59, 2.0F, 0),
+ STONE(1, 131, 4.0F, 1),
+ IRON(2, 250, 6.0F, 2),
+ EMERALD(3, 1561, 8.0F, 3),
+ GOLD(0, 32, 12.0F, 0);
+
+ private final int harvestLevel;
+ private final int maxUses;
+ private final float efficiencyOnProperMaterial;
+ private final int damageVsEntity;
+
+ private EnumToolMaterial(int var3, int var4, float var5, int var6) {
+ this.harvestLevel = var3;
+ this.maxUses = var4;
+ this.efficiencyOnProperMaterial = var5;
+ this.damageVsEntity = var6;
+ }
+
+ public int getMaxUses() {
+ return this.maxUses;
+ }
+
+ public float getEfficiencyOnProperMaterial() {
+ return this.efficiencyOnProperMaterial;
+ }
+
+ public int getDamageVsEntity() {
+ return this.damageVsEntity;
+ }
+
+ public int getHarvestLevel() {
+ return this.harvestLevel;
+ }
+}
diff --git a/src/net/minecraft/src/Explosion.java b/src/net/minecraft/src/Explosion.java
new file mode 100644
index 0000000..43bab8a
--- /dev/null
+++ b/src/net/minecraft/src/Explosion.java
@@ -0,0 +1,165 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+public class Explosion {
+ public boolean isFlaming = false;
+ private Random ExplosionRNG = new Random();
+ private World worldObj;
+ public double explosionX;
+ public double explosionY;
+ public double explosionZ;
+ public Entity exploder;
+ public float explosionSize;
+ public Set destroyedBlockPositions = new HashSet();
+
+ public Explosion(World var1, Entity var2, double var3, double var5, double var7, float var9) {
+ this.worldObj = var1;
+ this.exploder = var2;
+ this.explosionSize = var9;
+ this.explosionX = var3;
+ this.explosionY = var5;
+ this.explosionZ = var7;
+ }
+
+ public void doExplosion() {
+ float var1 = this.explosionSize;
+ byte var2 = 16;
+
+ int var3;
+ int var4;
+ int var5;
+ double var15;
+ double var17;
+ double var19;
+ for(var3 = 0; var3 < var2; ++var3) {
+ for(var4 = 0; var4 < var2; ++var4) {
+ for(var5 = 0; var5 < var2; ++var5) {
+ if(var3 == 0 || var3 == var2 - 1 || var4 == 0 || var4 == var2 - 1 || var5 == 0 || var5 == var2 - 1) {
+ double var6 = (double)((float)var3 / ((float)var2 - 1.0F) * 2.0F - 1.0F);
+ double var8 = (double)((float)var4 / ((float)var2 - 1.0F) * 2.0F - 1.0F);
+ double var10 = (double)((float)var5 / ((float)var2 - 1.0F) * 2.0F - 1.0F);
+ double var12 = Math.sqrt(var6 * var6 + var8 * var8 + var10 * var10);
+ var6 /= var12;
+ var8 /= var12;
+ var10 /= var12;
+ float var14 = this.explosionSize * (0.7F + this.worldObj.rand.nextFloat() * 0.6F);
+ var15 = this.explosionX;
+ var17 = this.explosionY;
+ var19 = this.explosionZ;
+
+ for(float var21 = 0.3F; var14 > 0.0F; var14 -= var21 * (12.0F / 16.0F)) {
+ int var22 = MathHelper.floor_double(var15);
+ int var23 = MathHelper.floor_double(var17);
+ int var24 = MathHelper.floor_double(var19);
+ int var25 = this.worldObj.getBlockId(var22, var23, var24);
+ if(var25 > 0) {
+ var14 -= (Block.blocksList[var25].getExplosionResistance(this.exploder) + 0.3F) * var21;
+ }
+
+ if(var14 > 0.0F) {
+ this.destroyedBlockPositions.add(new ChunkPosition(var22, var23, var24));
+ }
+
+ var15 += var6 * (double)var21;
+ var17 += var8 * (double)var21;
+ var19 += var10 * (double)var21;
+ }
+ }
+ }
+ }
+ }
+
+ this.explosionSize *= 2.0F;
+ var3 = MathHelper.floor_double(this.explosionX - (double)this.explosionSize - 1.0D);
+ var4 = MathHelper.floor_double(this.explosionX + (double)this.explosionSize + 1.0D);
+ var5 = MathHelper.floor_double(this.explosionY - (double)this.explosionSize - 1.0D);
+ int var29 = MathHelper.floor_double(this.explosionY + (double)this.explosionSize + 1.0D);
+ int var7 = MathHelper.floor_double(this.explosionZ - (double)this.explosionSize - 1.0D);
+ int var30 = MathHelper.floor_double(this.explosionZ + (double)this.explosionSize + 1.0D);
+ List var9 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.exploder, AxisAlignedBB.getBoundingBoxFromPool((double)var3, (double)var5, (double)var7, (double)var4, (double)var29, (double)var30));
+ Vec3D var31 = Vec3D.createVector(this.explosionX, this.explosionY, this.explosionZ);
+
+ for(int var11 = 0; var11 < var9.size(); ++var11) {
+ Entity var33 = (Entity)var9.get(var11);
+ double var13 = var33.getDistance(this.explosionX, this.explosionY, this.explosionZ) / (double)this.explosionSize;
+ if(var13 <= 1.0D) {
+ var15 = var33.posX - this.explosionX;
+ var17 = var33.posY - this.explosionY;
+ var19 = var33.posZ - this.explosionZ;
+ double var39 = (double)MathHelper.sqrt_double(var15 * var15 + var17 * var17 + var19 * var19);
+ var15 /= var39;
+ var17 /= var39;
+ var19 /= var39;
+ double var40 = (double)this.worldObj.func_494_a(var31, var33.boundingBox);
+ double var41 = (1.0D - var13) * var40;
+ var33.attackEntityFrom(this.exploder, (int)((var41 * var41 + var41) / 2.0D * 8.0D * (double)this.explosionSize + 1.0D));
+ var33.motionX += var15 * var41;
+ var33.motionY += var17 * var41;
+ var33.motionZ += var19 * var41;
+ }
+ }
+
+ this.explosionSize = var1;
+ ArrayList var32 = new ArrayList();
+ var32.addAll(this.destroyedBlockPositions);
+ if(this.isFlaming) {
+ for(int var34 = var32.size() - 1; var34 >= 0; --var34) {
+ ChunkPosition var35 = (ChunkPosition)var32.get(var34);
+ int var36 = var35.x;
+ int var37 = var35.y;
+ int var16 = var35.z;
+ int var38 = this.worldObj.getBlockId(var36, var37, var16);
+ int var18 = this.worldObj.getBlockId(var36, var37 - 1, var16);
+ if(var38 == 0 && Block.opaqueCubeLookup[var18] && this.ExplosionRNG.nextInt(3) == 0) {
+ this.worldObj.setBlockWithNotify(var36, var37, var16, Block.fire.blockID);
+ }
+ }
+ }
+
+ }
+
+ public void doEffects(boolean var1) {
+ this.worldObj.playSoundEffect(this.explosionX, this.explosionY, this.explosionZ, "random.explode", 4.0F, (1.0F + (this.worldObj.rand.nextFloat() - this.worldObj.rand.nextFloat()) * 0.2F) * 0.7F);
+ ArrayList var2 = new ArrayList();
+ var2.addAll(this.destroyedBlockPositions);
+
+ for(int var3 = var2.size() - 1; var3 >= 0; --var3) {
+ ChunkPosition var4 = (ChunkPosition)var2.get(var3);
+ int var5 = var4.x;
+ int var6 = var4.y;
+ int var7 = var4.z;
+ int var8 = this.worldObj.getBlockId(var5, var6, var7);
+ if(var1) {
+ double var9 = (double)((float)var5 + this.worldObj.rand.nextFloat());
+ double var11 = (double)((float)var6 + this.worldObj.rand.nextFloat());
+ double var13 = (double)((float)var7 + this.worldObj.rand.nextFloat());
+ double var15 = var9 - this.explosionX;
+ double var17 = var11 - this.explosionY;
+ double var19 = var13 - this.explosionZ;
+ double var21 = (double)MathHelper.sqrt_double(var15 * var15 + var17 * var17 + var19 * var19);
+ var15 /= var21;
+ var17 /= var21;
+ var19 /= var21;
+ double var23 = 0.5D / (var21 / (double)this.explosionSize + 0.1D);
+ var23 *= (double)(this.worldObj.rand.nextFloat() * this.worldObj.rand.nextFloat() + 0.3F);
+ var15 *= var23;
+ var17 *= var23;
+ var19 *= var23;
+ this.worldObj.spawnParticle("explode", (var9 + this.explosionX * 1.0D) / 2.0D, (var11 + this.explosionY * 1.0D) / 2.0D, (var13 + this.explosionZ * 1.0D) / 2.0D, var15, var17, var19);
+ this.worldObj.spawnParticle("smoke", var9, var11, var13, var15, var17, var19);
+ }
+
+ if(var8 > 0) {
+ Block.blocksList[var8].dropBlockAsItemWithChance(this.worldObj, var5, var6, var7, this.worldObj.getBlockMetadata(var5, var6, var7), 0.3F);
+ this.worldObj.setBlockWithNotify(var5, var6, var7, 0);
+ Block.blocksList[var8].onBlockDestroyedByExplosion(this.worldObj, var5, var6, var7);
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/FurnaceRecipes.java b/src/net/minecraft/src/FurnaceRecipes.java
new file mode 100644
index 0000000..f658086
--- /dev/null
+++ b/src/net/minecraft/src/FurnaceRecipes.java
@@ -0,0 +1,38 @@
+package net.minecraft.src;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class FurnaceRecipes {
+ private static final FurnaceRecipes smeltingBase = new FurnaceRecipes();
+ private Map smeltingList = new HashMap();
+
+ public static final FurnaceRecipes smelting() {
+ return smeltingBase;
+ }
+
+ private FurnaceRecipes() {
+ this.addSmelting(Block.oreIron.blockID, new ItemStack(Item.ingotIron));
+ this.addSmelting(Block.oreGold.blockID, new ItemStack(Item.ingotGold));
+ this.addSmelting(Block.oreDiamond.blockID, new ItemStack(Item.diamond));
+ this.addSmelting(Block.sand.blockID, new ItemStack(Block.glass));
+ this.addSmelting(Item.porkRaw.shiftedIndex, new ItemStack(Item.porkCooked));
+ this.addSmelting(Item.fishRaw.shiftedIndex, new ItemStack(Item.fishCooked));
+ this.addSmelting(Block.cobblestone.blockID, new ItemStack(Block.stone));
+ this.addSmelting(Item.clay.shiftedIndex, new ItemStack(Item.brick));
+ this.addSmelting(Block.cactus.blockID, new ItemStack(Item.dyePowder, 1, 2));
+ this.addSmelting(Block.wood.blockID, new ItemStack(Item.coal, 1, 1));
+ }
+
+ public void addSmelting(int var1, ItemStack var2) {
+ this.smeltingList.put(Integer.valueOf(var1), var2);
+ }
+
+ public ItemStack getSmeltingResult(int var1) {
+ return (ItemStack)this.smeltingList.get(Integer.valueOf(var1));
+ }
+
+ public Map getSmeltingList() {
+ return this.smeltingList;
+ }
+}
diff --git a/src/net/minecraft/src/GuiLogFormatter.java b/src/net/minecraft/src/GuiLogFormatter.java
new file mode 100644
index 0000000..3836c8f
--- /dev/null
+++ b/src/net/minecraft/src/GuiLogFormatter.java
@@ -0,0 +1,46 @@
+package net.minecraft.src;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+class GuiLogFormatter extends Formatter {
+ final GuiLogOutputHandler outputHandler;
+
+ GuiLogFormatter(GuiLogOutputHandler var1) {
+ this.outputHandler = var1;
+ }
+
+ public String format(LogRecord var1) {
+ StringBuilder var2 = new StringBuilder();
+ Level var3 = var1.getLevel();
+ if(var3 == Level.FINEST) {
+ var2.append("[FINEST] ");
+ } else if(var3 == Level.FINER) {
+ var2.append("[FINER] ");
+ } else if(var3 == Level.FINE) {
+ var2.append("[FINE] ");
+ } else if(var3 == Level.INFO) {
+ var2.append("[INFO] ");
+ } else if(var3 == Level.WARNING) {
+ var2.append("[WARNING] ");
+ } else if(var3 == Level.SEVERE) {
+ var2.append("[SEVERE] ");
+ } else if(var3 == Level.SEVERE) {
+ var2.append("[" + var3.getLocalizedName() + "] ");
+ }
+
+ var2.append(var1.getMessage());
+ var2.append('\n');
+ Throwable var4 = var1.getThrown();
+ if(var4 != null) {
+ StringWriter var5 = new StringWriter();
+ var4.printStackTrace(new PrintWriter(var5));
+ var2.append(var5.toString());
+ }
+
+ return var2.toString();
+ }
+}
diff --git a/src/net/minecraft/src/GuiLogOutputHandler.java b/src/net/minecraft/src/GuiLogOutputHandler.java
new file mode 100644
index 0000000..d701a07
--- /dev/null
+++ b/src/net/minecraft/src/GuiLogOutputHandler.java
@@ -0,0 +1,37 @@
+package net.minecraft.src;
+
+import java.util.logging.Formatter;
+import java.util.logging.Handler;
+import java.util.logging.LogRecord;
+import javax.swing.JTextArea;
+
+public class GuiLogOutputHandler extends Handler {
+ private int[] field_998_b = new int[1024];
+ private int field_1001_c = 0;
+ Formatter field_999_a = new GuiLogFormatter(this);
+ private JTextArea field_1000_d;
+
+ public GuiLogOutputHandler(JTextArea var1) {
+ this.setFormatter(this.field_999_a);
+ this.field_1000_d = var1;
+ }
+
+ public void close() {
+ }
+
+ public void flush() {
+ }
+
+ public void publish(LogRecord var1) {
+ int var2 = this.field_1000_d.getDocument().getLength();
+ this.field_1000_d.append(this.field_999_a.format(var1));
+ this.field_1000_d.setCaretPosition(this.field_1000_d.getDocument().getLength());
+ int var3 = this.field_1000_d.getDocument().getLength() - var2;
+ if(this.field_998_b[this.field_1001_c] != 0) {
+ this.field_1000_d.replaceRange("", 0, this.field_998_b[this.field_1001_c]);
+ }
+
+ this.field_998_b[this.field_1001_c] = var3;
+ this.field_1001_c = (this.field_1001_c + 1) % 1024;
+ }
+}
diff --git a/src/net/minecraft/src/GuiStatsComponent.java b/src/net/minecraft/src/GuiStatsComponent.java
new file mode 100644
index 0000000..279b291
--- /dev/null
+++ b/src/net/minecraft/src/GuiStatsComponent.java
@@ -0,0 +1,56 @@
+package net.minecraft.src;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import javax.swing.JComponent;
+import javax.swing.Timer;
+
+public class GuiStatsComponent extends JComponent {
+ private int[] memoryUse = new int[256];
+ private int updateCounter = 0;
+ private String[] displayStrings = new String[10];
+
+ public GuiStatsComponent() {
+ this.setPreferredSize(new Dimension(256, 196));
+ this.setMinimumSize(new Dimension(256, 196));
+ this.setMaximumSize(new Dimension(256, 196));
+ (new Timer(500, new GuiStatsListener(this))).start();
+ this.setBackground(Color.BLACK);
+ }
+
+ private void updateStats() {
+ long var1 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
+ System.gc();
+ this.displayStrings[0] = "Memory use: " + var1 / 1024L / 1024L + " mb (" + Runtime.getRuntime().freeMemory() * 100L / Runtime.getRuntime().maxMemory() + "% free)";
+ this.displayStrings[1] = "Threads: " + NetworkManager.numReadThreads + " + " + NetworkManager.numWriteThreads;
+ this.memoryUse[this.updateCounter++ & 255] = (int)(var1 * 100L / Runtime.getRuntime().maxMemory());
+ this.repaint();
+ }
+
+ public void paint(Graphics var1) {
+ var1.setColor(new Color(16777215));
+ var1.fillRect(0, 0, 256, 192);
+
+ int var2;
+ for(var2 = 0; var2 < 256; ++var2) {
+ int var3 = this.memoryUse[var2 + this.updateCounter & 255];
+ var1.setColor(new Color(var3 + 28 << 16));
+ var1.fillRect(var2, 100 - var3, 1, var3);
+ }
+
+ var1.setColor(Color.BLACK);
+
+ for(var2 = 0; var2 < this.displayStrings.length; ++var2) {
+ String var4 = this.displayStrings[var2];
+ if(var4 != null) {
+ var1.drawString(var4, 32, 116 + var2 * 16);
+ }
+ }
+
+ }
+
+ static void update(GuiStatsComponent var0) {
+ var0.updateStats();
+ }
+}
diff --git a/src/net/minecraft/src/GuiStatsListener.java b/src/net/minecraft/src/GuiStatsListener.java
new file mode 100644
index 0000000..2dbef7d
--- /dev/null
+++ b/src/net/minecraft/src/GuiStatsListener.java
@@ -0,0 +1,16 @@
+package net.minecraft.src;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+class GuiStatsListener implements ActionListener {
+ final GuiStatsComponent statsComponent;
+
+ GuiStatsListener(GuiStatsComponent var1) {
+ this.statsComponent = var1;
+ }
+
+ public void actionPerformed(ActionEvent var1) {
+ GuiStatsComponent.update(this.statsComponent);
+ }
+}
diff --git a/src/net/minecraft/src/IAnimals.java b/src/net/minecraft/src/IAnimals.java
new file mode 100644
index 0000000..61de5b0
--- /dev/null
+++ b/src/net/minecraft/src/IAnimals.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public interface IAnimals {
+}
diff --git a/src/net/minecraft/src/IBlockAccess.java b/src/net/minecraft/src/IBlockAccess.java
new file mode 100644
index 0000000..27a6ec0
--- /dev/null
+++ b/src/net/minecraft/src/IBlockAccess.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public interface IBlockAccess {
+ int getBlockId(int var1, int var2, int var3);
+
+ TileEntity getBlockTileEntity(int var1, int var2, int var3);
+
+ int getBlockMetadata(int var1, int var2, int var3);
+
+ Material getBlockMaterial(int var1, int var2, int var3);
+
+ boolean isBlockNormalCube(int var1, int var2, int var3);
+}
diff --git a/src/net/minecraft/src/IChunkLoader.java b/src/net/minecraft/src/IChunkLoader.java
new file mode 100644
index 0000000..7382b45
--- /dev/null
+++ b/src/net/minecraft/src/IChunkLoader.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+
+public interface IChunkLoader {
+ Chunk loadChunk(World var1, int var2, int var3) throws IOException;
+
+ void saveChunk(World var1, Chunk var2) throws IOException;
+
+ void saveExtraChunkData(World var1, Chunk var2) throws IOException;
+
+ void func_661_a();
+
+ void saveExtraData();
+}
diff --git a/src/net/minecraft/src/IChunkProvider.java b/src/net/minecraft/src/IChunkProvider.java
new file mode 100644
index 0000000..8ce762f
--- /dev/null
+++ b/src/net/minecraft/src/IChunkProvider.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public interface IChunkProvider {
+ boolean chunkExists(int var1, int var2);
+
+ Chunk provideChunk(int var1, int var2);
+
+ Chunk loadChunk(int var1, int var2);
+
+ void populate(IChunkProvider var1, int var2, int var3);
+
+ boolean saveChunks(boolean var1, IProgressUpdate var2);
+
+ boolean func_361_a();
+
+ boolean func_364_b();
+}
diff --git a/src/net/minecraft/src/ICommandListener.java b/src/net/minecraft/src/ICommandListener.java
new file mode 100644
index 0000000..9fedc62
--- /dev/null
+++ b/src/net/minecraft/src/ICommandListener.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public interface ICommandListener {
+ void log(String var1);
+
+ String getUsername();
+}
diff --git a/src/net/minecraft/src/ICrafting.java b/src/net/minecraft/src/ICrafting.java
new file mode 100644
index 0000000..f5ee394
--- /dev/null
+++ b/src/net/minecraft/src/ICrafting.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public interface ICrafting {
+ void updateCraftingInventory(Container var1, List var2);
+
+ void updateCraftingInventorySlot(Container var1, int var2, ItemStack var3);
+
+ void updateCraftingInventoryInfo(Container var1, int var2, int var3);
+}
diff --git a/src/net/minecraft/src/IInventory.java b/src/net/minecraft/src/IInventory.java
new file mode 100644
index 0000000..a276d79
--- /dev/null
+++ b/src/net/minecraft/src/IInventory.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public interface IInventory {
+ int getSizeInventory();
+
+ ItemStack getStackInSlot(int var1);
+
+ ItemStack decrStackSize(int var1, int var2);
+
+ void setInventorySlotContents(int var1, ItemStack var2);
+
+ String getInvName();
+
+ int getInventoryStackLimit();
+
+ void onInventoryChanged();
+
+ boolean canInteractWith(EntityPlayer var1);
+}
diff --git a/src/net/minecraft/src/IMob.java b/src/net/minecraft/src/IMob.java
new file mode 100644
index 0000000..0767da6
--- /dev/null
+++ b/src/net/minecraft/src/IMob.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public interface IMob extends IAnimals {
+}
diff --git a/src/net/minecraft/src/IPlayerFileData.java b/src/net/minecraft/src/IPlayerFileData.java
new file mode 100644
index 0000000..db5f1cc
--- /dev/null
+++ b/src/net/minecraft/src/IPlayerFileData.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public interface IPlayerFileData {
+ void writePlayerData(EntityPlayer var1);
+
+ void readPlayerData(EntityPlayer var1);
+}
diff --git a/src/net/minecraft/src/IProgressUpdate.java b/src/net/minecraft/src/IProgressUpdate.java
new file mode 100644
index 0000000..e3f8213
--- /dev/null
+++ b/src/net/minecraft/src/IProgressUpdate.java
@@ -0,0 +1,9 @@
+package net.minecraft.src;
+
+public interface IProgressUpdate {
+ void func_438_a(String var1);
+
+ void displayLoadingString(String var1);
+
+ void setLoadingProgress(int var1);
+}
diff --git a/src/net/minecraft/src/IRecipe.java b/src/net/minecraft/src/IRecipe.java
new file mode 100644
index 0000000..6b7c7f8
--- /dev/null
+++ b/src/net/minecraft/src/IRecipe.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public interface IRecipe {
+ boolean func_21134_a(InventoryCrafting var1);
+
+ ItemStack func_21136_b(InventoryCrafting var1);
+
+ int getRecipeSize();
+
+ ItemStack func_25077_b();
+}
diff --git a/src/net/minecraft/src/ISaveFormat.java b/src/net/minecraft/src/ISaveFormat.java
new file mode 100644
index 0000000..e119c48
--- /dev/null
+++ b/src/net/minecraft/src/ISaveFormat.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public interface ISaveFormat {
+ boolean isOldSaveType(String var1);
+
+ boolean converMapToMCRegion(String var1, IProgressUpdate var2);
+}
diff --git a/src/net/minecraft/src/ISaveHandler.java b/src/net/minecraft/src/ISaveHandler.java
new file mode 100644
index 0000000..f6ab8f6
--- /dev/null
+++ b/src/net/minecraft/src/ISaveHandler.java
@@ -0,0 +1,22 @@
+package net.minecraft.src;
+
+import java.io.File;
+import java.util.List;
+
+public interface ISaveHandler {
+ WorldInfo func_22096_c();
+
+ void func_22091_b();
+
+ IChunkLoader func_22092_a(WorldProvider var1);
+
+ void func_22095_a(WorldInfo var1, List var2);
+
+ void func_22094_a(WorldInfo var1);
+
+ IPlayerFileData func_22090_d();
+
+ void func_22093_e();
+
+ File func_28111_b(String var1);
+}
diff --git a/src/net/minecraft/src/IStatType.java b/src/net/minecraft/src/IStatType.java
new file mode 100644
index 0000000..c2c292f
--- /dev/null
+++ b/src/net/minecraft/src/IStatType.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public interface IStatType {
+}
diff --git a/src/net/minecraft/src/IUpdatePlayerListBox.java b/src/net/minecraft/src/IUpdatePlayerListBox.java
new file mode 100644
index 0000000..af1e278
--- /dev/null
+++ b/src/net/minecraft/src/IUpdatePlayerListBox.java
@@ -0,0 +1,5 @@
+package net.minecraft.src;
+
+public interface IUpdatePlayerListBox {
+ void update();
+}
diff --git a/src/net/minecraft/src/IWorldAccess.java b/src/net/minecraft/src/IWorldAccess.java
new file mode 100644
index 0000000..a0b59c9
--- /dev/null
+++ b/src/net/minecraft/src/IWorldAccess.java
@@ -0,0 +1,23 @@
+package net.minecraft.src;
+
+public interface IWorldAccess {
+ void markBlockNeedsUpdate(int var1, int var2, int var3);
+
+ void markBlockRangeNeedsUpdate(int var1, int var2, int var3, int var4, int var5, int var6);
+
+ void playSound(String var1, double var2, double var4, double var6, float var8, float var9);
+
+ void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12);
+
+ void obtainEntitySkin(Entity var1);
+
+ void releaseEntitySkin(Entity var1);
+
+ void updateAllRenderers();
+
+ void playRecord(String var1, int var2, int var3, int var4);
+
+ void doNothingWithTileEntity(int var1, int var2, int var3, TileEntity var4);
+
+ void func_28133_a(EntityPlayer var1, int var2, int var3, int var4, int var5, int var6);
+}
diff --git a/src/net/minecraft/src/InventoryCraftResult.java b/src/net/minecraft/src/InventoryCraftResult.java
new file mode 100644
index 0000000..92b6aeb
--- /dev/null
+++ b/src/net/minecraft/src/InventoryCraftResult.java
@@ -0,0 +1,42 @@
+package net.minecraft.src;
+
+public class InventoryCraftResult implements IInventory {
+ private ItemStack[] stackResult = new ItemStack[1];
+
+ public int getSizeInventory() {
+ return 1;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.stackResult[var1];
+ }
+
+ public String getInvName() {
+ return "Result";
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.stackResult[var1] != null) {
+ ItemStack var3 = this.stackResult[var1];
+ this.stackResult[var1] = null;
+ return var3;
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.stackResult[var1] = var2;
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public void onInventoryChanged() {
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/InventoryCrafting.java b/src/net/minecraft/src/InventoryCrafting.java
new file mode 100644
index 0000000..bbb52e0
--- /dev/null
+++ b/src/net/minecraft/src/InventoryCrafting.java
@@ -0,0 +1,73 @@
+package net.minecraft.src;
+
+public class InventoryCrafting implements IInventory {
+ private ItemStack[] stackList;
+ private int field_21085_b;
+ private Container eventHandler;
+
+ public InventoryCrafting(Container var1, int var2, int var3) {
+ int var4 = var2 * var3;
+ this.stackList = new ItemStack[var4];
+ this.eventHandler = var1;
+ this.field_21085_b = var2;
+ }
+
+ public int getSizeInventory() {
+ return this.stackList.length;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return var1 >= this.getSizeInventory() ? null : this.stackList[var1];
+ }
+
+ public ItemStack func_21084_a(int var1, int var2) {
+ if(var1 >= 0 && var1 < this.field_21085_b) {
+ int var3 = var1 + var2 * this.field_21085_b;
+ return this.getStackInSlot(var3);
+ } else {
+ return null;
+ }
+ }
+
+ public String getInvName() {
+ return "Crafting";
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.stackList[var1] != null) {
+ ItemStack var3;
+ if(this.stackList[var1].stackSize <= var2) {
+ var3 = this.stackList[var1];
+ this.stackList[var1] = null;
+ this.eventHandler.onCraftMatrixChanged(this);
+ return var3;
+ } else {
+ var3 = this.stackList[var1].splitStack(var2);
+ if(this.stackList[var1].stackSize == 0) {
+ this.stackList[var1] = null;
+ }
+
+ this.eventHandler.onCraftMatrixChanged(this);
+ return var3;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.stackList[var1] = var2;
+ this.eventHandler.onCraftMatrixChanged(this);
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public void onInventoryChanged() {
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/InventoryLargeChest.java b/src/net/minecraft/src/InventoryLargeChest.java
new file mode 100644
index 0000000..96e4698
--- /dev/null
+++ b/src/net/minecraft/src/InventoryLargeChest.java
@@ -0,0 +1,51 @@
+package net.minecraft.src;
+
+public class InventoryLargeChest implements IInventory {
+ private String name;
+ private IInventory upperChest;
+ private IInventory lowerChest;
+
+ public InventoryLargeChest(String var1, IInventory var2, IInventory var3) {
+ this.name = var1;
+ this.upperChest = var2;
+ this.lowerChest = var3;
+ }
+
+ public int getSizeInventory() {
+ return this.upperChest.getSizeInventory() + this.lowerChest.getSizeInventory();
+ }
+
+ public String getInvName() {
+ return this.name;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return var1 >= this.upperChest.getSizeInventory() ? this.lowerChest.getStackInSlot(var1 - this.upperChest.getSizeInventory()) : this.upperChest.getStackInSlot(var1);
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ return var1 >= this.upperChest.getSizeInventory() ? this.lowerChest.decrStackSize(var1 - this.upperChest.getSizeInventory(), var2) : this.upperChest.decrStackSize(var1, var2);
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ if(var1 >= this.upperChest.getSizeInventory()) {
+ this.lowerChest.setInventorySlotContents(var1 - this.upperChest.getSizeInventory(), var2);
+ } else {
+ this.upperChest.setInventorySlotContents(var1, var2);
+ }
+
+ }
+
+ public int getInventoryStackLimit() {
+ return this.upperChest.getInventoryStackLimit();
+ }
+
+ public void onInventoryChanged() {
+ this.upperChest.onInventoryChanged();
+ this.lowerChest.onInventoryChanged();
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.upperChest.canInteractWith(var1) && this.lowerChest.canInteractWith(var1);
+ }
+}
diff --git a/src/net/minecraft/src/InventoryPlayer.java b/src/net/minecraft/src/InventoryPlayer.java
new file mode 100644
index 0000000..234594a
--- /dev/null
+++ b/src/net/minecraft/src/InventoryPlayer.java
@@ -0,0 +1,346 @@
+package net.minecraft.src;
+
+public class InventoryPlayer implements IInventory {
+ public ItemStack[] mainInventory = new ItemStack[36];
+ public ItemStack[] armorInventory = new ItemStack[4];
+ public int currentItem = 0;
+ public EntityPlayer player;
+ private ItemStack itemStack;
+ public boolean inventoryChanged = false;
+
+ public InventoryPlayer(EntityPlayer var1) {
+ this.player = var1;
+ }
+
+ public ItemStack getCurrentItem() {
+ return this.currentItem < 9 && this.currentItem >= 0 ? this.mainInventory[this.currentItem] : null;
+ }
+
+ public static int func_25054_e() {
+ return 9;
+ }
+
+ private int getInventorySlotContainItem(int var1) {
+ for(int var2 = 0; var2 < this.mainInventory.length; ++var2) {
+ if(this.mainInventory[var2] != null && this.mainInventory[var2].itemID == var1) {
+ return var2;
+ }
+ }
+
+ return -1;
+ }
+
+ private int func_21082_c(ItemStack var1) {
+ for(int var2 = 0; var2 < this.mainInventory.length; ++var2) {
+ if(this.mainInventory[var2] != null && this.mainInventory[var2].itemID == var1.itemID && this.mainInventory[var2].func_21132_c() && this.mainInventory[var2].stackSize < this.mainInventory[var2].getMaxStackSize() && this.mainInventory[var2].stackSize < this.getInventoryStackLimit() && (!this.mainInventory[var2].getHasSubtypes() || this.mainInventory[var2].getItemDamage() == var1.getItemDamage())) {
+ return var2;
+ }
+ }
+
+ return -1;
+ }
+
+ private int getFirstEmptyStack() {
+ for(int var1 = 0; var1 < this.mainInventory.length; ++var1) {
+ if(this.mainInventory[var1] == null) {
+ return var1;
+ }
+ }
+
+ return -1;
+ }
+
+ private int func_21083_d(ItemStack var1) {
+ int var2 = var1.itemID;
+ int var3 = var1.stackSize;
+ int var4 = this.func_21082_c(var1);
+ if(var4 < 0) {
+ var4 = this.getFirstEmptyStack();
+ }
+
+ if(var4 < 0) {
+ return var3;
+ } else {
+ if(this.mainInventory[var4] == null) {
+ this.mainInventory[var4] = new ItemStack(var2, 0, var1.getItemDamage());
+ }
+
+ int var5 = var3;
+ if(var3 > this.mainInventory[var4].getMaxStackSize() - this.mainInventory[var4].stackSize) {
+ var5 = this.mainInventory[var4].getMaxStackSize() - this.mainInventory[var4].stackSize;
+ }
+
+ if(var5 > this.getInventoryStackLimit() - this.mainInventory[var4].stackSize) {
+ var5 = this.getInventoryStackLimit() - this.mainInventory[var4].stackSize;
+ }
+
+ if(var5 == 0) {
+ return var3;
+ } else {
+ var3 -= var5;
+ this.mainInventory[var4].stackSize += var5;
+ this.mainInventory[var4].animationsToGo = 5;
+ return var3;
+ }
+ }
+ }
+
+ public void decrementAnimations() {
+ for(int var1 = 0; var1 < this.mainInventory.length; ++var1) {
+ if(this.mainInventory[var1] != null) {
+ this.mainInventory[var1].func_28143_a(this.player.worldObj, this.player, var1, this.currentItem == var1);
+ }
+ }
+
+ }
+
+ public boolean consumeInventoryItem(int var1) {
+ int var2 = this.getInventorySlotContainItem(var1);
+ if(var2 < 0) {
+ return false;
+ } else {
+ if(--this.mainInventory[var2].stackSize <= 0) {
+ this.mainInventory[var2] = null;
+ }
+
+ return true;
+ }
+ }
+
+ public boolean addItemStackToInventory(ItemStack var1) {
+ int var2;
+ if(var1.isItemDamaged()) {
+ var2 = this.getFirstEmptyStack();
+ if(var2 >= 0) {
+ this.mainInventory[var2] = ItemStack.func_20117_a(var1);
+ this.mainInventory[var2].animationsToGo = 5;
+ var1.stackSize = 0;
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ do {
+ var2 = var1.stackSize;
+ var1.stackSize = this.func_21083_d(var1);
+ } while(var1.stackSize > 0 && var1.stackSize < var2);
+
+ return var1.stackSize < var2;
+ }
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ ItemStack[] var3 = this.mainInventory;
+ if(var1 >= this.mainInventory.length) {
+ var3 = this.armorInventory;
+ var1 -= this.mainInventory.length;
+ }
+
+ if(var3[var1] != null) {
+ ItemStack var4;
+ if(var3[var1].stackSize <= var2) {
+ var4 = var3[var1];
+ var3[var1] = null;
+ return var4;
+ } else {
+ var4 = var3[var1].splitStack(var2);
+ if(var3[var1].stackSize == 0) {
+ var3[var1] = null;
+ }
+
+ return var4;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ ItemStack[] var3 = this.mainInventory;
+ if(var1 >= var3.length) {
+ var1 -= var3.length;
+ var3 = this.armorInventory;
+ }
+
+ var3[var1] = var2;
+ }
+
+ public float getStrVsBlock(Block var1) {
+ float var2 = 1.0F;
+ if(this.mainInventory[this.currentItem] != null) {
+ var2 *= this.mainInventory[this.currentItem].getStrVsBlock(var1);
+ }
+
+ return var2;
+ }
+
+ public NBTTagList writeToNBT(NBTTagList var1) {
+ int var2;
+ NBTTagCompound var3;
+ for(var2 = 0; var2 < this.mainInventory.length; ++var2) {
+ if(this.mainInventory[var2] != null) {
+ var3 = new NBTTagCompound();
+ var3.setByte("Slot", (byte)var2);
+ this.mainInventory[var2].writeToNBT(var3);
+ var1.setTag(var3);
+ }
+ }
+
+ for(var2 = 0; var2 < this.armorInventory.length; ++var2) {
+ if(this.armorInventory[var2] != null) {
+ var3 = new NBTTagCompound();
+ var3.setByte("Slot", (byte)(var2 + 100));
+ this.armorInventory[var2].writeToNBT(var3);
+ var1.setTag(var3);
+ }
+ }
+
+ return var1;
+ }
+
+ public void readFromNBT(NBTTagList var1) {
+ this.mainInventory = new ItemStack[36];
+ this.armorInventory = new ItemStack[4];
+
+ for(int var2 = 0; var2 < var1.tagCount(); ++var2) {
+ NBTTagCompound var3 = (NBTTagCompound)var1.tagAt(var2);
+ int var4 = var3.getByte("Slot") & 255;
+ ItemStack var5 = new ItemStack(var3);
+ if(var5.getItem() != null) {
+ if(var4 >= 0 && var4 < this.mainInventory.length) {
+ this.mainInventory[var4] = var5;
+ }
+
+ if(var4 >= 100 && var4 < this.armorInventory.length + 100) {
+ this.armorInventory[var4 - 100] = var5;
+ }
+ }
+ }
+
+ }
+
+ public int getSizeInventory() {
+ return this.mainInventory.length + 4;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ ItemStack[] var2 = this.mainInventory;
+ if(var1 >= var2.length) {
+ var1 -= var2.length;
+ var2 = this.armorInventory;
+ }
+
+ return var2[var1];
+ }
+
+ public String getInvName() {
+ return "Inventory";
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ ItemStack var2 = this.getStackInSlot(this.currentItem);
+ return var2 != null ? var2.getDamageVsEntity(var1) : 1;
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ if(var1.blockMaterial.func_31055_i()) {
+ return true;
+ } else {
+ ItemStack var2 = this.getStackInSlot(this.currentItem);
+ return var2 != null ? var2.canHarvestBlock(var1) : false;
+ }
+ }
+
+ public int getTotalArmorValue() {
+ int var1 = 0;
+ int var2 = 0;
+ int var3 = 0;
+
+ for(int var4 = 0; var4 < this.armorInventory.length; ++var4) {
+ if(this.armorInventory[var4] != null && this.armorInventory[var4].getItem() instanceof ItemArmor) {
+ int var5 = this.armorInventory[var4].getMaxDamage();
+ int var6 = this.armorInventory[var4].getItemDamageForDisplay();
+ int var7 = var5 - var6;
+ var2 += var7;
+ var3 += var5;
+ int var8 = ((ItemArmor)this.armorInventory[var4].getItem()).damageReduceAmount;
+ var1 += var8;
+ }
+ }
+
+ if(var3 == 0) {
+ return 0;
+ } else {
+ return (var1 - 1) * var2 / var3 + 1;
+ }
+ }
+
+ public void damageArmor(int var1) {
+ for(int var2 = 0; var2 < this.armorInventory.length; ++var2) {
+ if(this.armorInventory[var2] != null && this.armorInventory[var2].getItem() instanceof ItemArmor) {
+ this.armorInventory[var2].damageItem(var1, this.player);
+ if(this.armorInventory[var2].stackSize == 0) {
+ this.armorInventory[var2].func_577_a(this.player);
+ this.armorInventory[var2] = null;
+ }
+ }
+ }
+
+ }
+
+ public void dropAllItems() {
+ int var1;
+ for(var1 = 0; var1 < this.mainInventory.length; ++var1) {
+ if(this.mainInventory[var1] != null) {
+ this.player.dropPlayerItemWithRandomChoice(this.mainInventory[var1], true);
+ this.mainInventory[var1] = null;
+ }
+ }
+
+ for(var1 = 0; var1 < this.armorInventory.length; ++var1) {
+ if(this.armorInventory[var1] != null) {
+ this.player.dropPlayerItemWithRandomChoice(this.armorInventory[var1], true);
+ this.armorInventory[var1] = null;
+ }
+ }
+
+ }
+
+ public void onInventoryChanged() {
+ this.inventoryChanged = true;
+ }
+
+ public void setItemStack(ItemStack var1) {
+ this.itemStack = var1;
+ this.player.onItemStackChanged(var1);
+ }
+
+ public ItemStack getItemStack() {
+ return this.itemStack;
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.player.isDead ? false : var1.getDistanceSqToEntity(this.player) <= 64.0D;
+ }
+
+ public boolean func_28010_c(ItemStack var1) {
+ int var2;
+ for(var2 = 0; var2 < this.armorInventory.length; ++var2) {
+ if(this.armorInventory[var2] != null && this.armorInventory[var2].func_28144_c(var1)) {
+ return true;
+ }
+ }
+
+ for(var2 = 0; var2 < this.mainInventory.length; ++var2) {
+ if(this.mainInventory[var2] != null && this.mainInventory[var2].func_28144_c(var1)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/Item.java b/src/net/minecraft/src/Item.java
new file mode 100644
index 0000000..3ad049b
--- /dev/null
+++ b/src/net/minecraft/src/Item.java
@@ -0,0 +1,256 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class Item {
+ protected static Random itemRand = new Random();
+ public static Item[] itemsList = new Item[32000];
+ public static Item shovelSteel = (new ItemSpade(0, EnumToolMaterial.IRON)).setIconCoord(2, 5).setItemName("shovelIron");
+ public static Item pickaxeSteel = (new ItemPickaxe(1, EnumToolMaterial.IRON)).setIconCoord(2, 6).setItemName("pickaxeIron");
+ public static Item axeSteel = (new ItemAxe(2, EnumToolMaterial.IRON)).setIconCoord(2, 7).setItemName("hatchetIron");
+ public static Item flintAndSteel = (new ItemFlintAndSteel(3)).setIconCoord(5, 0).setItemName("flintAndSteel");
+ public static Item appleRed = (new ItemFood(4, 4, false)).setIconCoord(10, 0).setItemName("apple");
+ public static Item bow = (new ItemBow(5)).setIconCoord(5, 1).setItemName("bow");
+ public static Item arrow = (new Item(6)).setIconCoord(5, 2).setItemName("arrow");
+ public static Item coal = (new ItemCoal(7)).setIconCoord(7, 0).setItemName("coal");
+ public static Item diamond = (new Item(8)).setIconCoord(7, 3).setItemName("emerald");
+ public static Item ingotIron = (new Item(9)).setIconCoord(7, 1).setItemName("ingotIron");
+ public static Item ingotGold = (new Item(10)).setIconCoord(7, 2).setItemName("ingotGold");
+ public static Item swordSteel = (new ItemSword(11, EnumToolMaterial.IRON)).setIconCoord(2, 4).setItemName("swordIron");
+ public static Item swordWood = (new ItemSword(12, EnumToolMaterial.WOOD)).setIconCoord(0, 4).setItemName("swordWood");
+ public static Item shovelWood = (new ItemSpade(13, EnumToolMaterial.WOOD)).setIconCoord(0, 5).setItemName("shovelWood");
+ public static Item pickaxeWood = (new ItemPickaxe(14, EnumToolMaterial.WOOD)).setIconCoord(0, 6).setItemName("pickaxeWood");
+ public static Item axeWood = (new ItemAxe(15, EnumToolMaterial.WOOD)).setIconCoord(0, 7).setItemName("hatchetWood");
+ public static Item swordStone = (new ItemSword(16, EnumToolMaterial.STONE)).setIconCoord(1, 4).setItemName("swordStone");
+ public static Item shovelStone = (new ItemSpade(17, EnumToolMaterial.STONE)).setIconCoord(1, 5).setItemName("shovelStone");
+ public static Item pickaxeStone = (new ItemPickaxe(18, EnumToolMaterial.STONE)).setIconCoord(1, 6).setItemName("pickaxeStone");
+ public static Item axeStone = (new ItemAxe(19, EnumToolMaterial.STONE)).setIconCoord(1, 7).setItemName("hatchetStone");
+ public static Item swordDiamond = (new ItemSword(20, EnumToolMaterial.EMERALD)).setIconCoord(3, 4).setItemName("swordDiamond");
+ public static Item shovelDiamond = (new ItemSpade(21, EnumToolMaterial.EMERALD)).setIconCoord(3, 5).setItemName("shovelDiamond");
+ public static Item pickaxeDiamond = (new ItemPickaxe(22, EnumToolMaterial.EMERALD)).setIconCoord(3, 6).setItemName("pickaxeDiamond");
+ public static Item axeDiamond = (new ItemAxe(23, EnumToolMaterial.EMERALD)).setIconCoord(3, 7).setItemName("hatchetDiamond");
+ public static Item stick = (new Item(24)).setIconCoord(5, 3).setFull3D().setItemName("stick");
+ public static Item bowlEmpty = (new Item(25)).setIconCoord(7, 4).setItemName("bowl");
+ public static Item bowlSoup = (new ItemSoup(26, 10)).setIconCoord(8, 4).setItemName("mushroomStew");
+ public static Item swordGold = (new ItemSword(27, EnumToolMaterial.GOLD)).setIconCoord(4, 4).setItemName("swordGold");
+ public static Item shovelGold = (new ItemSpade(28, EnumToolMaterial.GOLD)).setIconCoord(4, 5).setItemName("shovelGold");
+ public static Item pickaxeGold = (new ItemPickaxe(29, EnumToolMaterial.GOLD)).setIconCoord(4, 6).setItemName("pickaxeGold");
+ public static Item axeGold = (new ItemAxe(30, EnumToolMaterial.GOLD)).setIconCoord(4, 7).setItemName("hatchetGold");
+ public static Item silk = (new Item(31)).setIconCoord(8, 0).setItemName("string");
+ public static Item feather = (new Item(32)).setIconCoord(8, 1).setItemName("feather");
+ public static Item gunpowder = (new Item(33)).setIconCoord(8, 2).setItemName("sulphur");
+ public static Item hoeWood = (new ItemHoe(34, EnumToolMaterial.WOOD)).setIconCoord(0, 8).setItemName("hoeWood");
+ public static Item hoeStone = (new ItemHoe(35, EnumToolMaterial.STONE)).setIconCoord(1, 8).setItemName("hoeStone");
+ public static Item hoeSteel = (new ItemHoe(36, EnumToolMaterial.IRON)).setIconCoord(2, 8).setItemName("hoeIron");
+ public static Item hoeDiamond = (new ItemHoe(37, EnumToolMaterial.EMERALD)).setIconCoord(3, 8).setItemName("hoeDiamond");
+ public static Item hoeGold = (new ItemHoe(38, EnumToolMaterial.GOLD)).setIconCoord(4, 8).setItemName("hoeGold");
+ public static Item seeds = (new ItemSeeds(39, Block.crops.blockID)).setIconCoord(9, 0).setItemName("seeds");
+ public static Item wheat = (new Item(40)).setIconCoord(9, 1).setItemName("wheat");
+ public static Item bread = (new ItemFood(41, 5, false)).setIconCoord(9, 2).setItemName("bread");
+ public static Item helmetLeather = (new ItemArmor(42, 0, 0, 0)).setIconCoord(0, 0).setItemName("helmetCloth");
+ public static Item plateLeather = (new ItemArmor(43, 0, 0, 1)).setIconCoord(0, 1).setItemName("chestplateCloth");
+ public static Item legsLeather = (new ItemArmor(44, 0, 0, 2)).setIconCoord(0, 2).setItemName("leggingsCloth");
+ public static Item bootsLeather = (new ItemArmor(45, 0, 0, 3)).setIconCoord(0, 3).setItemName("bootsCloth");
+ public static Item helmetChain = (new ItemArmor(46, 1, 1, 0)).setIconCoord(1, 0).setItemName("helmetChain");
+ public static Item plateChain = (new ItemArmor(47, 1, 1, 1)).setIconCoord(1, 1).setItemName("chestplateChain");
+ public static Item legsChain = (new ItemArmor(48, 1, 1, 2)).setIconCoord(1, 2).setItemName("leggingsChain");
+ public static Item bootsChain = (new ItemArmor(49, 1, 1, 3)).setIconCoord(1, 3).setItemName("bootsChain");
+ public static Item helmetSteel = (new ItemArmor(50, 2, 2, 0)).setIconCoord(2, 0).setItemName("helmetIron");
+ public static Item plateSteel = (new ItemArmor(51, 2, 2, 1)).setIconCoord(2, 1).setItemName("chestplateIron");
+ public static Item legsSteel = (new ItemArmor(52, 2, 2, 2)).setIconCoord(2, 2).setItemName("leggingsIron");
+ public static Item bootsSteel = (new ItemArmor(53, 2, 2, 3)).setIconCoord(2, 3).setItemName("bootsIron");
+ public static Item helmetDiamond = (new ItemArmor(54, 3, 3, 0)).setIconCoord(3, 0).setItemName("helmetDiamond");
+ public static Item plateDiamond = (new ItemArmor(55, 3, 3, 1)).setIconCoord(3, 1).setItemName("chestplateDiamond");
+ public static Item legsDiamond = (new ItemArmor(56, 3, 3, 2)).setIconCoord(3, 2).setItemName("leggingsDiamond");
+ public static Item bootsDiamond = (new ItemArmor(57, 3, 3, 3)).setIconCoord(3, 3).setItemName("bootsDiamond");
+ public static Item helmetGold = (new ItemArmor(58, 1, 4, 0)).setIconCoord(4, 0).setItemName("helmetGold");
+ public static Item plateGold = (new ItemArmor(59, 1, 4, 1)).setIconCoord(4, 1).setItemName("chestplateGold");
+ public static Item legsGold = (new ItemArmor(60, 1, 4, 2)).setIconCoord(4, 2).setItemName("leggingsGold");
+ public static Item bootsGold = (new ItemArmor(61, 1, 4, 3)).setIconCoord(4, 3).setItemName("bootsGold");
+ public static Item flint = (new Item(62)).setIconCoord(6, 0).setItemName("flint");
+ public static Item porkRaw = (new ItemFood(63, 3, true)).setIconCoord(7, 5).setItemName("porkchopRaw");
+ public static Item porkCooked = (new ItemFood(64, 8, true)).setIconCoord(8, 5).setItemName("porkchopCooked");
+ public static Item painting = (new ItemPainting(65)).setIconCoord(10, 1).setItemName("painting");
+ public static Item appleGold = (new ItemFood(66, 42, false)).setIconCoord(11, 0).setItemName("appleGold");
+ public static Item sign = (new ItemSign(67)).setIconCoord(10, 2).setItemName("sign");
+ public static Item doorWood = (new ItemDoor(68, Material.wood)).setIconCoord(11, 2).setItemName("doorWood");
+ public static Item bucketEmpty = (new ItemBucket(69, 0)).setIconCoord(10, 4).setItemName("bucket");
+ public static Item bucketWater = (new ItemBucket(70, Block.waterMoving.blockID)).setIconCoord(11, 4).setItemName("bucketWater").setContainerItem(bucketEmpty);
+ public static Item bucketLava = (new ItemBucket(71, Block.lavaMoving.blockID)).setIconCoord(12, 4).setItemName("bucketLava").setContainerItem(bucketEmpty);
+ public static Item minecartEmpty = (new ItemMinecart(72, 0)).setIconCoord(7, 8).setItemName("minecart");
+ public static Item saddle = (new ItemSaddle(73)).setIconCoord(8, 6).setItemName("saddle");
+ public static Item doorSteel = (new ItemDoor(74, Material.iron)).setIconCoord(12, 2).setItemName("doorIron");
+ public static Item redstone = (new ItemRedstone(75)).setIconCoord(8, 3).setItemName("redstone");
+ public static Item snowball = (new ItemSnowball(76)).setIconCoord(14, 0).setItemName("snowball");
+ public static Item boat = (new ItemBoat(77)).setIconCoord(8, 8).setItemName("boat");
+ public static Item leather = (new Item(78)).setIconCoord(7, 6).setItemName("leather");
+ public static Item bucketMilk = (new ItemBucket(79, -1)).setIconCoord(13, 4).setItemName("milk").setContainerItem(bucketEmpty);
+ public static Item brick = (new Item(80)).setIconCoord(6, 1).setItemName("brick");
+ public static Item clay = (new Item(81)).setIconCoord(9, 3).setItemName("clay");
+ public static Item reed = (new ItemReed(82, Block.reed)).setIconCoord(11, 1).setItemName("reeds");
+ public static Item paper = (new Item(83)).setIconCoord(10, 3).setItemName("paper");
+ public static Item book = (new Item(84)).setIconCoord(11, 3).setItemName("book");
+ public static Item slimeBall = (new Item(85)).setIconCoord(14, 1).setItemName("slimeball");
+ public static Item minecartCrate = (new ItemMinecart(86, 1)).setIconCoord(7, 9).setItemName("minecartChest");
+ public static Item minecartPowered = (new ItemMinecart(87, 2)).setIconCoord(7, 10).setItemName("minecartFurnace");
+ public static Item egg = (new ItemEgg(88)).setIconCoord(12, 0).setItemName("egg");
+ public static Item compass = (new Item(89)).setIconCoord(6, 3).setItemName("compass");
+ public static Item fishingRod = (new ItemFishingRod(90)).setIconCoord(5, 4).setItemName("fishingRod");
+ public static Item pocketSundial = (new Item(91)).setIconCoord(6, 4).setItemName("clock");
+ public static Item lightStoneDust = (new Item(92)).setIconCoord(9, 4).setItemName("yellowDust");
+ public static Item fishRaw = (new ItemFood(93, 2, false)).setIconCoord(9, 5).setItemName("fishRaw");
+ public static Item fishCooked = (new ItemFood(94, 5, false)).setIconCoord(10, 5).setItemName("fishCooked");
+ public static Item dyePowder = (new ItemDye(95)).setIconCoord(14, 4).setItemName("dyePowder");
+ public static Item bone = (new Item(96)).setIconCoord(12, 1).setItemName("bone").setFull3D();
+ public static Item sugar = (new Item(97)).setIconCoord(13, 0).setItemName("sugar").setFull3D();
+ public static Item cake = (new ItemReed(98, Block.cake)).setMaxStackSize(1).setIconCoord(13, 1).setItemName("cake");
+ public static Item bed = (new ItemBed(99)).setMaxStackSize(1).setIconCoord(13, 2).setItemName("bed");
+ public static Item redstoneRepeater = (new ItemReed(100, Block.redstoneRepeaterIdle)).setIconCoord(6, 5).setItemName("diode");
+ public static Item cookie = (new ItemCookie(101, 1, false, 8)).setIconCoord(12, 5).setItemName("cookie");
+ public static ItemMap field_28021_bb = (ItemMap)(new ItemMap(102)).setIconCoord(12, 3).setItemName("map");
+ public static ItemShears field_31022_bc = (ItemShears)(new ItemShears(103)).setIconCoord(13, 5).setItemName("shears");
+ public static Item record13 = (new ItemRecord(2000, "13")).setIconCoord(0, 15).setItemName("record");
+ public static Item recordCat = (new ItemRecord(2001, "cat")).setIconCoord(1, 15).setItemName("record");
+ public final int shiftedIndex;
+ protected int maxStackSize = 64;
+ private int maxDamage = 0;
+ protected int iconIndex;
+ protected boolean bFull3D = false;
+ protected boolean hasSubtypes = false;
+ private Item containerItem = null;
+ private String itemName;
+
+ protected Item(int var1) {
+ this.shiftedIndex = 256 + var1;
+ if(itemsList[256 + var1] != null) {
+ System.out.println("CONFLICT @ " + var1);
+ }
+
+ itemsList[256 + var1] = this;
+ }
+
+ public Item setIconIndex(int var1) {
+ this.iconIndex = var1;
+ return this;
+ }
+
+ public Item setMaxStackSize(int var1) {
+ this.maxStackSize = var1;
+ return this;
+ }
+
+ public Item setIconCoord(int var1, int var2) {
+ this.iconIndex = var1 + var2 * 16;
+ return this;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ return false;
+ }
+
+ public float getStrVsBlock(ItemStack var1, Block var2) {
+ return 1.0F;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ return var1;
+ }
+
+ public int getItemStackLimit() {
+ return this.maxStackSize;
+ }
+
+ public int getMetadata(int var1) {
+ return 0;
+ }
+
+ public boolean getHasSubtypes() {
+ return this.hasSubtypes;
+ }
+
+ protected Item setHasSubtypes(boolean var1) {
+ this.hasSubtypes = var1;
+ return this;
+ }
+
+ public int getMaxDamage() {
+ return this.maxDamage;
+ }
+
+ protected Item setMaxDamage(int var1) {
+ this.maxDamage = var1;
+ return this;
+ }
+
+ public boolean func_25005_e() {
+ return this.maxDamage > 0 && !this.hasSubtypes;
+ }
+
+ public boolean hitEntity(ItemStack var1, EntityLiving var2, EntityLiving var3) {
+ return false;
+ }
+
+ public boolean func_25007_a(ItemStack var1, int var2, int var3, int var4, int var5, EntityLiving var6) {
+ return false;
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ return 1;
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return false;
+ }
+
+ public void saddleEntity(ItemStack var1, EntityLiving var2) {
+ }
+
+ public Item setFull3D() {
+ this.bFull3D = true;
+ return this;
+ }
+
+ public Item setItemName(String var1) {
+ this.itemName = "item." + var1;
+ return this;
+ }
+
+ public String getItemName() {
+ return this.itemName;
+ }
+
+ public Item setContainerItem(Item var1) {
+ if(this.maxStackSize > 1) {
+ throw new IllegalArgumentException("Max stack size must be 1 for items with crafting results");
+ } else {
+ this.containerItem = var1;
+ return this;
+ }
+ }
+
+ public Item getContainerItem() {
+ return this.containerItem;
+ }
+
+ public boolean hasContainerItem() {
+ return this.containerItem != null;
+ }
+
+ public String func_25006_i() {
+ return StatCollector.translateToLocal(this.getItemName() + ".name");
+ }
+
+ public void func_28018_a(ItemStack var1, World var2, Entity var3, int var4, boolean var5) {
+ }
+
+ public void func_28020_c(ItemStack var1, World var2, EntityPlayer var3) {
+ }
+
+ public boolean func_28019_b() {
+ return false;
+ }
+
+ static {
+ StatList.func_25086_b();
+ }
+}
diff --git a/src/net/minecraft/src/ItemArmor.java b/src/net/minecraft/src/ItemArmor.java
new file mode 100644
index 0000000..5462393
--- /dev/null
+++ b/src/net/minecraft/src/ItemArmor.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+public class ItemArmor extends Item {
+ private static final int[] damageReduceAmountArray = new int[]{3, 8, 6, 3};
+ private static final int[] maxDamageArray = new int[]{11, 16, 15, 13};
+ public final int armorLevel;
+ public final int armorType;
+ public final int damageReduceAmount;
+ public final int renderIndex;
+
+ public ItemArmor(int var1, int var2, int var3, int var4) {
+ super(var1);
+ this.armorLevel = var2;
+ this.armorType = var4;
+ this.renderIndex = var3;
+ this.damageReduceAmount = damageReduceAmountArray[var4];
+ this.setMaxDamage(maxDamageArray[var4] * 3 << var2);
+ this.maxStackSize = 1;
+ }
+}
diff --git a/src/net/minecraft/src/ItemAxe.java b/src/net/minecraft/src/ItemAxe.java
new file mode 100644
index 0000000..361ebc0
--- /dev/null
+++ b/src/net/minecraft/src/ItemAxe.java
@@ -0,0 +1,9 @@
+package net.minecraft.src;
+
+public class ItemAxe extends ItemTool {
+ private static Block[] blocksEffectiveAgainst = new Block[]{Block.planks, Block.bookShelf, Block.wood, Block.chest};
+
+ protected ItemAxe(int var1, EnumToolMaterial var2) {
+ super(var1, 3, var2, blocksEffectiveAgainst);
+ }
+}
diff --git a/src/net/minecraft/src/ItemBed.java b/src/net/minecraft/src/ItemBed.java
new file mode 100644
index 0000000..fa0e652
--- /dev/null
+++ b/src/net/minecraft/src/ItemBed.java
@@ -0,0 +1,43 @@
+package net.minecraft.src;
+
+public class ItemBed extends Item {
+ public ItemBed(int var1) {
+ super(var1);
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 != 1) {
+ return false;
+ } else {
+ ++var5;
+ BlockBed var8 = (BlockBed)Block.bed;
+ int var9 = MathHelper.floor_double((double)(var2.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+ byte var10 = 0;
+ byte var11 = 0;
+ if(var9 == 0) {
+ var11 = 1;
+ }
+
+ if(var9 == 1) {
+ var10 = -1;
+ }
+
+ if(var9 == 2) {
+ var11 = -1;
+ }
+
+ if(var9 == 3) {
+ var10 = 1;
+ }
+
+ if(var3.isAirBlock(var4, var5, var6) && var3.isAirBlock(var4 + var10, var5, var6 + var11) && var3.isBlockNormalCube(var4, var5 - 1, var6) && var3.isBlockNormalCube(var4 + var10, var5 - 1, var6 + var11)) {
+ var3.setBlockAndMetadataWithNotify(var4, var5, var6, var8.blockID, var9);
+ var3.setBlockAndMetadataWithNotify(var4 + var10, var5, var6 + var11, var8.blockID, var9 + 8);
+ --var1.stackSize;
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemBlock.java b/src/net/minecraft/src/ItemBlock.java
new file mode 100644
index 0000000..dfcefd6
--- /dev/null
+++ b/src/net/minecraft/src/ItemBlock.java
@@ -0,0 +1,63 @@
+package net.minecraft.src;
+
+public class ItemBlock extends Item {
+ private int blockID;
+
+ public ItemBlock(int var1) {
+ super(var1);
+ this.blockID = var1 + 256;
+ this.setIconIndex(Block.blocksList[var1 + 256].getBlockTextureFromSide(2));
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var3.getBlockId(var4, var5, var6) == Block.snow.blockID) {
+ var7 = 0;
+ } else {
+ if(var7 == 0) {
+ --var5;
+ }
+
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+ }
+
+ if(var1.stackSize == 0) {
+ return false;
+ } else if(var5 == 127 && Block.blocksList[this.blockID].blockMaterial.isSolid()) {
+ return false;
+ } else if(var3.canBlockBePlacedAt(this.blockID, var4, var5, var6, false, var7)) {
+ Block var8 = Block.blocksList[this.blockID];
+ if(var3.setBlockAndMetadataWithNotify(var4, var5, var6, this.blockID, this.getMetadata(var1.getItemDamage()))) {
+ Block.blocksList[this.blockID].onBlockPlaced(var3, var4, var5, var6, var7);
+ Block.blocksList[this.blockID].onBlockPlacedBy(var3, var4, var5, var6, var2);
+ var3.playSoundEffect((double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), var8.stepSound.func_737_c(), (var8.stepSound.getVolume() + 1.0F) / 2.0F, var8.stepSound.getPitch() * 0.8F);
+ --var1.stackSize;
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public String getItemName() {
+ return Block.blocksList[this.blockID].getBlockName();
+ }
+}
diff --git a/src/net/minecraft/src/ItemBoat.java b/src/net/minecraft/src/ItemBoat.java
new file mode 100644
index 0000000..480d357
--- /dev/null
+++ b/src/net/minecraft/src/ItemBoat.java
@@ -0,0 +1,47 @@
+package net.minecraft.src;
+
+public class ItemBoat extends Item {
+ public ItemBoat(int var1) {
+ super(var1);
+ this.maxStackSize = 1;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ float var4 = 1.0F;
+ float var5 = var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * var4;
+ float var6 = var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var4;
+ double var7 = var3.prevPosX + (var3.posX - var3.prevPosX) * (double)var4;
+ double var9 = var3.prevPosY + (var3.posY - var3.prevPosY) * (double)var4 + 1.62D - (double)var3.yOffset;
+ double var11 = var3.prevPosZ + (var3.posZ - var3.prevPosZ) * (double)var4;
+ Vec3D var13 = Vec3D.createVector(var7, var9, var11);
+ float var14 = MathHelper.cos(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var15 = MathHelper.sin(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var16 = -MathHelper.cos(-var5 * ((float)Math.PI / 180.0F));
+ float var17 = MathHelper.sin(-var5 * ((float)Math.PI / 180.0F));
+ float var18 = var15 * var16;
+ float var20 = var14 * var16;
+ double var21 = 5.0D;
+ Vec3D var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21);
+ MovingObjectPosition var24 = var2.rayTraceBlocks_do(var13, var23, true);
+ if(var24 == null) {
+ return var1;
+ } else {
+ if(var24.typeOfHit == EnumMovingObjectType.TILE) {
+ int var25 = var24.blockX;
+ int var26 = var24.blockY;
+ int var27 = var24.blockZ;
+ if(!var2.singleplayerWorld) {
+ if(var2.getBlockId(var25, var26, var27) == Block.snow.blockID) {
+ --var26;
+ }
+
+ var2.entityJoinedWorld(new EntityBoat(var2, (double)((float)var25 + 0.5F), (double)((float)var26 + 1.0F), (double)((float)var27 + 0.5F)));
+ }
+
+ --var1.stackSize;
+ }
+
+ return var1;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemBow.java b/src/net/minecraft/src/ItemBow.java
new file mode 100644
index 0000000..d6d9418
--- /dev/null
+++ b/src/net/minecraft/src/ItemBow.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public class ItemBow extends Item {
+ public ItemBow(int var1) {
+ super(var1);
+ this.maxStackSize = 1;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ if(var3.inventory.consumeInventoryItem(Item.arrow.shiftedIndex)) {
+ var2.playSoundAtEntity(var3, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 0.8F));
+ if(!var2.singleplayerWorld) {
+ var2.entityJoinedWorld(new EntityArrow(var2, var3));
+ }
+ }
+
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/ItemBucket.java b/src/net/minecraft/src/ItemBucket.java
new file mode 100644
index 0000000..7a48ec4
--- /dev/null
+++ b/src/net/minecraft/src/ItemBucket.java
@@ -0,0 +1,100 @@
+package net.minecraft.src;
+
+public class ItemBucket extends Item {
+ private int isFull;
+
+ public ItemBucket(int var1, int var2) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.isFull = var2;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ float var4 = 1.0F;
+ float var5 = var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * var4;
+ float var6 = var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var4;
+ double var7 = var3.prevPosX + (var3.posX - var3.prevPosX) * (double)var4;
+ double var9 = var3.prevPosY + (var3.posY - var3.prevPosY) * (double)var4 + 1.62D - (double)var3.yOffset;
+ double var11 = var3.prevPosZ + (var3.posZ - var3.prevPosZ) * (double)var4;
+ Vec3D var13 = Vec3D.createVector(var7, var9, var11);
+ float var14 = MathHelper.cos(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var15 = MathHelper.sin(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var16 = -MathHelper.cos(-var5 * ((float)Math.PI / 180.0F));
+ float var17 = MathHelper.sin(-var5 * ((float)Math.PI / 180.0F));
+ float var18 = var15 * var16;
+ float var20 = var14 * var16;
+ double var21 = 5.0D;
+ Vec3D var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21);
+ MovingObjectPosition var24 = var2.rayTraceBlocks_do(var13, var23, this.isFull == 0);
+ if(var24 == null) {
+ return var1;
+ } else {
+ if(var24.typeOfHit == EnumMovingObjectType.TILE) {
+ int var25 = var24.blockX;
+ int var26 = var24.blockY;
+ int var27 = var24.blockZ;
+ if(!var2.canMineBlock(var3, var25, var26, var27)) {
+ return var1;
+ }
+
+ if(this.isFull == 0) {
+ if(var2.getBlockMaterial(var25, var26, var27) == Material.water && var2.getBlockMetadata(var25, var26, var27) == 0) {
+ var2.setBlockWithNotify(var25, var26, var27, 0);
+ return new ItemStack(Item.bucketWater);
+ }
+
+ if(var2.getBlockMaterial(var25, var26, var27) == Material.lava && var2.getBlockMetadata(var25, var26, var27) == 0) {
+ var2.setBlockWithNotify(var25, var26, var27, 0);
+ return new ItemStack(Item.bucketLava);
+ }
+ } else {
+ if(this.isFull < 0) {
+ return new ItemStack(Item.bucketEmpty);
+ }
+
+ if(var24.sideHit == 0) {
+ --var26;
+ }
+
+ if(var24.sideHit == 1) {
+ ++var26;
+ }
+
+ if(var24.sideHit == 2) {
+ --var27;
+ }
+
+ if(var24.sideHit == 3) {
+ ++var27;
+ }
+
+ if(var24.sideHit == 4) {
+ --var25;
+ }
+
+ if(var24.sideHit == 5) {
+ ++var25;
+ }
+
+ if(var2.isAirBlock(var25, var26, var27) || !var2.getBlockMaterial(var25, var26, var27).isSolid()) {
+ if(var2.worldProvider.isHellWorld && this.isFull == Block.waterMoving.blockID) {
+ var2.playSoundEffect(var7 + 0.5D, var9 + 0.5D, var11 + 0.5D, "random.fizz", 0.5F, 2.6F + (var2.rand.nextFloat() - var2.rand.nextFloat()) * 0.8F);
+
+ for(int var28 = 0; var28 < 8; ++var28) {
+ var2.spawnParticle("largesmoke", (double)var25 + Math.random(), (double)var26 + Math.random(), (double)var27 + Math.random(), 0.0D, 0.0D, 0.0D);
+ }
+ } else {
+ var2.setBlockAndMetadataWithNotify(var25, var26, var27, this.isFull, 0);
+ }
+
+ return new ItemStack(Item.bucketEmpty);
+ }
+ }
+ } else if(this.isFull == 0 && var24.entityHit instanceof EntityCow) {
+ return new ItemStack(Item.bucketMilk);
+ }
+
+ return var1;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemCloth.java b/src/net/minecraft/src/ItemCloth.java
new file mode 100644
index 0000000..9e19797
--- /dev/null
+++ b/src/net/minecraft/src/ItemCloth.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class ItemCloth extends ItemBlock {
+ public ItemCloth(int var1) {
+ super(var1);
+ this.setMaxDamage(0);
+ this.setHasSubtypes(true);
+ }
+
+ public int getMetadata(int var1) {
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/ItemCoal.java b/src/net/minecraft/src/ItemCoal.java
new file mode 100644
index 0000000..509cba1
--- /dev/null
+++ b/src/net/minecraft/src/ItemCoal.java
@@ -0,0 +1,9 @@
+package net.minecraft.src;
+
+public class ItemCoal extends Item {
+ public ItemCoal(int var1) {
+ super(var1);
+ this.setHasSubtypes(true);
+ this.setMaxDamage(0);
+ }
+}
diff --git a/src/net/minecraft/src/ItemCookie.java b/src/net/minecraft/src/ItemCookie.java
new file mode 100644
index 0000000..e41d499
--- /dev/null
+++ b/src/net/minecraft/src/ItemCookie.java
@@ -0,0 +1,8 @@
+package net.minecraft.src;
+
+public class ItemCookie extends ItemFood {
+ public ItemCookie(int var1, int var2, boolean var3, int var4) {
+ super(var1, var2, var3);
+ this.maxStackSize = var4;
+ }
+}
diff --git a/src/net/minecraft/src/ItemDoor.java b/src/net/minecraft/src/ItemDoor.java
new file mode 100644
index 0000000..04b59b7
--- /dev/null
+++ b/src/net/minecraft/src/ItemDoor.java
@@ -0,0 +1,73 @@
+package net.minecraft.src;
+
+public class ItemDoor extends Item {
+ private Material field_260_a;
+
+ public ItemDoor(int var1, Material var2) {
+ super(var1);
+ this.field_260_a = var2;
+ this.maxStackSize = 1;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 != 1) {
+ return false;
+ } else {
+ ++var5;
+ Block var8;
+ if(this.field_260_a == Material.wood) {
+ var8 = Block.doorWood;
+ } else {
+ var8 = Block.doorSteel;
+ }
+
+ if(!var8.canPlaceBlockAt(var3, var4, var5, var6)) {
+ return false;
+ } else {
+ int var9 = MathHelper.floor_double((double)((var2.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3;
+ byte var10 = 0;
+ byte var11 = 0;
+ if(var9 == 0) {
+ var11 = 1;
+ }
+
+ if(var9 == 1) {
+ var10 = -1;
+ }
+
+ if(var9 == 2) {
+ var11 = -1;
+ }
+
+ if(var9 == 3) {
+ var10 = 1;
+ }
+
+ int var12 = (var3.isBlockNormalCube(var4 - var10, var5, var6 - var11) ? 1 : 0) + (var3.isBlockNormalCube(var4 - var10, var5 + 1, var6 - var11) ? 1 : 0);
+ int var13 = (var3.isBlockNormalCube(var4 + var10, var5, var6 + var11) ? 1 : 0) + (var3.isBlockNormalCube(var4 + var10, var5 + 1, var6 + var11) ? 1 : 0);
+ boolean var14 = var3.getBlockId(var4 - var10, var5, var6 - var11) == var8.blockID || var3.getBlockId(var4 - var10, var5 + 1, var6 - var11) == var8.blockID;
+ boolean var15 = var3.getBlockId(var4 + var10, var5, var6 + var11) == var8.blockID || var3.getBlockId(var4 + var10, var5 + 1, var6 + var11) == var8.blockID;
+ boolean var16 = false;
+ if(var14 && !var15) {
+ var16 = true;
+ } else if(var13 > var12) {
+ var16 = true;
+ }
+
+ if(var16) {
+ var9 = var9 - 1 & 3;
+ var9 += 4;
+ }
+
+ var3.editingBlocks = true;
+ var3.setBlockAndMetadataWithNotify(var4, var5, var6, var8.blockID, var9);
+ var3.setBlockAndMetadataWithNotify(var4, var5 + 1, var6, var8.blockID, var9 + 8);
+ var3.editingBlocks = false;
+ var3.notifyBlocksOfNeighborChange(var4, var5, var6, var8.blockID);
+ var3.notifyBlocksOfNeighborChange(var4, var5 + 1, var6, var8.blockID);
+ --var1.stackSize;
+ return true;
+ }
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemDye.java b/src/net/minecraft/src/ItemDye.java
new file mode 100644
index 0000000..fe795c1
--- /dev/null
+++ b/src/net/minecraft/src/ItemDye.java
@@ -0,0 +1,83 @@
+package net.minecraft.src;
+
+public class ItemDye extends Item {
+ public static final String[] dyeColors = new String[]{"black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "lightBlue", "magenta", "orange", "white"};
+ public static final int[] field_31023_bk = new int[]{1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 2651799, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320};
+
+ public ItemDye(int var1) {
+ super(var1);
+ this.setHasSubtypes(true);
+ this.setMaxDamage(0);
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var1.getItemDamage() == 15) {
+ int var8 = var3.getBlockId(var4, var5, var6);
+ if(var8 == Block.sapling.blockID) {
+ if(!var3.singleplayerWorld) {
+ ((BlockSapling)Block.sapling).growTree(var3, var4, var5, var6, var3.rand);
+ --var1.stackSize;
+ }
+
+ return true;
+ }
+
+ if(var8 == Block.crops.blockID) {
+ if(!var3.singleplayerWorld) {
+ ((BlockCrops)Block.crops).fertilize(var3, var4, var5, var6);
+ --var1.stackSize;
+ }
+
+ return true;
+ }
+
+ if(var8 == Block.grass.blockID) {
+ if(!var3.singleplayerWorld) {
+ --var1.stackSize;
+
+ label53:
+ for(int var9 = 0; var9 < 128; ++var9) {
+ int var10 = var4;
+ int var11 = var5 + 1;
+ int var12 = var6;
+
+ for(int var13 = 0; var13 < var9 / 16; ++var13) {
+ var10 += itemRand.nextInt(3) - 1;
+ var11 += (itemRand.nextInt(3) - 1) * itemRand.nextInt(3) / 2;
+ var12 += itemRand.nextInt(3) - 1;
+ if(var3.getBlockId(var10, var11 - 1, var12) != Block.grass.blockID || var3.isBlockNormalCube(var10, var11, var12)) {
+ continue label53;
+ }
+ }
+
+ if(var3.getBlockId(var10, var11, var12) == 0) {
+ if(itemRand.nextInt(10) != 0) {
+ var3.setBlockAndMetadataWithNotify(var10, var11, var12, Block.tallGrass.blockID, 1);
+ } else if(itemRand.nextInt(3) != 0) {
+ var3.setBlockWithNotify(var10, var11, var12, Block.plantYellow.blockID);
+ } else {
+ var3.setBlockWithNotify(var10, var11, var12, Block.plantRed.blockID);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public void saddleEntity(ItemStack var1, EntityLiving var2) {
+ if(var2 instanceof EntitySheep) {
+ EntitySheep var3 = (EntitySheep)var2;
+ int var4 = BlockCloth.func_21033_c(var1.getItemDamage());
+ if(!var3.func_21069_f_() && var3.getFleeceColor() != var4) {
+ var3.setFleeceColor(var4);
+ --var1.stackSize;
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/ItemEgg.java b/src/net/minecraft/src/ItemEgg.java
new file mode 100644
index 0000000..b6e2743
--- /dev/null
+++ b/src/net/minecraft/src/ItemEgg.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+public class ItemEgg extends Item {
+ public ItemEgg(int var1) {
+ super(var1);
+ this.maxStackSize = 16;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ --var1.stackSize;
+ var2.playSoundAtEntity(var3, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
+ if(!var2.singleplayerWorld) {
+ var2.entityJoinedWorld(new EntityEgg(var2, var3));
+ }
+
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/ItemFishingRod.java b/src/net/minecraft/src/ItemFishingRod.java
new file mode 100644
index 0000000..e80e36d
--- /dev/null
+++ b/src/net/minecraft/src/ItemFishingRod.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public class ItemFishingRod extends Item {
+ public ItemFishingRod(int var1) {
+ super(var1);
+ this.setMaxDamage(64);
+ this.setMaxStackSize(1);
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ if(var3.fishEntity != null) {
+ int var4 = var3.fishEntity.catchFish();
+ var1.damageItem(var4, var3);
+ var3.swingItem();
+ } else {
+ var2.playSoundAtEntity(var3, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
+ if(!var2.singleplayerWorld) {
+ var2.entityJoinedWorld(new EntityFish(var2, var3));
+ }
+
+ var3.swingItem();
+ }
+
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/ItemFlintAndSteel.java b/src/net/minecraft/src/ItemFlintAndSteel.java
new file mode 100644
index 0000000..44d601e
--- /dev/null
+++ b/src/net/minecraft/src/ItemFlintAndSteel.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+public class ItemFlintAndSteel extends Item {
+ public ItemFlintAndSteel(int var1) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.setMaxDamage(64);
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 == 0) {
+ --var5;
+ }
+
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+
+ int var8 = var3.getBlockId(var4, var5, var6);
+ if(var8 == 0) {
+ var3.playSoundEffect((double)var4 + 0.5D, (double)var5 + 0.5D, (double)var6 + 0.5D, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);
+ var3.setBlockWithNotify(var4, var5, var6, Block.fire.blockID);
+ }
+
+ var1.damageItem(1, var2);
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/ItemFood.java b/src/net/minecraft/src/ItemFood.java
new file mode 100644
index 0000000..78b2fde
--- /dev/null
+++ b/src/net/minecraft/src/ItemFood.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+public class ItemFood extends Item {
+ private int healAmount;
+ private boolean field_25011_bi;
+
+ public ItemFood(int var1, int var2, boolean var3) {
+ super(var1);
+ this.healAmount = var2;
+ this.field_25011_bi = var3;
+ this.maxStackSize = 1;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ --var1.stackSize;
+ var3.heal(this.healAmount);
+ return var1;
+ }
+
+ public int getHealAmount() {
+ return this.healAmount;
+ }
+
+ public boolean func_25010_k() {
+ return this.field_25011_bi;
+ }
+}
diff --git a/src/net/minecraft/src/ItemHoe.java b/src/net/minecraft/src/ItemHoe.java
new file mode 100644
index 0000000..ae636c6
--- /dev/null
+++ b/src/net/minecraft/src/ItemHoe.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+public class ItemHoe extends Item {
+ public ItemHoe(int var1, EnumToolMaterial var2) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.setMaxDamage(var2.getMaxUses());
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ int var8 = var3.getBlockId(var4, var5, var6);
+ int var9 = var3.getBlockId(var4, var5 + 1, var6);
+ if((var7 == 0 || var9 != 0 || var8 != Block.grass.blockID) && var8 != Block.dirt.blockID) {
+ return false;
+ } else {
+ Block var10 = Block.tilledField;
+ var3.playSoundEffect((double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), var10.stepSound.func_737_c(), (var10.stepSound.getVolume() + 1.0F) / 2.0F, var10.stepSound.getPitch() * 0.8F);
+ if(var3.singleplayerWorld) {
+ return true;
+ } else {
+ var3.setBlockWithNotify(var4, var5, var6, var10.blockID);
+ var1.damageItem(1, var2);
+ return true;
+ }
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemInWorldManager.java b/src/net/minecraft/src/ItemInWorldManager.java
new file mode 100644
index 0000000..305ad0a
--- /dev/null
+++ b/src/net/minecraft/src/ItemInWorldManager.java
@@ -0,0 +1,133 @@
+package net.minecraft.src;
+
+public class ItemInWorldManager {
+ private WorldServer thisWorld;
+ public EntityPlayer thisPlayer;
+ private float field_672_d = 0.0F;
+ private int field_22055_d;
+ private int field_22054_g;
+ private int field_22053_h;
+ private int field_22052_i;
+ private int field_22051_j;
+ private boolean field_22050_k;
+ private int field_22049_l;
+ private int field_22048_m;
+ private int field_22047_n;
+ private int field_22046_o;
+
+ public ItemInWorldManager(WorldServer var1) {
+ this.thisWorld = var1;
+ }
+
+ public void func_328_a() {
+ ++this.field_22051_j;
+ if(this.field_22050_k) {
+ int var1 = this.field_22051_j - this.field_22046_o;
+ int var2 = this.thisWorld.getBlockId(this.field_22049_l, this.field_22048_m, this.field_22047_n);
+ if(var2 != 0) {
+ Block var3 = Block.blocksList[var2];
+ float var4 = var3.blockStrength(this.thisPlayer) * (float)(var1 + 1);
+ if(var4 >= 1.0F) {
+ this.field_22050_k = false;
+ this.func_325_c(this.field_22049_l, this.field_22048_m, this.field_22047_n);
+ }
+ } else {
+ this.field_22050_k = false;
+ }
+ }
+
+ }
+
+ public void func_324_a(int var1, int var2, int var3, int var4) {
+ this.thisWorld.func_28096_a((EntityPlayer)null, var1, var2, var3, var4);
+ this.field_22055_d = this.field_22051_j;
+ int var5 = this.thisWorld.getBlockId(var1, var2, var3);
+ if(var5 > 0) {
+ Block.blocksList[var5].onBlockClicked(this.thisWorld, var1, var2, var3, this.thisPlayer);
+ }
+
+ if(var5 > 0 && Block.blocksList[var5].blockStrength(this.thisPlayer) >= 1.0F) {
+ this.func_325_c(var1, var2, var3);
+ } else {
+ this.field_22054_g = var1;
+ this.field_22053_h = var2;
+ this.field_22052_i = var3;
+ }
+
+ }
+
+ public void func_22045_b(int var1, int var2, int var3) {
+ if(var1 == this.field_22054_g && var2 == this.field_22053_h && var3 == this.field_22052_i) {
+ int var4 = this.field_22051_j - this.field_22055_d;
+ int var5 = this.thisWorld.getBlockId(var1, var2, var3);
+ if(var5 != 0) {
+ Block var6 = Block.blocksList[var5];
+ float var7 = var6.blockStrength(this.thisPlayer) * (float)(var4 + 1);
+ if(var7 >= 0.7F) {
+ this.func_325_c(var1, var2, var3);
+ } else if(!this.field_22050_k) {
+ this.field_22050_k = true;
+ this.field_22049_l = var1;
+ this.field_22048_m = var2;
+ this.field_22047_n = var3;
+ this.field_22046_o = this.field_22055_d;
+ }
+ }
+ }
+
+ this.field_672_d = 0.0F;
+ }
+
+ public boolean removeBlock(int var1, int var2, int var3) {
+ Block var4 = Block.blocksList[this.thisWorld.getBlockId(var1, var2, var3)];
+ int var5 = this.thisWorld.getBlockMetadata(var1, var2, var3);
+ boolean var6 = this.thisWorld.setBlockWithNotify(var1, var2, var3, 0);
+ if(var4 != null && var6) {
+ var4.onBlockDestroyedByPlayer(this.thisWorld, var1, var2, var3, var5);
+ }
+
+ return var6;
+ }
+
+ public boolean func_325_c(int var1, int var2, int var3) {
+ int var4 = this.thisWorld.getBlockId(var1, var2, var3);
+ int var5 = this.thisWorld.getBlockMetadata(var1, var2, var3);
+ this.thisWorld.func_28101_a(this.thisPlayer, 2001, var1, var2, var3, var4 + this.thisWorld.getBlockMetadata(var1, var2, var3) * 256);
+ boolean var6 = this.removeBlock(var1, var2, var3);
+ ItemStack var7 = this.thisPlayer.getCurrentEquippedItem();
+ if(var7 != null) {
+ var7.func_25124_a(var4, var1, var2, var3, this.thisPlayer);
+ if(var7.stackSize == 0) {
+ var7.func_577_a(this.thisPlayer);
+ this.thisPlayer.destroyCurrentEquippedItem();
+ }
+ }
+
+ if(var6 && this.thisPlayer.canHarvestBlock(Block.blocksList[var4])) {
+ Block.blocksList[var4].harvestBlock(this.thisWorld, this.thisPlayer, var1, var2, var3, var5);
+ ((EntityPlayerMP)this.thisPlayer).playerNetServerHandler.sendPacket(new Packet53BlockChange(var1, var2, var3, this.thisWorld));
+ }
+
+ return var6;
+ }
+
+ public boolean func_6154_a(EntityPlayer var1, World var2, ItemStack var3) {
+ int var4 = var3.stackSize;
+ ItemStack var5 = var3.useItemRightClick(var2, var1);
+ if(var5 != var3 || var5 != null && var5.stackSize != var4) {
+ var1.inventory.mainInventory[var1.inventory.currentItem] = var5;
+ if(var5.stackSize == 0) {
+ var1.inventory.mainInventory[var1.inventory.currentItem] = null;
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean activeBlockOrUseItem(EntityPlayer var1, World var2, ItemStack var3, int var4, int var5, int var6, int var7) {
+ int var8 = var2.getBlockId(var4, var5, var6);
+ return var8 > 0 && Block.blocksList[var8].blockActivated(var2, var4, var5, var6, var1) ? true : (var3 == null ? false : var3.useItem(var1, var2, var4, var5, var6, var7));
+ }
+}
diff --git a/src/net/minecraft/src/ItemLeaves.java b/src/net/minecraft/src/ItemLeaves.java
new file mode 100644
index 0000000..9b08c79
--- /dev/null
+++ b/src/net/minecraft/src/ItemLeaves.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class ItemLeaves extends ItemBlock {
+ public ItemLeaves(int var1) {
+ super(var1);
+ this.setMaxDamage(0);
+ this.setHasSubtypes(true);
+ }
+
+ public int getMetadata(int var1) {
+ return var1 | 8;
+ }
+}
diff --git a/src/net/minecraft/src/ItemLog.java b/src/net/minecraft/src/ItemLog.java
new file mode 100644
index 0000000..6df1c50
--- /dev/null
+++ b/src/net/minecraft/src/ItemLog.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class ItemLog extends ItemBlock {
+ public ItemLog(int var1) {
+ super(var1);
+ this.setMaxDamage(0);
+ this.setHasSubtypes(true);
+ }
+
+ public int getMetadata(int var1) {
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/ItemMap.java b/src/net/minecraft/src/ItemMap.java
new file mode 100644
index 0000000..9a01213
--- /dev/null
+++ b/src/net/minecraft/src/ItemMap.java
@@ -0,0 +1,228 @@
+package net.minecraft.src;
+
+public class ItemMap extends ItemMapBase {
+ protected ItemMap(int var1) {
+ super(var1);
+ this.setMaxStackSize(1);
+ }
+
+ public MapData func_28023_a(ItemStack var1, World var2) {
+ (new StringBuilder()).append("map_").append(var1.getItemDamage()).toString();
+ MapData var4 = (MapData)var2.func_28103_a(MapData.class, "map_" + var1.getItemDamage());
+ if(var4 == null) {
+ var1.setItemDamage(var2.func_28104_b("map"));
+ String var3 = "map_" + var1.getItemDamage();
+ var4 = new MapData(var3);
+ var4.field_28164_b = var2.getWorldInfo().getSpawnX();
+ var4.field_28163_c = var2.getWorldInfo().getSpawnZ();
+ var4.field_28161_e = 3;
+ var4.field_28162_d = (byte)var2.worldProvider.worldType;
+ var4.func_28146_a();
+ var2.func_28102_a(var3, var4);
+ }
+
+ return var4;
+ }
+
+ public void func_28024_a(World var1, Entity var2, MapData var3) {
+ if(var1.worldProvider.worldType == var3.field_28162_d) {
+ short var4 = 128;
+ short var5 = 128;
+ int var6 = 1 << var3.field_28161_e;
+ int var7 = var3.field_28164_b;
+ int var8 = var3.field_28163_c;
+ int var9 = MathHelper.floor_double(var2.posX - (double)var7) / var6 + var4 / 2;
+ int var10 = MathHelper.floor_double(var2.posZ - (double)var8) / var6 + var5 / 2;
+ int var11 = 128 / var6;
+ if(var1.worldProvider.field_4306_c) {
+ var11 /= 2;
+ }
+
+ ++var3.field_28159_g;
+
+ for(int var12 = var9 - var11 + 1; var12 < var9 + var11; ++var12) {
+ if((var12 & 15) == (var3.field_28159_g & 15)) {
+ int var13 = 255;
+ int var14 = 0;
+ double var15 = 0.0D;
+
+ for(int var17 = var10 - var11 - 1; var17 < var10 + var11; ++var17) {
+ if(var12 >= 0 && var17 >= -1 && var12 < var4 && var17 < var5) {
+ int var18 = var12 - var9;
+ int var19 = var17 - var10;
+ boolean var20 = var18 * var18 + var19 * var19 > (var11 - 2) * (var11 - 2);
+ int var21 = (var7 / var6 + var12 - var4 / 2) * var6;
+ int var22 = (var8 / var6 + var17 - var5 / 2) * var6;
+ byte var23 = 0;
+ byte var24 = 0;
+ byte var25 = 0;
+ int[] var26 = new int[256];
+ Chunk var27 = var1.getChunkFromBlockCoords(var21, var22);
+ int var28 = var21 & 15;
+ int var29 = var22 & 15;
+ int var30 = 0;
+ double var31 = 0.0D;
+ int var33;
+ int var34;
+ int var35;
+ int var38;
+ if(var1.worldProvider.field_4306_c) {
+ var33 = var21 + var22 * 231871;
+ var33 = var33 * var33 * 31287121 + var33 * 11;
+ if((var33 >> 20 & 1) == 0) {
+ var26[Block.dirt.blockID] += 10;
+ } else {
+ var26[Block.stone.blockID] += 10;
+ }
+
+ var31 = 100.0D;
+ } else {
+ for(var33 = 0; var33 < var6; ++var33) {
+ for(var34 = 0; var34 < var6; ++var34) {
+ var35 = var27.getHeightValue(var33 + var28, var34 + var29) + 1;
+ int var36 = 0;
+ if(var35 > 1) {
+ boolean var37 = false;
+
+ label164:
+ while(true) {
+ var37 = true;
+ var36 = var27.getBlockID(var33 + var28, var35 - 1, var34 + var29);
+ if(var36 == 0) {
+ var37 = false;
+ } else if(var35 > 0 && var36 > 0 && Block.blocksList[var36].blockMaterial.field_28131_A == MapColor.field_28199_b) {
+ var37 = false;
+ }
+
+ if(!var37) {
+ --var35;
+ var36 = var27.getBlockID(var33 + var28, var35 - 1, var34 + var29);
+ }
+
+ if(var37) {
+ if(var36 == 0 || !Block.blocksList[var36].blockMaterial.getIsLiquid()) {
+ break;
+ }
+
+ var38 = var35 - 1;
+ boolean var39 = false;
+
+ while(true) {
+ int var43 = var27.getBlockID(var33 + var28, var38--, var34 + var29);
+ ++var30;
+ if(var38 <= 0 || var43 == 0 || !Block.blocksList[var43].blockMaterial.getIsLiquid()) {
+ break label164;
+ }
+ }
+ }
+ }
+ }
+
+ var31 += (double)var35 / (double)(var6 * var6);
+ ++var26[var36];
+ }
+ }
+ }
+
+ var30 /= var6 * var6;
+ int var10000 = var23 / (var6 * var6);
+ var10000 = var24 / (var6 * var6);
+ var10000 = var25 / (var6 * var6);
+ var33 = 0;
+ var34 = 0;
+
+ for(var35 = 0; var35 < 256; ++var35) {
+ if(var26[var35] > var33) {
+ var34 = var35;
+ var33 = var26[var35];
+ }
+ }
+
+ double var41 = (var31 - var15) * 4.0D / (double)(var6 + 4) + ((double)(var12 + var17 & 1) - 0.5D) * 0.4D;
+ byte var42 = 1;
+ if(var41 > 0.6D) {
+ var42 = 2;
+ }
+
+ if(var41 < -0.6D) {
+ var42 = 0;
+ }
+
+ var38 = 0;
+ if(var34 > 0) {
+ MapColor var44 = Block.blocksList[var34].blockMaterial.field_28131_A;
+ if(var44 == MapColor.field_28187_n) {
+ var41 = (double)var30 * 0.1D + (double)(var12 + var17 & 1) * 0.2D;
+ var42 = 1;
+ if(var41 < 0.5D) {
+ var42 = 2;
+ }
+
+ if(var41 > 0.9D) {
+ var42 = 0;
+ }
+ }
+
+ var38 = var44.field_28184_q;
+ }
+
+ var15 = var31;
+ if(var17 >= 0 && var18 * var18 + var19 * var19 < var11 * var11 && (!var20 || (var12 + var17 & 1) != 0)) {
+ byte var45 = var3.field_28160_f[var12 + var17 * var4];
+ byte var40 = (byte)(var38 * 4 + var42);
+ if(var45 != var40) {
+ if(var13 > var17) {
+ var13 = var17;
+ }
+
+ if(var14 < var17) {
+ var14 = var17;
+ }
+
+ var3.field_28160_f[var12 + var17 * var4] = var40;
+ }
+ }
+ }
+ }
+
+ if(var13 <= var14) {
+ var3.func_28153_a(var12, var13, var14);
+ }
+ }
+ }
+
+ }
+ }
+
+ public void func_28018_a(ItemStack var1, World var2, Entity var3, int var4, boolean var5) {
+ if(!var2.singleplayerWorld) {
+ MapData var6 = this.func_28023_a(var1, var2);
+ if(var3 instanceof EntityPlayer) {
+ EntityPlayer var7 = (EntityPlayer)var3;
+ var6.func_28155_a(var7, var1);
+ }
+
+ if(var5) {
+ this.func_28024_a(var2, var3, var6);
+ }
+
+ }
+ }
+
+ public void func_28020_c(ItemStack var1, World var2, EntityPlayer var3) {
+ var1.setItemDamage(var2.func_28104_b("map"));
+ String var4 = "map_" + var1.getItemDamage();
+ MapData var5 = new MapData(var4);
+ var2.func_28102_a(var4, var5);
+ var5.field_28164_b = MathHelper.floor_double(var3.posX);
+ var5.field_28163_c = MathHelper.floor_double(var3.posZ);
+ var5.field_28161_e = 3;
+ var5.field_28162_d = (byte)var2.worldProvider.worldType;
+ var5.func_28146_a();
+ }
+
+ public Packet func_28022_b(ItemStack var1, World var2, EntityPlayer var3) {
+ byte[] var4 = this.func_28023_a(var1, var2).func_28154_a(var1, var2, var3);
+ return var4 == null ? null : new Packet131MapData((short)Item.field_28021_bb.shiftedIndex, (short)var1.getItemDamage(), var4);
+ }
+}
diff --git a/src/net/minecraft/src/ItemMapBase.java b/src/net/minecraft/src/ItemMapBase.java
new file mode 100644
index 0000000..168e916
--- /dev/null
+++ b/src/net/minecraft/src/ItemMapBase.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+public class ItemMapBase extends Item {
+ protected ItemMapBase(int var1) {
+ super(var1);
+ }
+
+ public boolean func_28019_b() {
+ return true;
+ }
+
+ public Packet func_28022_b(ItemStack var1, World var2, EntityPlayer var3) {
+ return null;
+ }
+}
diff --git a/src/net/minecraft/src/ItemMinecart.java b/src/net/minecraft/src/ItemMinecart.java
new file mode 100644
index 0000000..9f5f32c
--- /dev/null
+++ b/src/net/minecraft/src/ItemMinecart.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+public class ItemMinecart extends Item {
+ public int minecartType;
+
+ public ItemMinecart(int var1, int var2) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.minecartType = var2;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ int var8 = var3.getBlockId(var4, var5, var6);
+ if(BlockRail.func_27030_c(var8)) {
+ if(!var3.singleplayerWorld) {
+ var3.entityJoinedWorld(new EntityMinecart(var3, (double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), this.minecartType));
+ }
+
+ --var1.stackSize;
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemPainting.java b/src/net/minecraft/src/ItemPainting.java
new file mode 100644
index 0000000..07efdb5
--- /dev/null
+++ b/src/net/minecraft/src/ItemPainting.java
@@ -0,0 +1,39 @@
+package net.minecraft.src;
+
+public class ItemPainting extends Item {
+ public ItemPainting(int var1) {
+ super(var1);
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 == 0) {
+ return false;
+ } else if(var7 == 1) {
+ return false;
+ } else {
+ byte var8 = 0;
+ if(var7 == 4) {
+ var8 = 1;
+ }
+
+ if(var7 == 3) {
+ var8 = 2;
+ }
+
+ if(var7 == 5) {
+ var8 = 3;
+ }
+
+ EntityPainting var9 = new EntityPainting(var3, var4, var5, var6, var8);
+ if(var9.onValidSurface()) {
+ if(!var3.singleplayerWorld) {
+ var3.entityJoinedWorld(var9);
+ }
+
+ --var1.stackSize;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemPickaxe.java b/src/net/minecraft/src/ItemPickaxe.java
new file mode 100644
index 0000000..f1a5192
--- /dev/null
+++ b/src/net/minecraft/src/ItemPickaxe.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class ItemPickaxe extends ItemTool {
+ private static Block[] blocksEffectiveAgainst = new Block[]{Block.cobblestone, Block.stairDouble, Block.stairSingle, Block.stone, Block.sandStone, Block.cobblestoneMossy, Block.oreIron, Block.blockSteel, Block.oreCoal, Block.blockGold, Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.ice, Block.bloodStone, Block.oreLapis, Block.blockLapis};
+
+ protected ItemPickaxe(int var1, EnumToolMaterial var2) {
+ super(var1, 2, var2, blocksEffectiveAgainst);
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return var1 == Block.obsidian ? this.toolMaterial.getHarvestLevel() == 3 : (var1 != Block.blockDiamond && var1 != Block.oreDiamond ? (var1 != Block.blockGold && var1 != Block.oreGold ? (var1 != Block.blockSteel && var1 != Block.oreIron ? (var1 != Block.blockLapis && var1 != Block.oreLapis ? (var1 != Block.oreRedstone && var1 != Block.oreRedstoneGlowing ? (var1.blockMaterial == Material.rock ? true : var1.blockMaterial == Material.iron) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2);
+ }
+}
diff --git a/src/net/minecraft/src/ItemPiston.java b/src/net/minecraft/src/ItemPiston.java
new file mode 100644
index 0000000..c092e62
--- /dev/null
+++ b/src/net/minecraft/src/ItemPiston.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public class ItemPiston extends ItemBlock {
+ public ItemPiston(int var1) {
+ super(var1);
+ }
+
+ public int getMetadata(int var1) {
+ return 7;
+ }
+}
diff --git a/src/net/minecraft/src/ItemRecord.java b/src/net/minecraft/src/ItemRecord.java
new file mode 100644
index 0000000..b64a589
--- /dev/null
+++ b/src/net/minecraft/src/ItemRecord.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public class ItemRecord extends Item {
+ public final String recordName;
+
+ protected ItemRecord(int var1, String var2) {
+ super(var1);
+ this.recordName = var2;
+ this.maxStackSize = 1;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var3.getBlockId(var4, var5, var6) == Block.jukebox.blockID && var3.getBlockMetadata(var4, var5, var6) == 0) {
+ if(var3.singleplayerWorld) {
+ return true;
+ } else {
+ ((BlockJukeBox)Block.jukebox).ejectRecord(var3, var4, var5, var6, this.shiftedIndex);
+ var3.func_28101_a((EntityPlayer)null, 1005, var4, var5, var6, this.shiftedIndex);
+ --var1.stackSize;
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemRedstone.java b/src/net/minecraft/src/ItemRedstone.java
new file mode 100644
index 0000000..0cb0e19
--- /dev/null
+++ b/src/net/minecraft/src/ItemRedstone.java
@@ -0,0 +1,46 @@
+package net.minecraft.src;
+
+public class ItemRedstone extends Item {
+ public ItemRedstone(int var1) {
+ super(var1);
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var3.getBlockId(var4, var5, var6) != Block.snow.blockID) {
+ if(var7 == 0) {
+ --var5;
+ }
+
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+
+ if(!var3.isAirBlock(var4, var5, var6)) {
+ return false;
+ }
+ }
+
+ if(Block.redstoneWire.canPlaceBlockAt(var3, var4, var5, var6)) {
+ --var1.stackSize;
+ var3.setBlockWithNotify(var4, var5, var6, Block.redstoneWire.blockID);
+ }
+
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/ItemReed.java b/src/net/minecraft/src/ItemReed.java
new file mode 100644
index 0000000..4c21aae
--- /dev/null
+++ b/src/net/minecraft/src/ItemReed.java
@@ -0,0 +1,56 @@
+package net.minecraft.src;
+
+public class ItemReed extends Item {
+ private int field_253_a;
+
+ public ItemReed(int var1, Block var2) {
+ super(var1);
+ this.field_253_a = var2.blockID;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var3.getBlockId(var4, var5, var6) == Block.snow.blockID) {
+ var7 = 0;
+ } else {
+ if(var7 == 0) {
+ --var5;
+ }
+
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+ }
+
+ if(var1.stackSize == 0) {
+ return false;
+ } else {
+ if(var3.canBlockBePlacedAt(this.field_253_a, var4, var5, var6, false, var7)) {
+ Block var8 = Block.blocksList[this.field_253_a];
+ if(var3.setBlockWithNotify(var4, var5, var6, this.field_253_a)) {
+ Block.blocksList[this.field_253_a].onBlockPlaced(var3, var4, var5, var6, var7);
+ Block.blocksList[this.field_253_a].onBlockPlacedBy(var3, var4, var5, var6, var2);
+ var3.playSoundEffect((double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), var8.stepSound.func_737_c(), (var8.stepSound.getVolume() + 1.0F) / 2.0F, var8.stepSound.getPitch() * 0.8F);
+ --var1.stackSize;
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemSaddle.java b/src/net/minecraft/src/ItemSaddle.java
new file mode 100644
index 0000000..a023d05
--- /dev/null
+++ b/src/net/minecraft/src/ItemSaddle.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+public class ItemSaddle extends Item {
+ public ItemSaddle(int var1) {
+ super(var1);
+ this.maxStackSize = 1;
+ }
+
+ public void saddleEntity(ItemStack var1, EntityLiving var2) {
+ if(var2 instanceof EntityPig) {
+ EntityPig var3 = (EntityPig)var2;
+ if(!var3.getSaddled()) {
+ var3.setSaddled(true);
+ --var1.stackSize;
+ }
+ }
+
+ }
+
+ public boolean hitEntity(ItemStack var1, EntityLiving var2, EntityLiving var3) {
+ this.saddleEntity(var1, var2);
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/ItemSapling.java b/src/net/minecraft/src/ItemSapling.java
new file mode 100644
index 0000000..de04e48
--- /dev/null
+++ b/src/net/minecraft/src/ItemSapling.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class ItemSapling extends ItemBlock {
+ public ItemSapling(int var1) {
+ super(var1);
+ this.setMaxDamage(0);
+ this.setHasSubtypes(true);
+ }
+
+ public int getMetadata(int var1) {
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/ItemSeeds.java b/src/net/minecraft/src/ItemSeeds.java
new file mode 100644
index 0000000..613c01c
--- /dev/null
+++ b/src/net/minecraft/src/ItemSeeds.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+public class ItemSeeds extends Item {
+ private int field_271_a;
+
+ public ItemSeeds(int var1, int var2) {
+ super(var1);
+ this.field_271_a = var2;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 != 1) {
+ return false;
+ } else {
+ int var8 = var3.getBlockId(var4, var5, var6);
+ if(var8 == Block.tilledField.blockID && var3.isAirBlock(var4, var5 + 1, var6)) {
+ var3.setBlockWithNotify(var4, var5 + 1, var6, this.field_271_a);
+ --var1.stackSize;
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemShears.java b/src/net/minecraft/src/ItemShears.java
new file mode 100644
index 0000000..2b83598
--- /dev/null
+++ b/src/net/minecraft/src/ItemShears.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+public class ItemShears extends Item {
+ public ItemShears(int var1) {
+ super(var1);
+ this.setMaxStackSize(1);
+ this.setMaxDamage(238);
+ }
+
+ public boolean func_25007_a(ItemStack var1, int var2, int var3, int var4, int var5, EntityLiving var6) {
+ if(var2 == Block.leaves.blockID || var2 == Block.web.blockID) {
+ var1.damageItem(1, var6);
+ }
+
+ return super.func_25007_a(var1, var2, var3, var4, var5, var6);
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return var1.blockID == Block.web.blockID;
+ }
+
+ public float getStrVsBlock(ItemStack var1, Block var2) {
+ return var2.blockID != Block.web.blockID && var2.blockID != Block.leaves.blockID ? (var2.blockID == Block.cloth.blockID ? 5.0F : super.getStrVsBlock(var1, var2)) : 15.0F;
+ }
+}
diff --git a/src/net/minecraft/src/ItemSign.java b/src/net/minecraft/src/ItemSign.java
new file mode 100644
index 0000000..e5cd1bf
--- /dev/null
+++ b/src/net/minecraft/src/ItemSign.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+public class ItemSign extends Item {
+ public ItemSign(int var1) {
+ super(var1);
+ this.maxStackSize = 1;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 == 0) {
+ return false;
+ } else if(!var3.getBlockMaterial(var4, var5, var6).isSolid()) {
+ return false;
+ } else {
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+
+ if(!Block.signPost.canPlaceBlockAt(var3, var4, var5, var6)) {
+ return false;
+ } else {
+ if(var7 == 1) {
+ var3.setBlockAndMetadataWithNotify(var4, var5, var6, Block.signPost.blockID, MathHelper.floor_double((double)((var2.rotationYaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15);
+ } else {
+ var3.setBlockAndMetadataWithNotify(var4, var5, var6, Block.signWall.blockID, var7);
+ }
+
+ --var1.stackSize;
+ TileEntitySign var8 = (TileEntitySign)var3.getBlockTileEntity(var4, var5, var6);
+ if(var8 != null) {
+ var2.displayGUIEditSign(var8);
+ }
+
+ return true;
+ }
+ }
+ }
+}
diff --git a/src/net/minecraft/src/ItemSlab.java b/src/net/minecraft/src/ItemSlab.java
new file mode 100644
index 0000000..4badfc5
--- /dev/null
+++ b/src/net/minecraft/src/ItemSlab.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class ItemSlab extends ItemBlock {
+ public ItemSlab(int var1) {
+ super(var1);
+ this.setMaxDamage(0);
+ this.setHasSubtypes(true);
+ }
+
+ public int getMetadata(int var1) {
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/ItemSnowball.java b/src/net/minecraft/src/ItemSnowball.java
new file mode 100644
index 0000000..5651b69
--- /dev/null
+++ b/src/net/minecraft/src/ItemSnowball.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+public class ItemSnowball extends Item {
+ public ItemSnowball(int var1) {
+ super(var1);
+ this.maxStackSize = 16;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ --var1.stackSize;
+ var2.playSoundAtEntity(var3, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
+ if(!var2.singleplayerWorld) {
+ var2.entityJoinedWorld(new EntitySnowball(var2, var3));
+ }
+
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/ItemSoup.java b/src/net/minecraft/src/ItemSoup.java
new file mode 100644
index 0000000..22bf8b8
--- /dev/null
+++ b/src/net/minecraft/src/ItemSoup.java
@@ -0,0 +1,12 @@
+package net.minecraft.src;
+
+public class ItemSoup extends ItemFood {
+ public ItemSoup(int var1, int var2) {
+ super(var1, var2, false);
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ super.onItemRightClick(var1, var2, var3);
+ return new ItemStack(Item.bowlEmpty);
+ }
+}
diff --git a/src/net/minecraft/src/ItemSpade.java b/src/net/minecraft/src/ItemSpade.java
new file mode 100644
index 0000000..0595096
--- /dev/null
+++ b/src/net/minecraft/src/ItemSpade.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class ItemSpade extends ItemTool {
+ private static Block[] blocksEffectiveAgainst = new Block[]{Block.grass, Block.dirt, Block.sand, Block.gravel, Block.snow, Block.blockSnow, Block.blockClay, Block.tilledField};
+
+ public ItemSpade(int var1, EnumToolMaterial var2) {
+ super(var1, 1, var2, blocksEffectiveAgainst);
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return var1 == Block.snow ? true : var1 == Block.blockSnow;
+ }
+}
diff --git a/src/net/minecraft/src/ItemStack.java b/src/net/minecraft/src/ItemStack.java
new file mode 100644
index 0000000..9a94f7c
--- /dev/null
+++ b/src/net/minecraft/src/ItemStack.java
@@ -0,0 +1,210 @@
+package net.minecraft.src;
+
+public final class ItemStack {
+ public int stackSize;
+ public int animationsToGo;
+ public int itemID;
+ private int itemDamage;
+
+ public ItemStack(Block var1) {
+ this((Block)var1, 1);
+ }
+
+ public ItemStack(Block var1, int var2) {
+ this(var1.blockID, var2, 0);
+ }
+
+ public ItemStack(Block var1, int var2, int var3) {
+ this(var1.blockID, var2, var3);
+ }
+
+ public ItemStack(Item var1) {
+ this(var1.shiftedIndex, 1, 0);
+ }
+
+ public ItemStack(Item var1, int var2) {
+ this(var1.shiftedIndex, var2, 0);
+ }
+
+ public ItemStack(Item var1, int var2, int var3) {
+ this(var1.shiftedIndex, var2, var3);
+ }
+
+ public ItemStack(int var1, int var2, int var3) {
+ this.stackSize = 0;
+ this.itemID = var1;
+ this.stackSize = var2;
+ this.itemDamage = var3;
+ }
+
+ public ItemStack(NBTTagCompound var1) {
+ this.stackSize = 0;
+ this.readFromNBT(var1);
+ }
+
+ public ItemStack splitStack(int var1) {
+ this.stackSize -= var1;
+ return new ItemStack(this.itemID, var1, this.itemDamage);
+ }
+
+ public Item getItem() {
+ return Item.itemsList[this.itemID];
+ }
+
+ public boolean useItem(EntityPlayer var1, World var2, int var3, int var4, int var5, int var6) {
+ boolean var7 = this.getItem().onItemUse(this, var1, var2, var3, var4, var5, var6);
+ if(var7) {
+ var1.addStat(StatList.field_25107_A[this.itemID], 1);
+ }
+
+ return var7;
+ }
+
+ public float getStrVsBlock(Block var1) {
+ return this.getItem().getStrVsBlock(this, var1);
+ }
+
+ public ItemStack useItemRightClick(World var1, EntityPlayer var2) {
+ return this.getItem().onItemRightClick(this, var1, var2);
+ }
+
+ public NBTTagCompound writeToNBT(NBTTagCompound var1) {
+ var1.setShort("id", (short)this.itemID);
+ var1.setByte("Count", (byte)this.stackSize);
+ var1.setShort("Damage", (short)this.itemDamage);
+ return var1;
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ this.itemID = var1.getShort("id");
+ this.stackSize = var1.getByte("Count");
+ this.itemDamage = var1.getShort("Damage");
+ }
+
+ public int getMaxStackSize() {
+ return this.getItem().getItemStackLimit();
+ }
+
+ public boolean func_21132_c() {
+ return this.getMaxStackSize() > 1 && (!this.isItemStackDamageable() || !this.isItemDamaged());
+ }
+
+ public boolean isItemStackDamageable() {
+ return Item.itemsList[this.itemID].getMaxDamage() > 0;
+ }
+
+ public boolean getHasSubtypes() {
+ return Item.itemsList[this.itemID].getHasSubtypes();
+ }
+
+ public boolean isItemDamaged() {
+ return this.isItemStackDamageable() && this.itemDamage > 0;
+ }
+
+ public int getItemDamageForDisplay() {
+ return this.itemDamage;
+ }
+
+ public int getItemDamage() {
+ return this.itemDamage;
+ }
+
+ public void setItemDamage(int var1) {
+ this.itemDamage = var1;
+ }
+
+ public int getMaxDamage() {
+ return Item.itemsList[this.itemID].getMaxDamage();
+ }
+
+ public void damageItem(int var1, Entity var2) {
+ if(this.isItemStackDamageable()) {
+ this.itemDamage += var1;
+ if(this.itemDamage > this.getMaxDamage()) {
+ if(var2 instanceof EntityPlayer) {
+ ((EntityPlayer)var2).addStat(StatList.field_25105_B[this.itemID], 1);
+ }
+
+ --this.stackSize;
+ if(this.stackSize < 0) {
+ this.stackSize = 0;
+ }
+
+ this.itemDamage = 0;
+ }
+
+ }
+ }
+
+ public void hitEntity(EntityLiving var1, EntityPlayer var2) {
+ boolean var3 = Item.itemsList[this.itemID].hitEntity(this, var1, var2);
+ if(var3) {
+ var2.addStat(StatList.field_25107_A[this.itemID], 1);
+ }
+
+ }
+
+ public void func_25124_a(int var1, int var2, int var3, int var4, EntityPlayer var5) {
+ boolean var6 = Item.itemsList[this.itemID].func_25007_a(this, var1, var2, var3, var4, var5);
+ if(var6) {
+ var5.addStat(StatList.field_25107_A[this.itemID], 1);
+ }
+
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ return Item.itemsList[this.itemID].getDamageVsEntity(var1);
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return Item.itemsList[this.itemID].canHarvestBlock(var1);
+ }
+
+ public void func_577_a(EntityPlayer var1) {
+ }
+
+ public void useItemOnEntity(EntityLiving var1) {
+ Item.itemsList[this.itemID].saddleEntity(this, var1);
+ }
+
+ public ItemStack copy() {
+ return new ItemStack(this.itemID, this.stackSize, this.itemDamage);
+ }
+
+ public static boolean areItemStacksEqual(ItemStack var0, ItemStack var1) {
+ return var0 == null && var1 == null ? true : (var0 != null && var1 != null ? var0.isItemStackEqual(var1) : false);
+ }
+
+ private boolean isItemStackEqual(ItemStack var1) {
+ return this.stackSize != var1.stackSize ? false : (this.itemID != var1.itemID ? false : this.itemDamage == var1.itemDamage);
+ }
+
+ public boolean isItemEqual(ItemStack var1) {
+ return this.itemID == var1.itemID && this.itemDamage == var1.itemDamage;
+ }
+
+ public static ItemStack func_20117_a(ItemStack var0) {
+ return var0 == null ? null : var0.copy();
+ }
+
+ public String toString() {
+ return this.stackSize + "x" + Item.itemsList[this.itemID].getItemName() + "@" + this.itemDamage;
+ }
+
+ public void func_28143_a(World var1, Entity var2, int var3, boolean var4) {
+ if(this.animationsToGo > 0) {
+ --this.animationsToGo;
+ }
+
+ Item.itemsList[this.itemID].func_28018_a(this, var1, var2, var3, var4);
+ }
+
+ public void func_28142_b(World var1, EntityPlayer var2) {
+ var2.addStat(StatList.field_25093_z[this.itemID], this.stackSize);
+ Item.itemsList[this.itemID].func_28020_c(this, var1, var2);
+ }
+
+ public boolean func_28144_c(ItemStack var1) {
+ return this.itemID == var1.itemID && this.stackSize == var1.stackSize && this.itemDamage == var1.itemDamage;
+ }
+}
diff --git a/src/net/minecraft/src/ItemSword.java b/src/net/minecraft/src/ItemSword.java
new file mode 100644
index 0000000..7b165fe
--- /dev/null
+++ b/src/net/minecraft/src/ItemSword.java
@@ -0,0 +1,34 @@
+package net.minecraft.src;
+
+public class ItemSword extends Item {
+ private int weaponDamage;
+
+ public ItemSword(int var1, EnumToolMaterial var2) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.setMaxDamage(var2.getMaxUses());
+ this.weaponDamage = 4 + var2.getDamageVsEntity() * 2;
+ }
+
+ public float getStrVsBlock(ItemStack var1, Block var2) {
+ return var2.blockID == Block.web.blockID ? 15.0F : 1.5F;
+ }
+
+ public boolean hitEntity(ItemStack var1, EntityLiving var2, EntityLiving var3) {
+ var1.damageItem(1, var3);
+ return true;
+ }
+
+ public boolean func_25007_a(ItemStack var1, int var2, int var3, int var4, int var5, EntityLiving var6) {
+ var1.damageItem(2, var6);
+ return true;
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ return this.weaponDamage;
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return var1.blockID == Block.web.blockID;
+ }
+}
diff --git a/src/net/minecraft/src/ItemTool.java b/src/net/minecraft/src/ItemTool.java
new file mode 100644
index 0000000..a725892
--- /dev/null
+++ b/src/net/minecraft/src/ItemTool.java
@@ -0,0 +1,42 @@
+package net.minecraft.src;
+
+public class ItemTool extends Item {
+ private Block[] blocksEffectiveAgainst;
+ private float efficiencyOnProperMaterial = 4.0F;
+ private int damageVsEntity;
+ protected EnumToolMaterial toolMaterial;
+
+ protected ItemTool(int var1, int var2, EnumToolMaterial var3, Block[] var4) {
+ super(var1);
+ this.toolMaterial = var3;
+ this.blocksEffectiveAgainst = var4;
+ this.maxStackSize = 1;
+ this.setMaxDamage(var3.getMaxUses());
+ this.efficiencyOnProperMaterial = var3.getEfficiencyOnProperMaterial();
+ this.damageVsEntity = var2 + var3.getDamageVsEntity();
+ }
+
+ public float getStrVsBlock(ItemStack var1, Block var2) {
+ for(int var3 = 0; var3 < this.blocksEffectiveAgainst.length; ++var3) {
+ if(this.blocksEffectiveAgainst[var3] == var2) {
+ return this.efficiencyOnProperMaterial;
+ }
+ }
+
+ return 1.0F;
+ }
+
+ public boolean hitEntity(ItemStack var1, EntityLiving var2, EntityLiving var3) {
+ var1.damageItem(2, var3);
+ return true;
+ }
+
+ public boolean func_25007_a(ItemStack var1, int var2, int var3, int var4, int var5, EntityLiving var6) {
+ var1.damageItem(1, var6);
+ return true;
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ return this.damageVsEntity;
+ }
+}
diff --git a/src/net/minecraft/src/MCHash.java b/src/net/minecraft/src/MCHash.java
new file mode 100644
index 0000000..907936a
--- /dev/null
+++ b/src/net/minecraft/src/MCHash.java
@@ -0,0 +1,151 @@
+package net.minecraft.src;
+
+public class MCHash {
+ private transient MCHashEntry[] slots = new MCHashEntry[16];
+ private transient int count;
+ private int threshold = 12;
+ private final float growFactor = 12.0F / 16.0F;
+ private transient volatile int versionStamp;
+
+ private static int computeHash(int var0) {
+ var0 ^= var0 >>> 20 ^ var0 >>> 12;
+ return var0 ^ var0 >>> 7 ^ var0 >>> 4;
+ }
+
+ private static int getSlotIndex(int var0, int var1) {
+ return var0 & var1 - 1;
+ }
+
+ public Object lookup(int var1) {
+ int var2 = computeHash(var1);
+
+ for(MCHashEntry var3 = this.slots[getSlotIndex(var2, this.slots.length)]; var3 != null; var3 = var3.nextEntry) {
+ if(var3.hashEntry == var1) {
+ return var3.valueEntry;
+ }
+ }
+
+ return null;
+ }
+
+ public boolean containsItem(int var1) {
+ return this.lookupEntry(var1) != null;
+ }
+
+ final MCHashEntry lookupEntry(int var1) {
+ int var2 = computeHash(var1);
+
+ for(MCHashEntry var3 = this.slots[getSlotIndex(var2, this.slots.length)]; var3 != null; var3 = var3.nextEntry) {
+ if(var3.hashEntry == var1) {
+ return var3;
+ }
+ }
+
+ return null;
+ }
+
+ public void addKey(int var1, Object var2) {
+ int var3 = computeHash(var1);
+ int var4 = getSlotIndex(var3, this.slots.length);
+
+ for(MCHashEntry var5 = this.slots[var4]; var5 != null; var5 = var5.nextEntry) {
+ if(var5.hashEntry == var1) {
+ var5.valueEntry = var2;
+ }
+ }
+
+ ++this.versionStamp;
+ this.insert(var3, var1, var2, var4);
+ }
+
+ private void grow(int var1) {
+ MCHashEntry[] var2 = this.slots;
+ int var3 = var2.length;
+ if(var3 == 1073741824) {
+ this.threshold = Integer.MAX_VALUE;
+ } else {
+ MCHashEntry[] var4 = new MCHashEntry[var1];
+ this.copyTo(var4);
+ this.slots = var4;
+ this.threshold = (int)((float)var1 * this.growFactor);
+ }
+ }
+
+ private void copyTo(MCHashEntry[] var1) {
+ MCHashEntry[] var2 = this.slots;
+ int var3 = var1.length;
+
+ for(int var4 = 0; var4 < var2.length; ++var4) {
+ MCHashEntry var5 = var2[var4];
+ if(var5 != null) {
+ var2[var4] = null;
+
+ MCHashEntry var6;
+ do {
+ var6 = var5.nextEntry;
+ int var7 = getSlotIndex(var5.slotHash, var3);
+ var5.nextEntry = var1[var7];
+ var1[var7] = var5;
+ var5 = var6;
+ } while(var6 != null);
+ }
+ }
+
+ }
+
+ public Object removeObject(int var1) {
+ MCHashEntry var2 = this.removeEntry(var1);
+ return var2 == null ? null : var2.valueEntry;
+ }
+
+ final MCHashEntry removeEntry(int var1) {
+ int var2 = computeHash(var1);
+ int var3 = getSlotIndex(var2, this.slots.length);
+ MCHashEntry var4 = this.slots[var3];
+
+ MCHashEntry var5;
+ MCHashEntry var6;
+ for(var5 = var4; var5 != null; var5 = var6) {
+ var6 = var5.nextEntry;
+ if(var5.hashEntry == var1) {
+ ++this.versionStamp;
+ --this.count;
+ if(var4 == var5) {
+ this.slots[var3] = var6;
+ } else {
+ var4.nextEntry = var6;
+ }
+
+ return var5;
+ }
+
+ var4 = var5;
+ }
+
+ return var5;
+ }
+
+ public void clearMap() {
+ ++this.versionStamp;
+ MCHashEntry[] var1 = this.slots;
+
+ for(int var2 = 0; var2 < var1.length; ++var2) {
+ var1[var2] = null;
+ }
+
+ this.count = 0;
+ }
+
+ private void insert(int var1, int var2, Object var3, int var4) {
+ MCHashEntry var5 = this.slots[var4];
+ this.slots[var4] = new MCHashEntry(var1, var2, var3, var5);
+ if(this.count++ >= this.threshold) {
+ this.grow(2 * this.slots.length);
+ }
+
+ }
+
+ static int getHash(int var0) {
+ return computeHash(var0);
+ }
+}
diff --git a/src/net/minecraft/src/MCHashEntry.java b/src/net/minecraft/src/MCHashEntry.java
new file mode 100644
index 0000000..9eef61f
--- /dev/null
+++ b/src/net/minecraft/src/MCHashEntry.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+class MCHashEntry {
+ final int hashEntry;
+ Object valueEntry;
+ MCHashEntry nextEntry;
+ final int slotHash;
+
+ MCHashEntry(int var1, int var2, Object var3, MCHashEntry var4) {
+ this.valueEntry = var3;
+ this.nextEntry = var4;
+ this.hashEntry = var2;
+ this.slotHash = var1;
+ }
+
+ public final int getHash() {
+ return this.hashEntry;
+ }
+
+ public final Object getValue() {
+ return this.valueEntry;
+ }
+
+ public final boolean equals(Object var1) {
+ if(!(var1 instanceof MCHashEntry)) {
+ return false;
+ } else {
+ MCHashEntry var2 = (MCHashEntry)var1;
+ Integer var3 = Integer.valueOf(this.getHash());
+ Integer var4 = Integer.valueOf(var2.getHash());
+ if(var3 == var4 || var3 != null && var3.equals(var4)) {
+ Object var5 = this.getValue();
+ Object var6 = var2.getValue();
+ if(var5 == var6 || var5 != null && var5.equals(var6)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+
+ public final int hashCode() {
+ return MCHash.getHash(this.hashEntry);
+ }
+
+ public final String toString() {
+ return this.getHash() + "=" + this.getValue();
+ }
+}
diff --git a/src/net/minecraft/src/MapColor.java b/src/net/minecraft/src/MapColor.java
new file mode 100644
index 0000000..44abfdd
--- /dev/null
+++ b/src/net/minecraft/src/MapColor.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+public class MapColor {
+ public static final MapColor[] field_28200_a = new MapColor[16];
+ public static final MapColor field_28199_b = new MapColor(0, 0);
+ public static final MapColor field_28198_c = new MapColor(1, 8368696);
+ public static final MapColor field_28197_d = new MapColor(2, 16247203);
+ public static final MapColor field_28196_e = new MapColor(3, 10987431);
+ public static final MapColor field_28195_f = new MapColor(4, 16711680);
+ public static final MapColor field_28194_g = new MapColor(5, 10526975);
+ public static final MapColor field_28193_h = new MapColor(6, 10987431);
+ public static final MapColor field_28192_i = new MapColor(7, 31744);
+ public static final MapColor field_28191_j = new MapColor(8, 16777215);
+ public static final MapColor field_28190_k = new MapColor(9, 10791096);
+ public static final MapColor field_28189_l = new MapColor(10, 12020271);
+ public static final MapColor field_28188_m = new MapColor(11, 7368816);
+ public static final MapColor field_28187_n = new MapColor(12, 4210943);
+ public static final MapColor field_28186_o = new MapColor(13, 6837042);
+ public final int field_28185_p;
+ public final int field_28184_q;
+
+ private MapColor(int var1, int var2) {
+ this.field_28184_q = var1;
+ this.field_28185_p = var2;
+ field_28200_a[var1] = this;
+ }
+}
diff --git a/src/net/minecraft/src/MapCoord.java b/src/net/minecraft/src/MapCoord.java
new file mode 100644
index 0000000..c8149bd
--- /dev/null
+++ b/src/net/minecraft/src/MapCoord.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class MapCoord {
+ public byte field_28202_a;
+ public byte field_28201_b;
+ public byte field_28205_c;
+ public byte field_28204_d;
+ final MapData field_28203_e;
+
+ public MapCoord(MapData var1, byte var2, byte var3, byte var4, byte var5) {
+ this.field_28203_e = var1;
+ this.field_28202_a = var2;
+ this.field_28201_b = var3;
+ this.field_28205_c = var4;
+ this.field_28204_d = var5;
+ }
+}
diff --git a/src/net/minecraft/src/MapData.java b/src/net/minecraft/src/MapData.java
new file mode 100644
index 0000000..b260b1d
--- /dev/null
+++ b/src/net/minecraft/src/MapData.java
@@ -0,0 +1,134 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MapData extends MapDataBase {
+ public int field_28164_b;
+ public int field_28163_c;
+ public byte field_28162_d;
+ public byte field_28161_e;
+ public byte[] field_28160_f = new byte[16384];
+ public int field_28159_g;
+ public List field_28158_h = new ArrayList();
+ private Map field_28156_j = new HashMap();
+ public List field_28157_i = new ArrayList();
+
+ public MapData(String var1) {
+ super(var1);
+ }
+
+ public void func_28148_a(NBTTagCompound var1) {
+ this.field_28162_d = var1.getByte("dimension");
+ this.field_28164_b = var1.getInteger("xCenter");
+ this.field_28163_c = var1.getInteger("zCenter");
+ this.field_28161_e = var1.getByte("scale");
+ if(this.field_28161_e < 0) {
+ this.field_28161_e = 0;
+ }
+
+ if(this.field_28161_e > 4) {
+ this.field_28161_e = 4;
+ }
+
+ short var2 = var1.getShort("width");
+ short var3 = var1.getShort("height");
+ if(var2 == 128 && var3 == 128) {
+ this.field_28160_f = var1.getByteArray("colors");
+ } else {
+ byte[] var4 = var1.getByteArray("colors");
+ this.field_28160_f = new byte[16384];
+ int var5 = (128 - var2) / 2;
+ int var6 = (128 - var3) / 2;
+
+ for(int var7 = 0; var7 < var3; ++var7) {
+ int var8 = var7 + var6;
+ if(var8 >= 0 || var8 < 128) {
+ for(int var9 = 0; var9 < var2; ++var9) {
+ int var10 = var9 + var5;
+ if(var10 >= 0 || var10 < 128) {
+ this.field_28160_f[var10 + var8 * 128] = var4[var9 + var7 * var2];
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ public void func_28147_b(NBTTagCompound var1) {
+ var1.setByte("dimension", this.field_28162_d);
+ var1.setInteger("xCenter", this.field_28164_b);
+ var1.setInteger("zCenter", this.field_28163_c);
+ var1.setByte("scale", this.field_28161_e);
+ var1.setShort("width", (short)128);
+ var1.setShort("height", (short)128);
+ var1.setByteArray("colors", this.field_28160_f);
+ }
+
+ public void func_28155_a(EntityPlayer var1, ItemStack var2) {
+ if(!this.field_28156_j.containsKey(var1)) {
+ MapInfo var3 = new MapInfo(this, var1);
+ this.field_28156_j.put(var1, var3);
+ this.field_28158_h.add(var3);
+ }
+
+ this.field_28157_i.clear();
+
+ for(int var14 = 0; var14 < this.field_28158_h.size(); ++var14) {
+ MapInfo var4 = (MapInfo)this.field_28158_h.get(var14);
+ if(!var4.field_28120_a.isDead && var4.field_28120_a.inventory.func_28010_c(var2)) {
+ float var5 = (float)(var4.field_28120_a.posX - (double)this.field_28164_b) / (float)(1 << this.field_28161_e);
+ float var6 = (float)(var4.field_28120_a.posZ - (double)this.field_28163_c) / (float)(1 << this.field_28161_e);
+ byte var7 = 64;
+ byte var8 = 64;
+ if(var5 >= (float)(-var7) && var6 >= (float)(-var8) && var5 <= (float)var7 && var6 <= (float)var8) {
+ byte var9 = 0;
+ byte var10 = (byte)((int)((double)(var5 * 2.0F) + 0.5D));
+ byte var11 = (byte)((int)((double)(var6 * 2.0F) + 0.5D));
+ byte var12 = (byte)((int)((double)(var1.rotationYaw * 16.0F / 360.0F) + 0.5D));
+ if(this.field_28162_d < 0) {
+ int var13 = this.field_28159_g / 10;
+ var12 = (byte)(var13 * var13 * 34187121 + var13 * 121 >> 15 & 15);
+ }
+
+ if(var4.field_28120_a.dimension == this.field_28162_d) {
+ this.field_28157_i.add(new MapCoord(this, var9, var10, var11, var12));
+ }
+ }
+ } else {
+ this.field_28156_j.remove(var4.field_28120_a);
+ this.field_28158_h.remove(var4);
+ }
+ }
+
+ }
+
+ public byte[] func_28154_a(ItemStack var1, World var2, EntityPlayer var3) {
+ MapInfo var4 = (MapInfo)this.field_28156_j.get(var3);
+ if(var4 == null) {
+ return null;
+ } else {
+ byte[] var5 = var4.func_28118_a(var1);
+ return var5;
+ }
+ }
+
+ public void func_28153_a(int var1, int var2, int var3) {
+ super.func_28146_a();
+
+ for(int var4 = 0; var4 < this.field_28158_h.size(); ++var4) {
+ MapInfo var5 = (MapInfo)this.field_28158_h.get(var4);
+ if(var5.field_28119_b[var1] < 0 || var5.field_28119_b[var1] > var2) {
+ var5.field_28119_b[var1] = var2;
+ }
+
+ if(var5.field_28125_c[var1] < 0 || var5.field_28125_c[var1] < var3) {
+ var5.field_28125_c[var1] = var3;
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/MapDataBase.java b/src/net/minecraft/src/MapDataBase.java
new file mode 100644
index 0000000..e1489f3
--- /dev/null
+++ b/src/net/minecraft/src/MapDataBase.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public abstract class MapDataBase {
+ public final String field_28152_a;
+ private boolean field_28151_b;
+
+ public MapDataBase(String var1) {
+ this.field_28152_a = var1;
+ }
+
+ public abstract void func_28148_a(NBTTagCompound var1);
+
+ public abstract void func_28147_b(NBTTagCompound var1);
+
+ public void func_28146_a() {
+ this.func_28149_a(true);
+ }
+
+ public void func_28149_a(boolean var1) {
+ this.field_28151_b = var1;
+ }
+
+ public boolean func_28150_b() {
+ return this.field_28151_b;
+ }
+}
diff --git a/src/net/minecraft/src/MapGenBase.java b/src/net/minecraft/src/MapGenBase.java
new file mode 100644
index 0000000..2de6bfa
--- /dev/null
+++ b/src/net/minecraft/src/MapGenBase.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class MapGenBase {
+ protected int field_947_a = 8;
+ protected Random rand = new Random();
+
+ public void func_667_a(IChunkProvider var1, World var2, int var3, int var4, byte[] var5) {
+ int var6 = this.field_947_a;
+ this.rand.setSeed(var2.getRandomSeed());
+ long var7 = this.rand.nextLong() / 2L * 2L + 1L;
+ long var9 = this.rand.nextLong() / 2L * 2L + 1L;
+
+ for(int var11 = var3 - var6; var11 <= var3 + var6; ++var11) {
+ for(int var12 = var4 - var6; var12 <= var4 + var6; ++var12) {
+ this.rand.setSeed((long)var11 * var7 + (long)var12 * var9 ^ var2.getRandomSeed());
+ this.func_666_a(var2, var11, var12, var3, var4, var5);
+ }
+ }
+
+ }
+
+ protected void func_666_a(World var1, int var2, int var3, int var4, int var5, byte[] var6) {
+ }
+}
diff --git a/src/net/minecraft/src/MapGenCaves.java b/src/net/minecraft/src/MapGenCaves.java
new file mode 100644
index 0000000..92cc4a0
--- /dev/null
+++ b/src/net/minecraft/src/MapGenCaves.java
@@ -0,0 +1,186 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class MapGenCaves extends MapGenBase {
+ protected void func_669_a(int var1, int var2, byte[] var3, double var4, double var6, double var8) {
+ this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D);
+ }
+
+ protected void releaseEntitySkin(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) {
+ double var17 = (double)(var1 * 16 + 8);
+ double var19 = (double)(var2 * 16 + 8);
+ float var21 = 0.0F;
+ float var22 = 0.0F;
+ Random var23 = new Random(this.rand.nextLong());
+ if(var14 <= 0) {
+ int var24 = this.field_947_a * 16 - 16;
+ var14 = var24 - var23.nextInt(var24 / 4);
+ }
+
+ boolean var52 = false;
+ if(var13 == -1) {
+ var13 = var14 / 2;
+ var52 = true;
+ }
+
+ int var25 = var23.nextInt(var14 / 2) + var14 / 4;
+
+ for(boolean var26 = var23.nextInt(6) == 0; var13 < var14; ++var13) {
+ double var27 = 1.5D + (double)(MathHelper.sin((float)var13 * (float)Math.PI / (float)var14) * var10 * 1.0F);
+ double var29 = var27 * var15;
+ float var31 = MathHelper.cos(var12);
+ float var32 = MathHelper.sin(var12);
+ var4 += (double)(MathHelper.cos(var11) * var31);
+ var6 += (double)var32;
+ var8 += (double)(MathHelper.sin(var11) * var31);
+ if(var26) {
+ var12 *= 0.92F;
+ } else {
+ var12 *= 0.7F;
+ }
+
+ var12 += var22 * 0.1F;
+ var11 += var21 * 0.1F;
+ var22 *= 0.9F;
+ var21 *= 12.0F / 16.0F;
+ var22 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 2.0F;
+ var21 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 4.0F;
+ if(!var52 && var13 == var25 && var10 > 1.0F) {
+ this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D);
+ this.releaseEntitySkin(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D);
+ return;
+ }
+
+ if(var52 || var23.nextInt(4) != 0) {
+ double var33 = var4 - var17;
+ double var35 = var8 - var19;
+ double var37 = (double)(var14 - var13);
+ double var39 = (double)(var10 + 2.0F + 16.0F);
+ if(var33 * var33 + var35 * var35 - var37 * var37 > var39 * var39) {
+ return;
+ }
+
+ if(var4 >= var17 - 16.0D - var27 * 2.0D && var8 >= var19 - 16.0D - var27 * 2.0D && var4 <= var17 + 16.0D + var27 * 2.0D && var8 <= var19 + 16.0D + var27 * 2.0D) {
+ int var53 = MathHelper.floor_double(var4 - var27) - var1 * 16 - 1;
+ int var34 = MathHelper.floor_double(var4 + var27) - var1 * 16 + 1;
+ int var54 = MathHelper.floor_double(var6 - var29) - 1;
+ int var36 = MathHelper.floor_double(var6 + var29) + 1;
+ int var55 = MathHelper.floor_double(var8 - var27) - var2 * 16 - 1;
+ int var38 = MathHelper.floor_double(var8 + var27) - var2 * 16 + 1;
+ if(var53 < 0) {
+ var53 = 0;
+ }
+
+ if(var34 > 16) {
+ var34 = 16;
+ }
+
+ if(var54 < 1) {
+ var54 = 1;
+ }
+
+ if(var36 > 120) {
+ var36 = 120;
+ }
+
+ if(var55 < 0) {
+ var55 = 0;
+ }
+
+ if(var38 > 16) {
+ var38 = 16;
+ }
+
+ boolean var56 = false;
+
+ int var40;
+ int var43;
+ for(var40 = var53; !var56 && var40 < var34; ++var40) {
+ for(int var41 = var55; !var56 && var41 < var38; ++var41) {
+ for(int var42 = var36 + 1; !var56 && var42 >= var54 - 1; --var42) {
+ var43 = (var40 * 16 + var41) * 128 + var42;
+ if(var42 >= 0 && var42 < 128) {
+ if(var3[var43] == Block.waterMoving.blockID || var3[var43] == Block.waterStill.blockID) {
+ var56 = true;
+ }
+
+ if(var42 != var54 - 1 && var40 != var53 && var40 != var34 - 1 && var41 != var55 && var41 != var38 - 1) {
+ var42 = var54;
+ }
+ }
+ }
+ }
+ }
+
+ if(!var56) {
+ for(var40 = var53; var40 < var34; ++var40) {
+ double var57 = ((double)(var40 + var1 * 16) + 0.5D - var4) / var27;
+
+ for(var43 = var55; var43 < var38; ++var43) {
+ double var44 = ((double)(var43 + var2 * 16) + 0.5D - var8) / var27;
+ int var46 = (var40 * 16 + var43) * 128 + var36;
+ boolean var47 = false;
+ if(var57 * var57 + var44 * var44 < 1.0D) {
+ for(int var48 = var36 - 1; var48 >= var54; --var48) {
+ double var49 = ((double)var48 + 0.5D - var6) / var29;
+ if(var49 > -0.7D && var57 * var57 + var49 * var49 + var44 * var44 < 1.0D) {
+ byte var51 = var3[var46];
+ if(var51 == Block.grass.blockID) {
+ var47 = true;
+ }
+
+ if(var51 == Block.stone.blockID || var51 == Block.dirt.blockID || var51 == Block.grass.blockID) {
+ if(var48 < 10) {
+ var3[var46] = (byte)Block.lavaMoving.blockID;
+ } else {
+ var3[var46] = 0;
+ if(var47 && var3[var46 - 1] == Block.dirt.blockID) {
+ var3[var46 - 1] = (byte)Block.grass.blockID;
+ }
+ }
+ }
+ }
+
+ --var46;
+ }
+ }
+ }
+ }
+
+ if(var52) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ protected void func_666_a(World var1, int var2, int var3, int var4, int var5, byte[] var6) {
+ int var7 = this.rand.nextInt(this.rand.nextInt(this.rand.nextInt(40) + 1) + 1);
+ if(this.rand.nextInt(15) != 0) {
+ var7 = 0;
+ }
+
+ for(int var8 = 0; var8 < var7; ++var8) {
+ double var9 = (double)(var2 * 16 + this.rand.nextInt(16));
+ double var11 = (double)this.rand.nextInt(this.rand.nextInt(120) + 8);
+ double var13 = (double)(var3 * 16 + this.rand.nextInt(16));
+ int var15 = 1;
+ if(this.rand.nextInt(4) == 0) {
+ this.func_669_a(var4, var5, var6, var9, var11, var13);
+ var15 += this.rand.nextInt(4);
+ }
+
+ for(int var16 = 0; var16 < var15; ++var16) {
+ float var17 = this.rand.nextFloat() * (float)Math.PI * 2.0F;
+ float var18 = (this.rand.nextFloat() - 0.5F) * 2.0F / 8.0F;
+ float var19 = this.rand.nextFloat() * 2.0F + this.rand.nextFloat();
+ this.releaseEntitySkin(var4, var5, var6, var9, var11, var13, var19, var17, var18, 0, 0, 1.0D);
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/MapGenCavesHell.java b/src/net/minecraft/src/MapGenCavesHell.java
new file mode 100644
index 0000000..d59920c
--- /dev/null
+++ b/src/net/minecraft/src/MapGenCavesHell.java
@@ -0,0 +1,173 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class MapGenCavesHell extends MapGenBase {
+ protected void func_4106_a(int var1, int var2, byte[] var3, double var4, double var6, double var8) {
+ this.func_4105_a(var1, var2, var3, var4, var6, var8, 1.0F + this.rand.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D);
+ }
+
+ protected void func_4105_a(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) {
+ double var17 = (double)(var1 * 16 + 8);
+ double var19 = (double)(var2 * 16 + 8);
+ float var21 = 0.0F;
+ float var22 = 0.0F;
+ Random var23 = new Random(this.rand.nextLong());
+ if(var14 <= 0) {
+ int var24 = this.field_947_a * 16 - 16;
+ var14 = var24 - var23.nextInt(var24 / 4);
+ }
+
+ boolean var51 = false;
+ if(var13 == -1) {
+ var13 = var14 / 2;
+ var51 = true;
+ }
+
+ int var25 = var23.nextInt(var14 / 2) + var14 / 4;
+
+ for(boolean var26 = var23.nextInt(6) == 0; var13 < var14; ++var13) {
+ double var27 = 1.5D + (double)(MathHelper.sin((float)var13 * (float)Math.PI / (float)var14) * var10 * 1.0F);
+ double var29 = var27 * var15;
+ float var31 = MathHelper.cos(var12);
+ float var32 = MathHelper.sin(var12);
+ var4 += (double)(MathHelper.cos(var11) * var31);
+ var6 += (double)var32;
+ var8 += (double)(MathHelper.sin(var11) * var31);
+ if(var26) {
+ var12 *= 0.92F;
+ } else {
+ var12 *= 0.7F;
+ }
+
+ var12 += var22 * 0.1F;
+ var11 += var21 * 0.1F;
+ var22 *= 0.9F;
+ var21 *= 12.0F / 16.0F;
+ var22 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 2.0F;
+ var21 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 4.0F;
+ if(!var51 && var13 == var25 && var10 > 1.0F) {
+ this.func_4105_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D);
+ this.func_4105_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D);
+ return;
+ }
+
+ if(var51 || var23.nextInt(4) != 0) {
+ double var33 = var4 - var17;
+ double var35 = var8 - var19;
+ double var37 = (double)(var14 - var13);
+ double var39 = (double)(var10 + 2.0F + 16.0F);
+ if(var33 * var33 + var35 * var35 - var37 * var37 > var39 * var39) {
+ return;
+ }
+
+ if(var4 >= var17 - 16.0D - var27 * 2.0D && var8 >= var19 - 16.0D - var27 * 2.0D && var4 <= var17 + 16.0D + var27 * 2.0D && var8 <= var19 + 16.0D + var27 * 2.0D) {
+ int var52 = MathHelper.floor_double(var4 - var27) - var1 * 16 - 1;
+ int var34 = MathHelper.floor_double(var4 + var27) - var1 * 16 + 1;
+ int var53 = MathHelper.floor_double(var6 - var29) - 1;
+ int var36 = MathHelper.floor_double(var6 + var29) + 1;
+ int var54 = MathHelper.floor_double(var8 - var27) - var2 * 16 - 1;
+ int var38 = MathHelper.floor_double(var8 + var27) - var2 * 16 + 1;
+ if(var52 < 0) {
+ var52 = 0;
+ }
+
+ if(var34 > 16) {
+ var34 = 16;
+ }
+
+ if(var53 < 1) {
+ var53 = 1;
+ }
+
+ if(var36 > 120) {
+ var36 = 120;
+ }
+
+ if(var54 < 0) {
+ var54 = 0;
+ }
+
+ if(var38 > 16) {
+ var38 = 16;
+ }
+
+ boolean var55 = false;
+
+ int var40;
+ int var43;
+ for(var40 = var52; !var55 && var40 < var34; ++var40) {
+ for(int var41 = var54; !var55 && var41 < var38; ++var41) {
+ for(int var42 = var36 + 1; !var55 && var42 >= var53 - 1; --var42) {
+ var43 = (var40 * 16 + var41) * 128 + var42;
+ if(var42 >= 0 && var42 < 128) {
+ if(var3[var43] == Block.lavaMoving.blockID || var3[var43] == Block.lavaStill.blockID) {
+ var55 = true;
+ }
+
+ if(var42 != var53 - 1 && var40 != var52 && var40 != var34 - 1 && var41 != var54 && var41 != var38 - 1) {
+ var42 = var53;
+ }
+ }
+ }
+ }
+ }
+
+ if(!var55) {
+ for(var40 = var52; var40 < var34; ++var40) {
+ double var56 = ((double)(var40 + var1 * 16) + 0.5D - var4) / var27;
+
+ for(var43 = var54; var43 < var38; ++var43) {
+ double var44 = ((double)(var43 + var2 * 16) + 0.5D - var8) / var27;
+ int var46 = (var40 * 16 + var43) * 128 + var36;
+
+ for(int var47 = var36 - 1; var47 >= var53; --var47) {
+ double var48 = ((double)var47 + 0.5D - var6) / var29;
+ if(var48 > -0.7D && var56 * var56 + var48 * var48 + var44 * var44 < 1.0D) {
+ byte var50 = var3[var46];
+ if(var50 == Block.bloodStone.blockID || var50 == Block.dirt.blockID || var50 == Block.grass.blockID) {
+ var3[var46] = 0;
+ }
+ }
+
+ --var46;
+ }
+ }
+ }
+
+ if(var51) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ protected void func_666_a(World var1, int var2, int var3, int var4, int var5, byte[] var6) {
+ int var7 = this.rand.nextInt(this.rand.nextInt(this.rand.nextInt(10) + 1) + 1);
+ if(this.rand.nextInt(5) != 0) {
+ var7 = 0;
+ }
+
+ for(int var8 = 0; var8 < var7; ++var8) {
+ double var9 = (double)(var2 * 16 + this.rand.nextInt(16));
+ double var11 = (double)this.rand.nextInt(128);
+ double var13 = (double)(var3 * 16 + this.rand.nextInt(16));
+ int var15 = 1;
+ if(this.rand.nextInt(4) == 0) {
+ this.func_4106_a(var4, var5, var6, var9, var11, var13);
+ var15 += this.rand.nextInt(4);
+ }
+
+ for(int var16 = 0; var16 < var15; ++var16) {
+ float var17 = this.rand.nextFloat() * (float)Math.PI * 2.0F;
+ float var18 = (this.rand.nextFloat() - 0.5F) * 2.0F / 8.0F;
+ float var19 = this.rand.nextFloat() * 2.0F + this.rand.nextFloat();
+ this.func_4105_a(var4, var5, var6, var9, var11, var13, var19 * 2.0F, var17, var18, 0, 0, 0.5D);
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/MapInfo.java b/src/net/minecraft/src/MapInfo.java
new file mode 100644
index 0000000..8a389e6
--- /dev/null
+++ b/src/net/minecraft/src/MapInfo.java
@@ -0,0 +1,83 @@
+package net.minecraft.src;
+
+public class MapInfo {
+ public final EntityPlayer field_28120_a;
+ public int[] field_28119_b;
+ public int[] field_28125_c;
+ private int field_28123_e;
+ private int field_28122_f;
+ private byte[] field_28121_g;
+ final MapData field_28124_d;
+
+ public MapInfo(MapData var1, EntityPlayer var2) {
+ this.field_28124_d = var1;
+ this.field_28119_b = new int[128];
+ this.field_28125_c = new int[128];
+ this.field_28123_e = 0;
+ this.field_28122_f = 0;
+ this.field_28120_a = var2;
+
+ for(int var3 = 0; var3 < this.field_28119_b.length; ++var3) {
+ this.field_28119_b[var3] = 0;
+ this.field_28125_c[var3] = 127;
+ }
+
+ }
+
+ public byte[] func_28118_a(ItemStack var1) {
+ int var3;
+ int var10;
+ if(--this.field_28122_f < 0) {
+ this.field_28122_f = 4;
+ byte[] var2 = new byte[this.field_28124_d.field_28157_i.size() * 3 + 1];
+ var2[0] = 1;
+
+ for(var3 = 0; var3 < this.field_28124_d.field_28157_i.size(); ++var3) {
+ MapCoord var4 = (MapCoord)this.field_28124_d.field_28157_i.get(var3);
+ var2[var3 * 3 + 1] = (byte)(var4.field_28202_a + (var4.field_28204_d & 15) * 16);
+ var2[var3 * 3 + 2] = var4.field_28201_b;
+ var2[var3 * 3 + 3] = var4.field_28205_c;
+ }
+
+ boolean var9 = true;
+ if(this.field_28121_g != null && this.field_28121_g.length == var2.length) {
+ for(var10 = 0; var10 < var2.length; ++var10) {
+ if(var2[var10] != this.field_28121_g[var10]) {
+ var9 = false;
+ break;
+ }
+ }
+ } else {
+ var9 = false;
+ }
+
+ if(!var9) {
+ this.field_28121_g = var2;
+ return var2;
+ }
+ }
+
+ for(int var8 = 0; var8 < 10; ++var8) {
+ var3 = this.field_28123_e * 11 % 128;
+ ++this.field_28123_e;
+ if(this.field_28119_b[var3] >= 0) {
+ var10 = this.field_28125_c[var3] - this.field_28119_b[var3] + 1;
+ int var5 = this.field_28119_b[var3];
+ byte[] var6 = new byte[var10 + 3];
+ var6[0] = 0;
+ var6[1] = (byte)var3;
+ var6[2] = (byte)var5;
+
+ for(int var7 = 0; var7 < var6.length - 3; ++var7) {
+ var6[var7 + 3] = this.field_28124_d.field_28160_f[(var7 + var5) * 128 + var3];
+ }
+
+ this.field_28125_c[var3] = -1;
+ this.field_28119_b[var3] = -1;
+ return var6;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/src/net/minecraft/src/MapStorage.java b/src/net/minecraft/src/MapStorage.java
new file mode 100644
index 0000000..68ae7a9
--- /dev/null
+++ b/src/net/minecraft/src/MapStorage.java
@@ -0,0 +1,168 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class MapStorage {
+ private ISaveHandler field_28180_a;
+ private Map field_28179_b = new HashMap();
+ private List field_28182_c = new ArrayList();
+ private Map field_28181_d = new HashMap();
+
+ public MapStorage(ISaveHandler var1) {
+ this.field_28180_a = var1;
+ this.func_28174_b();
+ }
+
+ public MapDataBase func_28178_a(Class var1, String var2) {
+ MapDataBase var3 = (MapDataBase)this.field_28179_b.get(var2);
+ if(var3 != null) {
+ return var3;
+ } else {
+ if(this.field_28180_a != null) {
+ try {
+ File var4 = this.field_28180_a.func_28111_b(var2);
+ if(var4 != null && var4.exists()) {
+ try {
+ var3 = (MapDataBase)var1.getConstructor(new Class[]{String.class}).newInstance(new Object[]{var2});
+ } catch (Exception var7) {
+ throw new RuntimeException("Failed to instantiate " + var1.toString(), var7);
+ }
+
+ FileInputStream var5 = new FileInputStream(var4);
+ NBTTagCompound var6 = CompressedStreamTools.func_770_a(var5);
+ var5.close();
+ var3.func_28148_a(var6.getCompoundTag("data"));
+ }
+ } catch (Exception var8) {
+ var8.printStackTrace();
+ }
+ }
+
+ if(var3 != null) {
+ this.field_28179_b.put(var2, var3);
+ this.field_28182_c.add(var3);
+ }
+
+ return var3;
+ }
+ }
+
+ public void func_28177_a(String var1, MapDataBase var2) {
+ if(var2 == null) {
+ throw new RuntimeException("Can\'t set null data");
+ } else {
+ if(this.field_28179_b.containsKey(var1)) {
+ this.field_28182_c.remove(this.field_28179_b.remove(var1));
+ }
+
+ this.field_28179_b.put(var1, var2);
+ this.field_28182_c.add(var2);
+ }
+ }
+
+ public void func_28176_a() {
+ for(int var1 = 0; var1 < this.field_28182_c.size(); ++var1) {
+ MapDataBase var2 = (MapDataBase)this.field_28182_c.get(var1);
+ if(var2.func_28150_b()) {
+ this.func_28175_a(var2);
+ var2.func_28149_a(false);
+ }
+ }
+
+ }
+
+ private void func_28175_a(MapDataBase var1) {
+ if(this.field_28180_a != null) {
+ try {
+ File var2 = this.field_28180_a.func_28111_b(var1.field_28152_a);
+ if(var2 != null) {
+ NBTTagCompound var3 = new NBTTagCompound();
+ var1.func_28147_b(var3);
+ NBTTagCompound var4 = new NBTTagCompound();
+ var4.setCompoundTag("data", var3);
+ FileOutputStream var5 = new FileOutputStream(var2);
+ CompressedStreamTools.writeGzippedCompoundToOutputStream(var4, var5);
+ var5.close();
+ }
+ } catch (Exception var6) {
+ var6.printStackTrace();
+ }
+
+ }
+ }
+
+ private void func_28174_b() {
+ try {
+ this.field_28181_d.clear();
+ if(this.field_28180_a == null) {
+ return;
+ }
+
+ File var1 = this.field_28180_a.func_28111_b("idcounts");
+ if(var1 != null && var1.exists()) {
+ DataInputStream var2 = new DataInputStream(new FileInputStream(var1));
+ NBTTagCompound var3 = CompressedStreamTools.func_774_a(var2);
+ var2.close();
+ Iterator var4 = var3.func_28107_c().iterator();
+
+ while(var4.hasNext()) {
+ NBTBase var5 = (NBTBase)var4.next();
+ if(var5 instanceof NBTTagShort) {
+ NBTTagShort var6 = (NBTTagShort)var5;
+ String var7 = var6.getKey();
+ short var8 = var6.shortValue;
+ this.field_28181_d.put(var7, Short.valueOf(var8));
+ }
+ }
+ }
+ } catch (Exception var9) {
+ var9.printStackTrace();
+ }
+
+ }
+
+ public int func_28173_a(String var1) {
+ Short var2 = (Short)this.field_28181_d.get(var1);
+ if(var2 == null) {
+ var2 = Short.valueOf((short)0);
+ } else {
+ var2 = Short.valueOf((short)(var2.shortValue() + 1));
+ }
+
+ this.field_28181_d.put(var1, var2);
+ if(this.field_28180_a == null) {
+ return var2.shortValue();
+ } else {
+ try {
+ File var3 = this.field_28180_a.func_28111_b("idcounts");
+ if(var3 != null) {
+ NBTTagCompound var4 = new NBTTagCompound();
+ Iterator var5 = this.field_28181_d.keySet().iterator();
+
+ while(var5.hasNext()) {
+ String var6 = (String)var5.next();
+ short var7 = ((Short)this.field_28181_d.get(var6)).shortValue();
+ var4.setShort(var6, var7);
+ }
+
+ DataOutputStream var9 = new DataOutputStream(new FileOutputStream(var3));
+ CompressedStreamTools.func_771_a(var4, var9);
+ var9.close();
+ }
+ } catch (Exception var8) {
+ var8.printStackTrace();
+ }
+
+ return var2.shortValue();
+ }
+ }
+}
diff --git a/src/net/minecraft/src/Material.java b/src/net/minecraft/src/Material.java
new file mode 100644
index 0000000..fbd6d5c
--- /dev/null
+++ b/src/net/minecraft/src/Material.java
@@ -0,0 +1,108 @@
+package net.minecraft.src;
+
+public class Material {
+ public static final Material air = new MaterialTransparent(MapColor.field_28199_b);
+ public static final Material grass = new Material(MapColor.field_28198_c);
+ public static final Material ground = new Material(MapColor.field_28189_l);
+ public static final Material wood = (new Material(MapColor.field_28186_o)).setBurning();
+ public static final Material rock = (new Material(MapColor.field_28188_m)).func_31058_n();
+ public static final Material iron = (new Material(MapColor.field_28193_h)).func_31058_n();
+ public static final Material water = (new MaterialLiquid(MapColor.field_28187_n)).setNoPushMobility();
+ public static final Material lava = (new MaterialLiquid(MapColor.field_28195_f)).setNoPushMobility();
+ public static final Material leaves = (new Material(MapColor.field_28192_i)).setBurning().func_28129_i().setNoPushMobility();
+ public static final Material plants = (new MaterialLogic(MapColor.field_28192_i)).setNoPushMobility();
+ public static final Material sponge = new Material(MapColor.field_28196_e);
+ public static final Material cloth = (new Material(MapColor.field_28196_e)).setBurning();
+ public static final Material fire = (new MaterialTransparent(MapColor.field_28199_b)).setNoPushMobility();
+ public static final Material sand = new Material(MapColor.field_28197_d);
+ public static final Material circuits = (new MaterialLogic(MapColor.field_28199_b)).setNoPushMobility();
+ public static final Material glass = (new Material(MapColor.field_28199_b)).func_28129_i();
+ public static final Material tnt = (new Material(MapColor.field_28195_f)).setBurning().func_28129_i();
+ public static final Material wug = (new Material(MapColor.field_28192_i)).setNoPushMobility();
+ public static final Material ice = (new Material(MapColor.field_28194_g)).func_28129_i();
+ public static final Material snow = (new MaterialLogic(MapColor.field_28191_j)).func_27089_f().func_28129_i().func_31058_n().setNoPushMobility();
+ public static final Material builtSnow = (new Material(MapColor.field_28191_j)).func_31058_n();
+ public static final Material cactus = (new Material(MapColor.field_28192_i)).func_28129_i().setNoPushMobility();
+ public static final Material clay = new Material(MapColor.field_28190_k);
+ public static final Material pumpkin = (new Material(MapColor.field_28192_i)).setNoPushMobility();
+ public static final Material portal = (new MaterialPortal(MapColor.field_28199_b)).setImmovableMobility();
+ public static final Material cakeMaterial = (new Material(MapColor.field_28199_b)).setNoPushMobility();
+ public static final Material web = (new Material(MapColor.field_28196_e)).func_31058_n().setNoPushMobility();
+ public static final Material piston = (new Material(MapColor.field_28188_m)).setImmovableMobility();
+ private boolean canBurn;
+ private boolean field_27091_A;
+ private boolean isTranslucent;
+ public final MapColor field_28131_A;
+ private boolean field_31061_G = true;
+ private int mobilityFlag;
+
+ public Material(MapColor var1) {
+ this.field_28131_A = var1;
+ }
+
+ public boolean getIsLiquid() {
+ return false;
+ }
+
+ public boolean isSolid() {
+ return true;
+ }
+
+ public boolean getCanBlockGrass() {
+ return true;
+ }
+
+ public boolean getIsSolid() {
+ return true;
+ }
+
+ private Material func_28129_i() {
+ this.isTranslucent = true;
+ return this;
+ }
+
+ private Material func_31058_n() {
+ this.field_31061_G = false;
+ return this;
+ }
+
+ private Material setBurning() {
+ this.canBurn = true;
+ return this;
+ }
+
+ public boolean getBurning() {
+ return this.canBurn;
+ }
+
+ public Material func_27089_f() {
+ this.field_27091_A = true;
+ return this;
+ }
+
+ public boolean func_27090_g() {
+ return this.field_27091_A;
+ }
+
+ public boolean getIsOpaque() {
+ return this.isTranslucent ? false : this.getIsSolid();
+ }
+
+ public boolean func_31055_i() {
+ return this.field_31061_G;
+ }
+
+ public int getMaterialMobility() {
+ return this.mobilityFlag;
+ }
+
+ protected Material setNoPushMobility() {
+ this.mobilityFlag = 1;
+ return this;
+ }
+
+ protected Material setImmovableMobility() {
+ this.mobilityFlag = 2;
+ return this;
+ }
+}
diff --git a/src/net/minecraft/src/MaterialLiquid.java b/src/net/minecraft/src/MaterialLiquid.java
new file mode 100644
index 0000000..aaf0fa9
--- /dev/null
+++ b/src/net/minecraft/src/MaterialLiquid.java
@@ -0,0 +1,21 @@
+package net.minecraft.src;
+
+public class MaterialLiquid extends Material {
+ public MaterialLiquid(MapColor var1) {
+ super(var1);
+ this.func_27089_f();
+ this.setNoPushMobility();
+ }
+
+ public boolean getIsLiquid() {
+ return true;
+ }
+
+ public boolean getIsSolid() {
+ return false;
+ }
+
+ public boolean isSolid() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/MaterialLogic.java b/src/net/minecraft/src/MaterialLogic.java
new file mode 100644
index 0000000..b30bb35
--- /dev/null
+++ b/src/net/minecraft/src/MaterialLogic.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public class MaterialLogic extends Material {
+ public MaterialLogic(MapColor var1) {
+ super(var1);
+ }
+
+ public boolean isSolid() {
+ return false;
+ }
+
+ public boolean getCanBlockGrass() {
+ return false;
+ }
+
+ public boolean getIsSolid() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/MaterialPortal.java b/src/net/minecraft/src/MaterialPortal.java
new file mode 100644
index 0000000..8d18633
--- /dev/null
+++ b/src/net/minecraft/src/MaterialPortal.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public class MaterialPortal extends Material {
+ public MaterialPortal(MapColor var1) {
+ super(var1);
+ }
+
+ public boolean isSolid() {
+ return false;
+ }
+
+ public boolean getCanBlockGrass() {
+ return false;
+ }
+
+ public boolean getIsSolid() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/MaterialTransparent.java b/src/net/minecraft/src/MaterialTransparent.java
new file mode 100644
index 0000000..fb60b5d
--- /dev/null
+++ b/src/net/minecraft/src/MaterialTransparent.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+public class MaterialTransparent extends Material {
+ public MaterialTransparent(MapColor var1) {
+ super(var1);
+ this.func_27089_f();
+ }
+
+ public boolean isSolid() {
+ return false;
+ }
+
+ public boolean getCanBlockGrass() {
+ return false;
+ }
+
+ public boolean getIsSolid() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/MathHelper.java b/src/net/minecraft/src/MathHelper.java
new file mode 100644
index 0000000..5678d0c
--- /dev/null
+++ b/src/net/minecraft/src/MathHelper.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+public class MathHelper {
+ private static float[] SIN_TABLE = new float[65536];
+
+ public static final float sin(float var0) {
+ return SIN_TABLE[(int)(var0 * 10430.378F) & '\uffff'];
+ }
+
+ public static final float cos(float var0) {
+ return SIN_TABLE[(int)(var0 * 10430.378F + 16384.0F) & '\uffff'];
+ }
+
+ public static final float sqrt_float(float var0) {
+ return (float)Math.sqrt((double)var0);
+ }
+
+ public static final float sqrt_double(double var0) {
+ return (float)Math.sqrt(var0);
+ }
+
+ public static int floor_float(float var0) {
+ int var1 = (int)var0;
+ return var0 < (float)var1 ? var1 - 1 : var1;
+ }
+
+ public static int floor_double(double var0) {
+ int var2 = (int)var0;
+ return var0 < (double)var2 ? var2 - 1 : var2;
+ }
+
+ public static float abs(float var0) {
+ return var0 >= 0.0F ? var0 : -var0;
+ }
+
+ public static double abs_max(double var0, double var2) {
+ if(var0 < 0.0D) {
+ var0 = -var0;
+ }
+
+ if(var2 < 0.0D) {
+ var2 = -var2;
+ }
+
+ return var0 > var2 ? var0 : var2;
+ }
+
+ static {
+ for(int var0 = 0; var0 < 65536; ++var0) {
+ SIN_TABLE[var0] = (float)Math.sin((double)var0 * Math.PI * 2.0D / 65536.0D);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/McRegionChunkLoader.java b/src/net/minecraft/src/McRegionChunkLoader.java
new file mode 100644
index 0000000..76758e1
--- /dev/null
+++ b/src/net/minecraft/src/McRegionChunkLoader.java
@@ -0,0 +1,69 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+
+public class McRegionChunkLoader implements IChunkLoader {
+ private final File worldFolder;
+
+ public McRegionChunkLoader(File var1) {
+ this.worldFolder = var1;
+ }
+
+ public Chunk loadChunk(World var1, int var2, int var3) throws IOException {
+ DataInputStream var4 = RegionFileCache.func_22124_c(this.worldFolder, var2, var3);
+ if(var4 != null) {
+ NBTTagCompound var5 = CompressedStreamTools.func_774_a(var4);
+ if(!var5.hasKey("Level")) {
+ System.out.println("Chunk file at " + var2 + "," + var3 + " is missing level data, skipping");
+ return null;
+ } else if(!var5.getCompoundTag("Level").hasKey("Blocks")) {
+ System.out.println("Chunk file at " + var2 + "," + var3 + " is missing block data, skipping");
+ return null;
+ } else {
+ Chunk var6 = ChunkLoader.loadChunkIntoWorldFromCompound(var1, var5.getCompoundTag("Level"));
+ if(!var6.isAtLocation(var2, var3)) {
+ System.out.println("Chunk file at " + var2 + "," + var3 + " is in the wrong location; relocating. (Expected " + var2 + ", " + var3 + ", got " + var6.xPosition + ", " + var6.zPosition + ")");
+ var5.setInteger("xPos", var2);
+ var5.setInteger("zPos", var3);
+ var6 = ChunkLoader.loadChunkIntoWorldFromCompound(var1, var5.getCompoundTag("Level"));
+ }
+
+ var6.func_25083_h();
+ return var6;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void saveChunk(World var1, Chunk var2) throws IOException {
+ var1.checkSessionLock();
+
+ try {
+ DataOutputStream var3 = RegionFileCache.func_22120_d(this.worldFolder, var2.xPosition, var2.zPosition);
+ NBTTagCompound var4 = new NBTTagCompound();
+ NBTTagCompound var5 = new NBTTagCompound();
+ var4.setTag("Level", var5);
+ ChunkLoader.storeChunkInCompound(var2, var1, var5);
+ CompressedStreamTools.func_771_a(var4, var3);
+ var3.close();
+ WorldInfo var6 = var1.getWorldInfo();
+ var6.setSizeOnDisk(var6.getSizeOnDisk() + (long)RegionFileCache.func_22121_b(this.worldFolder, var2.xPosition, var2.zPosition));
+ } catch (Exception var7) {
+ var7.printStackTrace();
+ }
+
+ }
+
+ public void saveExtraChunkData(World var1, Chunk var2) throws IOException {
+ }
+
+ public void func_661_a() {
+ }
+
+ public void saveExtraData() {
+ }
+}
diff --git a/src/net/minecraft/src/MetadataChunkBlock.java b/src/net/minecraft/src/MetadataChunkBlock.java
new file mode 100644
index 0000000..42789c2
--- /dev/null
+++ b/src/net/minecraft/src/MetadataChunkBlock.java
@@ -0,0 +1,207 @@
+package net.minecraft.src;
+
+public class MetadataChunkBlock {
+ public final EnumSkyBlock field_957_a;
+ public int field_956_b;
+ public int field_962_c;
+ public int field_961_d;
+ public int field_960_e;
+ public int field_959_f;
+ public int field_958_g;
+
+ public MetadataChunkBlock(EnumSkyBlock var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ this.field_957_a = var1;
+ this.field_956_b = var2;
+ this.field_962_c = var3;
+ this.field_961_d = var4;
+ this.field_960_e = var5;
+ this.field_959_f = var6;
+ this.field_958_g = var7;
+ }
+
+ public void func_4107_a(World var1) {
+ int var2 = this.field_960_e - this.field_956_b + 1;
+ int var3 = this.field_959_f - this.field_962_c + 1;
+ int var4 = this.field_958_g - this.field_961_d + 1;
+ int var5 = var2 * var3 * var4;
+ if(var5 > -Short.MIN_VALUE) {
+ System.out.println("Light too large, skipping!");
+ } else {
+ int var6 = 0;
+ int var7 = 0;
+ boolean var8 = false;
+ boolean var9 = false;
+
+ for(int var10 = this.field_956_b; var10 <= this.field_960_e; ++var10) {
+ for(int var11 = this.field_961_d; var11 <= this.field_958_g; ++var11) {
+ int var12 = var10 >> 4;
+ int var13 = var11 >> 4;
+ boolean var14 = false;
+ if(var8 && var12 == var6 && var13 == var7) {
+ var14 = var9;
+ } else {
+ var14 = var1.doChunksNearChunkExist(var10, 0, var11, 1);
+ if(var14) {
+ Chunk var15 = var1.getChunkFromChunkCoords(var10 >> 4, var11 >> 4);
+ if(var15.func_21101_g()) {
+ var14 = false;
+ }
+ }
+
+ var9 = var14;
+ var6 = var12;
+ var7 = var13;
+ }
+
+ if(var14) {
+ if(this.field_962_c < 0) {
+ this.field_962_c = 0;
+ }
+
+ if(this.field_959_f >= 128) {
+ this.field_959_f = 127;
+ }
+
+ for(int var27 = this.field_962_c; var27 <= this.field_959_f; ++var27) {
+ int var16 = var1.getSavedLightValue(this.field_957_a, var10, var27, var11);
+ boolean var17 = false;
+ int var18 = var1.getBlockId(var10, var27, var11);
+ int var19 = Block.lightOpacity[var18];
+ if(var19 == 0) {
+ var19 = 1;
+ }
+
+ int var20 = 0;
+ if(this.field_957_a == EnumSkyBlock.Sky) {
+ if(var1.canExistingBlockSeeTheSky(var10, var27, var11)) {
+ var20 = 15;
+ }
+ } else if(this.field_957_a == EnumSkyBlock.Block) {
+ var20 = Block.lightValue[var18];
+ }
+
+ int var21;
+ int var28;
+ if(var19 >= 15 && var20 == 0) {
+ var28 = 0;
+ } else {
+ var21 = var1.getSavedLightValue(this.field_957_a, var10 - 1, var27, var11);
+ int var22 = var1.getSavedLightValue(this.field_957_a, var10 + 1, var27, var11);
+ int var23 = var1.getSavedLightValue(this.field_957_a, var10, var27 - 1, var11);
+ int var24 = var1.getSavedLightValue(this.field_957_a, var10, var27 + 1, var11);
+ int var25 = var1.getSavedLightValue(this.field_957_a, var10, var27, var11 - 1);
+ int var26 = var1.getSavedLightValue(this.field_957_a, var10, var27, var11 + 1);
+ var28 = var21;
+ if(var22 > var21) {
+ var28 = var22;
+ }
+
+ if(var23 > var28) {
+ var28 = var23;
+ }
+
+ if(var24 > var28) {
+ var28 = var24;
+ }
+
+ if(var25 > var28) {
+ var28 = var25;
+ }
+
+ if(var26 > var28) {
+ var28 = var26;
+ }
+
+ var28 -= var19;
+ if(var28 < 0) {
+ var28 = 0;
+ }
+
+ if(var20 > var28) {
+ var28 = var20;
+ }
+ }
+
+ if(var16 != var28) {
+ var1.setLightValue(this.field_957_a, var10, var27, var11, var28);
+ var21 = var28 - 1;
+ if(var21 < 0) {
+ var21 = 0;
+ }
+
+ var1.neighborLightPropagationChanged(this.field_957_a, var10 - 1, var27, var11, var21);
+ var1.neighborLightPropagationChanged(this.field_957_a, var10, var27 - 1, var11, var21);
+ var1.neighborLightPropagationChanged(this.field_957_a, var10, var27, var11 - 1, var21);
+ if(var10 + 1 >= this.field_960_e) {
+ var1.neighborLightPropagationChanged(this.field_957_a, var10 + 1, var27, var11, var21);
+ }
+
+ if(var27 + 1 >= this.field_959_f) {
+ var1.neighborLightPropagationChanged(this.field_957_a, var10, var27 + 1, var11, var21);
+ }
+
+ if(var11 + 1 >= this.field_958_g) {
+ var1.neighborLightPropagationChanged(this.field_957_a, var10, var27, var11 + 1, var21);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+ }
+
+ public boolean func_692_a(int var1, int var2, int var3, int var4, int var5, int var6) {
+ if(var1 >= this.field_956_b && var2 >= this.field_962_c && var3 >= this.field_961_d && var4 <= this.field_960_e && var5 <= this.field_959_f && var6 <= this.field_958_g) {
+ return true;
+ } else {
+ byte var7 = 1;
+ if(var1 >= this.field_956_b - var7 && var2 >= this.field_962_c - var7 && var3 >= this.field_961_d - var7 && var4 <= this.field_960_e + var7 && var5 <= this.field_959_f + var7 && var6 <= this.field_958_g + var7) {
+ int var8 = this.field_960_e - this.field_956_b;
+ int var9 = this.field_959_f - this.field_962_c;
+ int var10 = this.field_958_g - this.field_961_d;
+ if(var1 > this.field_956_b) {
+ var1 = this.field_956_b;
+ }
+
+ if(var2 > this.field_962_c) {
+ var2 = this.field_962_c;
+ }
+
+ if(var3 > this.field_961_d) {
+ var3 = this.field_961_d;
+ }
+
+ if(var4 < this.field_960_e) {
+ var4 = this.field_960_e;
+ }
+
+ if(var5 < this.field_959_f) {
+ var5 = this.field_959_f;
+ }
+
+ if(var6 < this.field_958_g) {
+ var6 = this.field_958_g;
+ }
+
+ int var11 = var4 - var1;
+ int var12 = var5 - var2;
+ int var13 = var6 - var3;
+ int var14 = var8 * var9 * var10;
+ int var15 = var11 * var12 * var13;
+ if(var15 - var14 <= 2) {
+ this.field_956_b = var1;
+ this.field_962_c = var2;
+ this.field_961_d = var3;
+ this.field_960_e = var4;
+ this.field_959_f = var5;
+ this.field_958_g = var6;
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/MinecraftException.java b/src/net/minecraft/src/MinecraftException.java
new file mode 100644
index 0000000..07cfee7
--- /dev/null
+++ b/src/net/minecraft/src/MinecraftException.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public class MinecraftException extends RuntimeException {
+ public MinecraftException(String var1) {
+ super(var1);
+ }
+}
diff --git a/src/net/minecraft/src/ModelBed.java b/src/net/minecraft/src/ModelBed.java
new file mode 100644
index 0000000..1e5bf51
--- /dev/null
+++ b/src/net/minecraft/src/ModelBed.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public class ModelBed {
+ public static final int[] field_22154_a = new int[]{3, 4, 2, 5};
+ public static final int[] field_22153_b = new int[]{2, 3, 0, 1};
+ public static final int[][] field_22155_c = new int[][]{{1, 0, 3, 2, 5, 4}, {1, 0, 5, 4, 2, 3}, {1, 0, 2, 3, 4, 5}, {1, 0, 4, 5, 3, 2}};
+}
diff --git a/src/net/minecraft/src/MovingObjectPosition.java b/src/net/minecraft/src/MovingObjectPosition.java
new file mode 100644
index 0000000..1cc1149
--- /dev/null
+++ b/src/net/minecraft/src/MovingObjectPosition.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public class MovingObjectPosition {
+ public EnumMovingObjectType typeOfHit;
+ public int blockX;
+ public int blockY;
+ public int blockZ;
+ public int sideHit;
+ public Vec3D hitVec;
+ public Entity entityHit;
+
+ public MovingObjectPosition(int var1, int var2, int var3, int var4, Vec3D var5) {
+ this.typeOfHit = EnumMovingObjectType.TILE;
+ this.blockX = var1;
+ this.blockY = var2;
+ this.blockZ = var3;
+ this.sideHit = var4;
+ this.hitVec = Vec3D.createVector(var5.xCoord, var5.yCoord, var5.zCoord);
+ }
+
+ public MovingObjectPosition(Entity var1) {
+ this.typeOfHit = EnumMovingObjectType.ENTITY;
+ this.entityHit = var1;
+ this.hitVec = Vec3D.createVector(var1.posX, var1.posY, var1.posZ);
+ }
+}
diff --git a/src/net/minecraft/src/NBTBase.java b/src/net/minecraft/src/NBTBase.java
new file mode 100644
index 0000000..454b4e7
--- /dev/null
+++ b/src/net/minecraft/src/NBTBase.java
@@ -0,0 +1,102 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public abstract class NBTBase {
+ private String key = null;
+
+ abstract void writeTagContents(DataOutput var1) throws IOException;
+
+ abstract void readTagContents(DataInput var1) throws IOException;
+
+ public abstract byte getType();
+
+ public String getKey() {
+ return this.key == null ? "" : this.key;
+ }
+
+ public NBTBase setKey(String var1) {
+ this.key = var1;
+ return this;
+ }
+
+ public static NBTBase readTag(DataInput var0) throws IOException {
+ byte var1 = var0.readByte();
+ if(var1 == 0) {
+ return new NBTTagEnd();
+ } else {
+ NBTBase var2 = createTagOfType(var1);
+ var2.key = var0.readUTF();
+ var2.readTagContents(var0);
+ return var2;
+ }
+ }
+
+ public static void writeTag(NBTBase var0, DataOutput var1) throws IOException {
+ var1.writeByte(var0.getType());
+ if(var0.getType() != 0) {
+ var1.writeUTF(var0.getKey());
+ var0.writeTagContents(var1);
+ }
+ }
+
+ public static NBTBase createTagOfType(byte var0) {
+ switch(var0) {
+ case 0:
+ return new NBTTagEnd();
+ case 1:
+ return new NBTTagByte();
+ case 2:
+ return new NBTTagShort();
+ case 3:
+ return new NBTTagInt();
+ case 4:
+ return new NBTTagLong();
+ case 5:
+ return new NBTTagFloat();
+ case 6:
+ return new NBTTagDouble();
+ case 7:
+ return new NBTTagByteArray();
+ case 8:
+ return new NBTTagString();
+ case 9:
+ return new NBTTagList();
+ case 10:
+ return new NBTTagCompound();
+ default:
+ return null;
+ }
+ }
+
+ public static String getTagName(byte var0) {
+ switch(var0) {
+ case 0:
+ return "TAG_End";
+ case 1:
+ return "TAG_Byte";
+ case 2:
+ return "TAG_Short";
+ case 3:
+ return "TAG_Int";
+ case 4:
+ return "TAG_Long";
+ case 5:
+ return "TAG_Float";
+ case 6:
+ return "TAG_Double";
+ case 7:
+ return "TAG_Byte_Array";
+ case 8:
+ return "TAG_String";
+ case 9:
+ return "TAG_List";
+ case 10:
+ return "TAG_Compound";
+ default:
+ return "UNKNOWN";
+ }
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagByte.java b/src/net/minecraft/src/NBTTagByte.java
new file mode 100644
index 0000000..3260724
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagByte.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagByte extends NBTBase {
+ public byte byteValue;
+
+ public NBTTagByte() {
+ }
+
+ public NBTTagByte(byte var1) {
+ this.byteValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeByte(this.byteValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.byteValue = var1.readByte();
+ }
+
+ public byte getType() {
+ return (byte)1;
+ }
+
+ public String toString() {
+ return "" + this.byteValue;
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagByteArray.java b/src/net/minecraft/src/NBTTagByteArray.java
new file mode 100644
index 0000000..0f58fe1
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagByteArray.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagByteArray extends NBTBase {
+ public byte[] byteArray;
+
+ public NBTTagByteArray() {
+ }
+
+ public NBTTagByteArray(byte[] var1) {
+ this.byteArray = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeInt(this.byteArray.length);
+ var1.write(this.byteArray);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ int var2 = var1.readInt();
+ this.byteArray = new byte[var2];
+ var1.readFully(this.byteArray);
+ }
+
+ public byte getType() {
+ return (byte)7;
+ }
+
+ public String toString() {
+ return "[" + this.byteArray.length + " bytes]";
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagCompound.java b/src/net/minecraft/src/NBTTagCompound.java
new file mode 100644
index 0000000..c955ef5
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagCompound.java
@@ -0,0 +1,141 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public class NBTTagCompound extends NBTBase {
+ private Map tagMap = new HashMap();
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ Iterator var2 = this.tagMap.values().iterator();
+
+ while(var2.hasNext()) {
+ NBTBase var3 = (NBTBase)var2.next();
+ NBTBase.writeTag(var3, var1);
+ }
+
+ var1.writeByte(0);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.tagMap.clear();
+
+ while(true) {
+ NBTBase var2 = NBTBase.readTag(var1);
+ if(var2.getType() == 0) {
+ return;
+ }
+
+ this.tagMap.put(var2.getKey(), var2);
+ }
+ }
+
+ public Collection func_28107_c() {
+ return this.tagMap.values();
+ }
+
+ public byte getType() {
+ return (byte)10;
+ }
+
+ public void setTag(String var1, NBTBase var2) {
+ this.tagMap.put(var1, var2.setKey(var1));
+ }
+
+ public void setByte(String var1, byte var2) {
+ this.tagMap.put(var1, (new NBTTagByte(var2)).setKey(var1));
+ }
+
+ public void setShort(String var1, short var2) {
+ this.tagMap.put(var1, (new NBTTagShort(var2)).setKey(var1));
+ }
+
+ public void setInteger(String var1, int var2) {
+ this.tagMap.put(var1, (new NBTTagInt(var2)).setKey(var1));
+ }
+
+ public void setLong(String var1, long var2) {
+ this.tagMap.put(var1, (new NBTTagLong(var2)).setKey(var1));
+ }
+
+ public void setFloat(String var1, float var2) {
+ this.tagMap.put(var1, (new NBTTagFloat(var2)).setKey(var1));
+ }
+
+ public void setDouble(String var1, double var2) {
+ this.tagMap.put(var1, (new NBTTagDouble(var2)).setKey(var1));
+ }
+
+ public void setString(String var1, String var2) {
+ this.tagMap.put(var1, (new NBTTagString(var2)).setKey(var1));
+ }
+
+ public void setByteArray(String var1, byte[] var2) {
+ this.tagMap.put(var1, (new NBTTagByteArray(var2)).setKey(var1));
+ }
+
+ public void setCompoundTag(String var1, NBTTagCompound var2) {
+ this.tagMap.put(var1, var2.setKey(var1));
+ }
+
+ public void setBoolean(String var1, boolean var2) {
+ this.setByte(var1, (byte)(var2 ? 1 : 0));
+ }
+
+ public boolean hasKey(String var1) {
+ return this.tagMap.containsKey(var1);
+ }
+
+ public byte getByte(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagByte)this.tagMap.get(var1)).byteValue;
+ }
+
+ public short getShort(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagShort)this.tagMap.get(var1)).shortValue;
+ }
+
+ public int getInteger(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagInt)this.tagMap.get(var1)).intValue;
+ }
+
+ public long getLong(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0L : ((NBTTagLong)this.tagMap.get(var1)).longValue;
+ }
+
+ public float getFloat(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0.0F : ((NBTTagFloat)this.tagMap.get(var1)).floatValue;
+ }
+
+ public double getDouble(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0.0D : ((NBTTagDouble)this.tagMap.get(var1)).doubleValue;
+ }
+
+ public String getString(String var1) {
+ return !this.tagMap.containsKey(var1) ? "" : ((NBTTagString)this.tagMap.get(var1)).stringValue;
+ }
+
+ public byte[] getByteArray(String var1) {
+ return !this.tagMap.containsKey(var1) ? new byte[0] : ((NBTTagByteArray)this.tagMap.get(var1)).byteArray;
+ }
+
+ public NBTTagCompound getCompoundTag(String var1) {
+ return !this.tagMap.containsKey(var1) ? new NBTTagCompound() : (NBTTagCompound)this.tagMap.get(var1);
+ }
+
+ public NBTTagList getTagList(String var1) {
+ return !this.tagMap.containsKey(var1) ? new NBTTagList() : (NBTTagList)this.tagMap.get(var1);
+ }
+
+ public boolean getBoolean(String var1) {
+ return this.getByte(var1) != 0;
+ }
+
+ public String toString() {
+ return "" + this.tagMap.size() + " entries";
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagDouble.java b/src/net/minecraft/src/NBTTagDouble.java
new file mode 100644
index 0000000..cd00968
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagDouble.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagDouble extends NBTBase {
+ public double doubleValue;
+
+ public NBTTagDouble() {
+ }
+
+ public NBTTagDouble(double var1) {
+ this.doubleValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeDouble(this.doubleValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.doubleValue = var1.readDouble();
+ }
+
+ public byte getType() {
+ return (byte)6;
+ }
+
+ public String toString() {
+ return "" + this.doubleValue;
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagEnd.java b/src/net/minecraft/src/NBTTagEnd.java
new file mode 100644
index 0000000..a04e7d6
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagEnd.java
@@ -0,0 +1,21 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagEnd extends NBTBase {
+ void readTagContents(DataInput var1) throws IOException {
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ }
+
+ public byte getType() {
+ return (byte)0;
+ }
+
+ public String toString() {
+ return "END";
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagFloat.java b/src/net/minecraft/src/NBTTagFloat.java
new file mode 100644
index 0000000..cf59c93
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagFloat.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagFloat extends NBTBase {
+ public float floatValue;
+
+ public NBTTagFloat() {
+ }
+
+ public NBTTagFloat(float var1) {
+ this.floatValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeFloat(this.floatValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.floatValue = var1.readFloat();
+ }
+
+ public byte getType() {
+ return (byte)5;
+ }
+
+ public String toString() {
+ return "" + this.floatValue;
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagInt.java b/src/net/minecraft/src/NBTTagInt.java
new file mode 100644
index 0000000..6dfdfe6
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagInt.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagInt extends NBTBase {
+ public int intValue;
+
+ public NBTTagInt() {
+ }
+
+ public NBTTagInt(int var1) {
+ this.intValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeInt(this.intValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.intValue = var1.readInt();
+ }
+
+ public byte getType() {
+ return (byte)3;
+ }
+
+ public String toString() {
+ return "" + this.intValue;
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagList.java b/src/net/minecraft/src/NBTTagList.java
new file mode 100644
index 0000000..3ee8caf
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagList.java
@@ -0,0 +1,62 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class NBTTagList extends NBTBase {
+ private List tagList = new ArrayList();
+ private byte tagType;
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ if(this.tagList.size() > 0) {
+ this.tagType = ((NBTBase)this.tagList.get(0)).getType();
+ } else {
+ this.tagType = 1;
+ }
+
+ var1.writeByte(this.tagType);
+ var1.writeInt(this.tagList.size());
+
+ for(int var2 = 0; var2 < this.tagList.size(); ++var2) {
+ ((NBTBase)this.tagList.get(var2)).writeTagContents(var1);
+ }
+
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.tagType = var1.readByte();
+ int var2 = var1.readInt();
+ this.tagList = new ArrayList();
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ NBTBase var4 = NBTBase.createTagOfType(this.tagType);
+ var4.readTagContents(var1);
+ this.tagList.add(var4);
+ }
+
+ }
+
+ public byte getType() {
+ return (byte)9;
+ }
+
+ public String toString() {
+ return "" + this.tagList.size() + " entries of type " + NBTBase.getTagName(this.tagType);
+ }
+
+ public void setTag(NBTBase var1) {
+ this.tagType = var1.getType();
+ this.tagList.add(var1);
+ }
+
+ public NBTBase tagAt(int var1) {
+ return (NBTBase)this.tagList.get(var1);
+ }
+
+ public int tagCount() {
+ return this.tagList.size();
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagLong.java b/src/net/minecraft/src/NBTTagLong.java
new file mode 100644
index 0000000..646f80d
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagLong.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagLong extends NBTBase {
+ public long longValue;
+
+ public NBTTagLong() {
+ }
+
+ public NBTTagLong(long var1) {
+ this.longValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeLong(this.longValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.longValue = var1.readLong();
+ }
+
+ public byte getType() {
+ return (byte)4;
+ }
+
+ public String toString() {
+ return "" + this.longValue;
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagShort.java b/src/net/minecraft/src/NBTTagShort.java
new file mode 100644
index 0000000..3345229
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagShort.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagShort extends NBTBase {
+ public short shortValue;
+
+ public NBTTagShort() {
+ }
+
+ public NBTTagShort(short var1) {
+ this.shortValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeShort(this.shortValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.shortValue = var1.readShort();
+ }
+
+ public byte getType() {
+ return (byte)2;
+ }
+
+ public String toString() {
+ return "" + this.shortValue;
+ }
+}
diff --git a/src/net/minecraft/src/NBTTagString.java b/src/net/minecraft/src/NBTTagString.java
new file mode 100644
index 0000000..93fca6e
--- /dev/null
+++ b/src/net/minecraft/src/NBTTagString.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagString extends NBTBase {
+ public String stringValue;
+
+ public NBTTagString() {
+ }
+
+ public NBTTagString(String var1) {
+ this.stringValue = var1;
+ if(var1 == null) {
+ throw new IllegalArgumentException("Empty string not allowed");
+ }
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeUTF(this.stringValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.stringValue = var1.readUTF();
+ }
+
+ public byte getType() {
+ return (byte)8;
+ }
+
+ public String toString() {
+ return "" + this.stringValue;
+ }
+}
diff --git a/src/net/minecraft/src/NetHandler.java b/src/net/minecraft/src/NetHandler.java
new file mode 100644
index 0000000..5c5c3de
--- /dev/null
+++ b/src/net/minecraft/src/NetHandler.java
@@ -0,0 +1,210 @@
+package net.minecraft.src;
+
+public abstract class NetHandler {
+ public abstract boolean isServerHandler();
+
+ public void handleMapChunk(Packet51MapChunk var1) {
+ }
+
+ public void registerPacket(Packet var1) {
+ }
+
+ public void handleErrorMessage(String var1, Object[] var2) {
+ }
+
+ public void handleKickDisconnect(Packet255KickDisconnect var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleLogin(Packet1Login var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleFlying(Packet10Flying var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleMultiBlockChange(Packet52MultiBlockChange var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleBlockDig(Packet14BlockDig var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleBlockChange(Packet53BlockChange var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handlePreChunk(Packet50PreChunk var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleNamedEntitySpawn(Packet20NamedEntitySpawn var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleEntity(Packet30Entity var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleEntityTeleport(Packet34EntityTeleport var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handlePlace(Packet15Place var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleBlockItemSwitch(Packet16BlockItemSwitch var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleDestroyEntity(Packet29DestroyEntity var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handlePickupSpawn(Packet21PickupSpawn var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleCollect(Packet22Collect var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleChat(Packet3Chat var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleVehicleSpawn(Packet23VehicleSpawn var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleArmAnimation(Packet18Animation var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_21001_a(Packet19EntityAction var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleHandshake(Packet2Handshake var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleMobSpawn(Packet24MobSpawn var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleUpdateTime(Packet4UpdateTime var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleSpawnPosition(Packet6SpawnPosition var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_6002_a(Packet28EntityVelocity var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_21002_a(Packet40EntityMetadata var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_6003_a(Packet39AttachEntity var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_6006_a(Packet7UseEntity var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_9001_a(Packet38EntityStatus var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleHealth(Packet8UpdateHealth var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleRespawnPacket(Packet9Respawn var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_12001_a(Packet60Explosion var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_20004_a(Packet100OpenWindow var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleCraftingGuiClosedPacked(Packet101CloseWindow var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_20007_a(Packet102WindowClick var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_20003_a(Packet103SetSlot var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_20001_a(Packet104WindowItems var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleUpdateSign(Packet130UpdateSign var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_20002_a(Packet105UpdateProgressbar var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handlePlayerInventory(Packet5PlayerInventory var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_20008_a(Packet106Transaction var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_21003_a(Packet25EntityPainting var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_21004_a(Packet54PlayNoteBlock var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_27001_a(Packet200Statistic var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_22002_a(Packet17Sleep var1) {
+ this.registerPacket(var1);
+ }
+
+ public void handleMovementTypePacket(Packet27Position var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_25001_a(Packet70Bed var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_27002_a(Packet71Weather var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_28001_a(Packet131MapData var1) {
+ this.registerPacket(var1);
+ }
+
+ public void func_28002_a(Packet61DoorChange var1) {
+ this.registerPacket(var1);
+ }
+}
diff --git a/src/net/minecraft/src/NetLoginHandler.java b/src/net/minecraft/src/NetLoginHandler.java
new file mode 100644
index 0000000..ab51536
--- /dev/null
+++ b/src/net/minecraft/src/NetLoginHandler.java
@@ -0,0 +1,128 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+import java.net.Socket;
+import java.util.Random;
+import java.util.logging.Logger;
+import net.minecraft.server.MinecraftServer;
+
+public class NetLoginHandler extends NetHandler {
+ public static Logger logger = Logger.getLogger("Minecraft");
+ private static Random rand = new Random();
+ public NetworkManager netManager;
+ public boolean finishedProcessing = false;
+ private MinecraftServer mcServer;
+ private int loginTimer = 0;
+ private String username = null;
+ private Packet1Login packet1login = null;
+ private String serverId = "";
+
+ public NetLoginHandler(MinecraftServer var1, Socket var2, String var3) throws IOException {
+ this.mcServer = var1;
+ this.netManager = new NetworkManager(var2, var3, this);
+ this.netManager.chunkDataSendCounter = 0;
+ }
+
+ public void tryLogin() {
+ if(this.packet1login != null) {
+ this.doLogin(this.packet1login);
+ this.packet1login = null;
+ }
+
+ if(this.loginTimer++ == 600) {
+ this.kickUser("Took too long to log in");
+ } else {
+ this.netManager.processReadPackets();
+ }
+
+ }
+
+ public void kickUser(String var1) {
+ try {
+ logger.info("Disconnecting " + this.getUserAndIPString() + ": " + var1);
+ this.netManager.addToSendQueue(new Packet255KickDisconnect(var1));
+ this.netManager.serverShutdown();
+ this.finishedProcessing = true;
+ } catch (Exception var3) {
+ var3.printStackTrace();
+ }
+
+ }
+
+ public void handleHandshake(Packet2Handshake var1) {
+ if(this.mcServer.onlineMode) {
+ this.serverId = Long.toHexString(rand.nextLong());
+ this.netManager.addToSendQueue(new Packet2Handshake(this.serverId));
+ } else {
+ this.netManager.addToSendQueue(new Packet2Handshake("-"));
+ }
+
+ }
+
+ public void handleLogin(Packet1Login var1) {
+ this.username = var1.username;
+ if(var1.protocolVersion != 14) {
+ if(var1.protocolVersion > 14) {
+ this.kickUser("Outdated server!");
+ } else {
+ this.kickUser("Outdated client!");
+ }
+
+ } else {
+ if(!this.mcServer.onlineMode) {
+ this.doLogin(var1);
+ } else {
+ (new ThreadLoginVerifier(this, var1)).start();
+ }
+
+ }
+ }
+
+ public void doLogin(Packet1Login var1) {
+ EntityPlayerMP var2 = this.mcServer.configManager.login(this, var1.username);
+ if(var2 != null) {
+ this.mcServer.configManager.readPlayerDataFromFile(var2);
+ var2.setWorldHandler(this.mcServer.getWorldManager(var2.dimension));
+ logger.info(this.getUserAndIPString() + " logged in with entity id " + var2.entityId + " at (" + var2.posX + ", " + var2.posY + ", " + var2.posZ + ")");
+ WorldServer var3 = this.mcServer.getWorldManager(var2.dimension);
+ ChunkCoordinates var4 = var3.getSpawnPoint();
+ NetServerHandler var5 = new NetServerHandler(this.mcServer, this.netManager, var2);
+ var5.sendPacket(new Packet1Login("", var2.entityId, var3.getRandomSeed(), (byte)var3.worldProvider.worldType));
+ var5.sendPacket(new Packet6SpawnPosition(var4.posX, var4.posY, var4.posZ));
+ this.mcServer.configManager.func_28170_a(var2, var3);
+ this.mcServer.configManager.sendPacketToAllPlayers(new Packet3Chat("\u00a7e" + var2.username + " joined the game."));
+ this.mcServer.configManager.playerLoggedIn(var2);
+ var5.teleportTo(var2.posX, var2.posY, var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.mcServer.networkServer.addPlayer(var5);
+ var5.sendPacket(new Packet4UpdateTime(var3.getWorldTime()));
+ var2.func_20057_k();
+ }
+
+ this.finishedProcessing = true;
+ }
+
+ public void handleErrorMessage(String var1, Object[] var2) {
+ logger.info(this.getUserAndIPString() + " lost connection");
+ this.finishedProcessing = true;
+ }
+
+ public void registerPacket(Packet var1) {
+ this.kickUser("Protocol error");
+ }
+
+ public String getUserAndIPString() {
+ return this.username != null ? this.username + " [" + this.netManager.getRemoteAddress().toString() + "]" : this.netManager.getRemoteAddress().toString();
+ }
+
+ public boolean isServerHandler() {
+ return true;
+ }
+
+ static String getServerId(NetLoginHandler var0) {
+ return var0.serverId;
+ }
+
+ static Packet1Login setLoginPacket(NetLoginHandler var0, Packet1Login var1) {
+ return var0.packet1login = var1;
+ }
+}
diff --git a/src/net/minecraft/src/NetServerHandler.java b/src/net/minecraft/src/NetServerHandler.java
new file mode 100644
index 0000000..6b67097
--- /dev/null
+++ b/src/net/minecraft/src/NetServerHandler.java
@@ -0,0 +1,583 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+import net.minecraft.server.MinecraftServer;
+
+public class NetServerHandler extends NetHandler implements ICommandListener {
+ public static Logger logger = Logger.getLogger("Minecraft");
+ public NetworkManager netManager;
+ public boolean connectionClosed = false;
+ private MinecraftServer mcServer;
+ private EntityPlayerMP playerEntity;
+ private int field_15_f;
+ private int field_22004_g;
+ private int playerInAirTime;
+ private boolean field_22003_h;
+ private double lastPosX;
+ private double lastPosY;
+ private double lastPosZ;
+ private boolean hasMoved = true;
+ private Map field_10_k = new HashMap();
+
+ public NetServerHandler(MinecraftServer var1, NetworkManager var2, EntityPlayerMP var3) {
+ this.mcServer = var1;
+ this.netManager = var2;
+ var2.setNetHandler(this);
+ this.playerEntity = var3;
+ var3.playerNetServerHandler = this;
+ }
+
+ public void handlePackets() {
+ this.field_22003_h = false;
+ this.netManager.processReadPackets();
+ if(this.field_15_f - this.field_22004_g > 20) {
+ this.sendPacket(new Packet0KeepAlive());
+ }
+
+ }
+
+ public void kickPlayer(String var1) {
+ this.playerEntity.func_30002_A();
+ this.sendPacket(new Packet255KickDisconnect(var1));
+ this.netManager.serverShutdown();
+ this.mcServer.configManager.sendPacketToAllPlayers(new Packet3Chat("\u00a7e" + this.playerEntity.username + " left the game."));
+ this.mcServer.configManager.playerLoggedOut(this.playerEntity);
+ this.connectionClosed = true;
+ }
+
+ public void handleMovementTypePacket(Packet27Position var1) {
+ this.playerEntity.setMovementType(var1.func_22031_c(), var1.func_22028_e(), var1.func_22032_g(), var1.func_22030_h(), var1.func_22029_d(), var1.func_22033_f());
+ }
+
+ public void handleFlying(Packet10Flying var1) {
+ WorldServer var2 = this.mcServer.getWorldManager(this.playerEntity.dimension);
+ this.field_22003_h = true;
+ double var3;
+ if(!this.hasMoved) {
+ var3 = var1.yPosition - this.lastPosY;
+ if(var1.xPosition == this.lastPosX && var3 * var3 < 0.01D && var1.zPosition == this.lastPosZ) {
+ this.hasMoved = true;
+ }
+ }
+
+ if(this.hasMoved) {
+ double var5;
+ double var7;
+ double var9;
+ double var13;
+ if(this.playerEntity.ridingEntity != null) {
+ float var26 = this.playerEntity.rotationYaw;
+ float var4 = this.playerEntity.rotationPitch;
+ this.playerEntity.ridingEntity.updateRiderPosition();
+ var5 = this.playerEntity.posX;
+ var7 = this.playerEntity.posY;
+ var9 = this.playerEntity.posZ;
+ double var27 = 0.0D;
+ var13 = 0.0D;
+ if(var1.rotating) {
+ var26 = var1.yaw;
+ var4 = var1.pitch;
+ }
+
+ if(var1.moving && var1.yPosition == -999.0D && var1.stance == -999.0D) {
+ var27 = var1.xPosition;
+ var13 = var1.zPosition;
+ }
+
+ this.playerEntity.onGround = var1.onGround;
+ this.playerEntity.onUpdateEntity(true);
+ this.playerEntity.moveEntity(var27, 0.0D, var13);
+ this.playerEntity.setPositionAndRotation(var5, var7, var9, var26, var4);
+ this.playerEntity.motionX = var27;
+ this.playerEntity.motionZ = var13;
+ if(this.playerEntity.ridingEntity != null) {
+ var2.func_12017_b(this.playerEntity.ridingEntity, true);
+ }
+
+ if(this.playerEntity.ridingEntity != null) {
+ this.playerEntity.ridingEntity.updateRiderPosition();
+ }
+
+ this.mcServer.configManager.func_613_b(this.playerEntity);
+ this.lastPosX = this.playerEntity.posX;
+ this.lastPosY = this.playerEntity.posY;
+ this.lastPosZ = this.playerEntity.posZ;
+ var2.updateEntity(this.playerEntity);
+ return;
+ }
+
+ if(this.playerEntity.func_22057_E()) {
+ this.playerEntity.onUpdateEntity(true);
+ this.playerEntity.setPositionAndRotation(this.lastPosX, this.lastPosY, this.lastPosZ, this.playerEntity.rotationYaw, this.playerEntity.rotationPitch);
+ var2.updateEntity(this.playerEntity);
+ return;
+ }
+
+ var3 = this.playerEntity.posY;
+ this.lastPosX = this.playerEntity.posX;
+ this.lastPosY = this.playerEntity.posY;
+ this.lastPosZ = this.playerEntity.posZ;
+ var5 = this.playerEntity.posX;
+ var7 = this.playerEntity.posY;
+ var9 = this.playerEntity.posZ;
+ float var11 = this.playerEntity.rotationYaw;
+ float var12 = this.playerEntity.rotationPitch;
+ if(var1.moving && var1.yPosition == -999.0D && var1.stance == -999.0D) {
+ var1.moving = false;
+ }
+
+ if(var1.moving) {
+ var5 = var1.xPosition;
+ var7 = var1.yPosition;
+ var9 = var1.zPosition;
+ var13 = var1.stance - var1.yPosition;
+ if(!this.playerEntity.func_22057_E() && (var13 > 1.65D || var13 < 0.1D)) {
+ this.kickPlayer("Illegal stance");
+ logger.warning(this.playerEntity.username + " had an illegal stance: " + var13);
+ return;
+ }
+
+ if(Math.abs(var1.xPosition) > 3.2E7D || Math.abs(var1.zPosition) > 3.2E7D) {
+ this.kickPlayer("Illegal position");
+ return;
+ }
+ }
+
+ if(var1.rotating) {
+ var11 = var1.yaw;
+ var12 = var1.pitch;
+ }
+
+ this.playerEntity.onUpdateEntity(true);
+ this.playerEntity.ySize = 0.0F;
+ this.playerEntity.setPositionAndRotation(this.lastPosX, this.lastPosY, this.lastPosZ, var11, var12);
+ if(!this.hasMoved) {
+ return;
+ }
+
+ var13 = var5 - this.playerEntity.posX;
+ double var15 = var7 - this.playerEntity.posY;
+ double var17 = var9 - this.playerEntity.posZ;
+ double var19 = var13 * var13 + var15 * var15 + var17 * var17;
+ if(var19 > 100.0D) {
+ logger.warning(this.playerEntity.username + " moved too quickly!");
+ this.kickPlayer("You moved too quickly :( (Hacking?)");
+ return;
+ }
+
+ float var21 = 1.0F / 16.0F;
+ boolean var22 = var2.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.boundingBox.copy().getInsetBoundingBox((double)var21, (double)var21, (double)var21)).size() == 0;
+ this.playerEntity.moveEntity(var13, var15, var17);
+ var13 = var5 - this.playerEntity.posX;
+ var15 = var7 - this.playerEntity.posY;
+ if(var15 > -0.5D || var15 < 0.5D) {
+ var15 = 0.0D;
+ }
+
+ var17 = var9 - this.playerEntity.posZ;
+ var19 = var13 * var13 + var15 * var15 + var17 * var17;
+ boolean var23 = false;
+ if(var19 > 1.0D / 16.0D && !this.playerEntity.func_22057_E()) {
+ var23 = true;
+ logger.warning(this.playerEntity.username + " moved wrongly!");
+ System.out.println("Got position " + var5 + ", " + var7 + ", " + var9);
+ System.out.println("Expected " + this.playerEntity.posX + ", " + this.playerEntity.posY + ", " + this.playerEntity.posZ);
+ }
+
+ this.playerEntity.setPositionAndRotation(var5, var7, var9, var11, var12);
+ boolean var24 = var2.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.boundingBox.copy().getInsetBoundingBox((double)var21, (double)var21, (double)var21)).size() == 0;
+ if(var22 && (var23 || !var24) && !this.playerEntity.func_22057_E()) {
+ this.teleportTo(this.lastPosX, this.lastPosY, this.lastPosZ, var11, var12);
+ return;
+ }
+
+ AxisAlignedBB var25 = this.playerEntity.boundingBox.copy().expand((double)var21, (double)var21, (double)var21).addCoord(0.0D, -0.55D, 0.0D);
+ if(!this.mcServer.allowFlight && !var2.func_27069_b(var25)) {
+ if(var15 >= -0.03125D) {
+ ++this.playerInAirTime;
+ if(this.playerInAirTime > 80) {
+ logger.warning(this.playerEntity.username + " was kicked for floating too long!");
+ this.kickPlayer("Flying is not enabled on this server");
+ return;
+ }
+ }
+ } else {
+ this.playerInAirTime = 0;
+ }
+
+ this.playerEntity.onGround = var1.onGround;
+ this.mcServer.configManager.func_613_b(this.playerEntity);
+ this.playerEntity.handleFalling(this.playerEntity.posY - var3, var1.onGround);
+ }
+
+ }
+
+ public void teleportTo(double var1, double var3, double var5, float var7, float var8) {
+ this.hasMoved = false;
+ this.lastPosX = var1;
+ this.lastPosY = var3;
+ this.lastPosZ = var5;
+ this.playerEntity.setPositionAndRotation(var1, var3, var5, var7, var8);
+ this.playerEntity.playerNetServerHandler.sendPacket(new Packet13PlayerLookMove(var1, var3 + (double)1.62F, var3, var5, var7, var8, false));
+ }
+
+ public void handleBlockDig(Packet14BlockDig var1) {
+ WorldServer var2 = this.mcServer.getWorldManager(this.playerEntity.dimension);
+ if(var1.status == 4) {
+ this.playerEntity.dropCurrentItem();
+ } else {
+ boolean var3 = var2.field_819_z = var2.worldProvider.worldType != 0 || this.mcServer.configManager.isOp(this.playerEntity.username);
+ boolean var4 = false;
+ if(var1.status == 0) {
+ var4 = true;
+ }
+
+ if(var1.status == 2) {
+ var4 = true;
+ }
+
+ int var5 = var1.xPosition;
+ int var6 = var1.yPosition;
+ int var7 = var1.zPosition;
+ if(var4) {
+ double var8 = this.playerEntity.posX - ((double)var5 + 0.5D);
+ double var10 = this.playerEntity.posY - ((double)var6 + 0.5D);
+ double var12 = this.playerEntity.posZ - ((double)var7 + 0.5D);
+ double var14 = var8 * var8 + var10 * var10 + var12 * var12;
+ if(var14 > 36.0D) {
+ return;
+ }
+ }
+
+ ChunkCoordinates var19 = var2.getSpawnPoint();
+ int var9 = (int)MathHelper.abs((float)(var5 - var19.posX));
+ int var20 = (int)MathHelper.abs((float)(var7 - var19.posZ));
+ if(var9 > var20) {
+ var20 = var9;
+ }
+
+ if(var1.status == 0) {
+ if(var20 <= 16 && !var3) {
+ this.playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(var5, var6, var7, var2));
+ } else {
+ this.playerEntity.itemInWorldManager.func_324_a(var5, var6, var7, var1.face);
+ }
+ } else if(var1.status == 2) {
+ this.playerEntity.itemInWorldManager.func_22045_b(var5, var6, var7);
+ if(var2.getBlockId(var5, var6, var7) != 0) {
+ this.playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(var5, var6, var7, var2));
+ }
+ } else if(var1.status == 3) {
+ double var11 = this.playerEntity.posX - ((double)var5 + 0.5D);
+ double var13 = this.playerEntity.posY - ((double)var6 + 0.5D);
+ double var15 = this.playerEntity.posZ - ((double)var7 + 0.5D);
+ double var17 = var11 * var11 + var13 * var13 + var15 * var15;
+ if(var17 < 256.0D) {
+ this.playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(var5, var6, var7, var2));
+ }
+ }
+
+ var2.field_819_z = false;
+ }
+ }
+
+ public void handlePlace(Packet15Place var1) {
+ WorldServer var2 = this.mcServer.getWorldManager(this.playerEntity.dimension);
+ ItemStack var3 = this.playerEntity.inventory.getCurrentItem();
+ boolean var4 = var2.field_819_z = var2.worldProvider.worldType != 0 || this.mcServer.configManager.isOp(this.playerEntity.username);
+ if(var1.direction == 255) {
+ if(var3 == null) {
+ return;
+ }
+
+ this.playerEntity.itemInWorldManager.func_6154_a(this.playerEntity, var2, var3);
+ } else {
+ int var5 = var1.xPosition;
+ int var6 = var1.yPosition;
+ int var7 = var1.zPosition;
+ int var8 = var1.direction;
+ ChunkCoordinates var9 = var2.getSpawnPoint();
+ int var10 = (int)MathHelper.abs((float)(var5 - var9.posX));
+ int var11 = (int)MathHelper.abs((float)(var7 - var9.posZ));
+ if(var10 > var11) {
+ var11 = var10;
+ }
+
+ if(this.hasMoved && this.playerEntity.getDistanceSq((double)var5 + 0.5D, (double)var6 + 0.5D, (double)var7 + 0.5D) < 64.0D && (var11 > 16 || var4)) {
+ this.playerEntity.itemInWorldManager.activeBlockOrUseItem(this.playerEntity, var2, var3, var5, var6, var7, var8);
+ }
+
+ this.playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(var5, var6, var7, var2));
+ if(var8 == 0) {
+ --var6;
+ }
+
+ if(var8 == 1) {
+ ++var6;
+ }
+
+ if(var8 == 2) {
+ --var7;
+ }
+
+ if(var8 == 3) {
+ ++var7;
+ }
+
+ if(var8 == 4) {
+ --var5;
+ }
+
+ if(var8 == 5) {
+ ++var5;
+ }
+
+ this.playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(var5, var6, var7, var2));
+ }
+
+ var3 = this.playerEntity.inventory.getCurrentItem();
+ if(var3 != null && var3.stackSize == 0) {
+ this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem] = null;
+ }
+
+ this.playerEntity.isChangingQuantityOnly = true;
+ this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem] = ItemStack.func_20117_a(this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem]);
+ Slot var12 = this.playerEntity.currentCraftingInventory.func_20127_a(this.playerEntity.inventory, this.playerEntity.inventory.currentItem);
+ this.playerEntity.currentCraftingInventory.updateCraftingMatrix();
+ this.playerEntity.isChangingQuantityOnly = false;
+ if(!ItemStack.areItemStacksEqual(this.playerEntity.inventory.getCurrentItem(), var1.itemStack)) {
+ this.sendPacket(new Packet103SetSlot(this.playerEntity.currentCraftingInventory.windowId, var12.id, this.playerEntity.inventory.getCurrentItem()));
+ }
+
+ var2.field_819_z = false;
+ }
+
+ public void handleErrorMessage(String var1, Object[] var2) {
+ logger.info(this.playerEntity.username + " lost connection: " + var1);
+ this.mcServer.configManager.sendPacketToAllPlayers(new Packet3Chat("\u00a7e" + this.playerEntity.username + " left the game."));
+ this.mcServer.configManager.playerLoggedOut(this.playerEntity);
+ this.connectionClosed = true;
+ }
+
+ public void registerPacket(Packet var1) {
+ logger.warning(this.getClass() + " wasn\'t prepared to deal with a " + var1.getClass());
+ this.kickPlayer("Protocol error, unexpected packet");
+ }
+
+ public void sendPacket(Packet var1) {
+ this.netManager.addToSendQueue(var1);
+ this.field_22004_g = this.field_15_f;
+ }
+
+ public void handleBlockItemSwitch(Packet16BlockItemSwitch var1) {
+ if(var1.id >= 0 && var1.id <= InventoryPlayer.func_25054_e()) {
+ this.playerEntity.inventory.currentItem = var1.id;
+ } else {
+ logger.warning(this.playerEntity.username + " tried to set an invalid carried item");
+ }
+ }
+
+ public void handleChat(Packet3Chat var1) {
+ String var2 = var1.message;
+ if(var2.length() > 100) {
+ this.kickPlayer("Chat message too long");
+ } else {
+ var2 = var2.trim();
+
+ for(int var3 = 0; var3 < var2.length(); ++var3) {
+ if(ChatAllowedCharacters.allowedCharacters.indexOf(var2.charAt(var3)) < 0) {
+ this.kickPlayer("Illegal characters in chat");
+ return;
+ }
+ }
+
+ if(var2.startsWith("/")) {
+ this.handleSlashCommand(var2);
+ } else {
+ var2 = "<" + this.playerEntity.username + "> " + var2;
+ logger.info(var2);
+ this.mcServer.configManager.sendPacketToAllPlayers(new Packet3Chat(var2));
+ }
+
+ }
+ }
+
+ private void handleSlashCommand(String var1) {
+ if(var1.toLowerCase().startsWith("/me ")) {
+ var1 = "* " + this.playerEntity.username + " " + var1.substring(var1.indexOf(" ")).trim();
+ logger.info(var1);
+ this.mcServer.configManager.sendPacketToAllPlayers(new Packet3Chat(var1));
+ } else if(var1.toLowerCase().startsWith("/kill")) {
+ this.playerEntity.attackEntityFrom((Entity)null, 1000);
+ } else if(var1.toLowerCase().startsWith("/tell ")) {
+ String[] var2 = var1.split(" ");
+ if(var2.length >= 3) {
+ var1 = var1.substring(var1.indexOf(" ")).trim();
+ var1 = var1.substring(var1.indexOf(" ")).trim();
+ var1 = "\u00a77" + this.playerEntity.username + " whispers " + var1;
+ logger.info(var1 + " to " + var2[1]);
+ if(!this.mcServer.configManager.sendPacketToPlayer(var2[1], new Packet3Chat(var1))) {
+ this.sendPacket(new Packet3Chat("\u00a7cThere\'s no player by that name online."));
+ }
+ }
+ } else {
+ String var3;
+ if(this.mcServer.configManager.isOp(this.playerEntity.username)) {
+ var3 = var1.substring(1);
+ logger.info(this.playerEntity.username + " issued server command: " + var3);
+ this.mcServer.addCommand(var3, this);
+ } else {
+ var3 = var1.substring(1);
+ logger.info(this.playerEntity.username + " tried command: " + var3);
+ }
+ }
+
+ }
+
+ public void handleArmAnimation(Packet18Animation var1) {
+ if(var1.animate == 1) {
+ this.playerEntity.swingItem();
+ }
+
+ }
+
+ public void func_21001_a(Packet19EntityAction var1) {
+ if(var1.state == 1) {
+ this.playerEntity.setSneaking(true);
+ } else if(var1.state == 2) {
+ this.playerEntity.setSneaking(false);
+ } else if(var1.state == 3) {
+ this.playerEntity.wakeUpPlayer(false, true, true);
+ this.hasMoved = false;
+ }
+
+ }
+
+ public void handleKickDisconnect(Packet255KickDisconnect var1) {
+ this.netManager.networkShutdown("disconnect.quitting", new Object[0]);
+ }
+
+ public int getNumChunkDataPackets() {
+ return this.netManager.getNumChunkDataPackets();
+ }
+
+ public void log(String var1) {
+ this.sendPacket(new Packet3Chat("\u00a77" + var1));
+ }
+
+ public String getUsername() {
+ return this.playerEntity.username;
+ }
+
+ public void func_6006_a(Packet7UseEntity var1) {
+ WorldServer var2 = this.mcServer.getWorldManager(this.playerEntity.dimension);
+ Entity var3 = var2.func_6158_a(var1.targetEntity);
+ if(var3 != null && this.playerEntity.canEntityBeSeen(var3) && this.playerEntity.getDistanceSqToEntity(var3) < 36.0D) {
+ if(var1.isLeftClick == 0) {
+ this.playerEntity.useCurrentItemOnEntity(var3);
+ } else if(var1.isLeftClick == 1) {
+ this.playerEntity.attackTargetEntityWithCurrentItem(var3);
+ }
+ }
+
+ }
+
+ public void handleRespawnPacket(Packet9Respawn var1) {
+ if(this.playerEntity.health <= 0) {
+ this.playerEntity = this.mcServer.configManager.recreatePlayerEntity(this.playerEntity, 0);
+ }
+ }
+
+ public void handleCraftingGuiClosedPacked(Packet101CloseWindow var1) {
+ this.playerEntity.closeCraftingGui();
+ }
+
+ public void func_20007_a(Packet102WindowClick var1) {
+ if(this.playerEntity.currentCraftingInventory.windowId == var1.window_Id && this.playerEntity.currentCraftingInventory.getCanCraft(this.playerEntity)) {
+ ItemStack var2 = this.playerEntity.currentCraftingInventory.func_27085_a(var1.inventorySlot, var1.mouseClick, var1.field_27039_f, this.playerEntity);
+ if(ItemStack.areItemStacksEqual(var1.itemStack, var2)) {
+ this.playerEntity.playerNetServerHandler.sendPacket(new Packet106Transaction(var1.window_Id, var1.action, true));
+ this.playerEntity.isChangingQuantityOnly = true;
+ this.playerEntity.currentCraftingInventory.updateCraftingMatrix();
+ this.playerEntity.updateHeldItem();
+ this.playerEntity.isChangingQuantityOnly = false;
+ } else {
+ this.field_10_k.put(Integer.valueOf(this.playerEntity.currentCraftingInventory.windowId), Short.valueOf(var1.action));
+ this.playerEntity.playerNetServerHandler.sendPacket(new Packet106Transaction(var1.window_Id, var1.action, false));
+ this.playerEntity.currentCraftingInventory.setCanCraft(this.playerEntity, false);
+ ArrayList var3 = new ArrayList();
+
+ for(int var4 = 0; var4 < this.playerEntity.currentCraftingInventory.inventorySlots.size(); ++var4) {
+ var3.add(((Slot)this.playerEntity.currentCraftingInventory.inventorySlots.get(var4)).getStack());
+ }
+
+ this.playerEntity.updateCraftingInventory(this.playerEntity.currentCraftingInventory, var3);
+ }
+ }
+
+ }
+
+ public void func_20008_a(Packet106Transaction var1) {
+ Short var2 = (Short)this.field_10_k.get(Integer.valueOf(this.playerEntity.currentCraftingInventory.windowId));
+ if(var2 != null && var1.shortWindowId == var2.shortValue() && this.playerEntity.currentCraftingInventory.windowId == var1.windowId && !this.playerEntity.currentCraftingInventory.getCanCraft(this.playerEntity)) {
+ this.playerEntity.currentCraftingInventory.setCanCraft(this.playerEntity, true);
+ }
+
+ }
+
+ public void handleUpdateSign(Packet130UpdateSign var1) {
+ WorldServer var2 = this.mcServer.getWorldManager(this.playerEntity.dimension);
+ if(var2.blockExists(var1.xPosition, var1.yPosition, var1.zPosition)) {
+ TileEntity var3 = var2.getBlockTileEntity(var1.xPosition, var1.yPosition, var1.zPosition);
+ if(var3 instanceof TileEntitySign) {
+ TileEntitySign var4 = (TileEntitySign)var3;
+ if(!var4.getIsEditAble()) {
+ this.mcServer.logWarning("Player " + this.playerEntity.username + " just tried to change non-editable sign");
+ return;
+ }
+ }
+
+ int var6;
+ int var9;
+ for(var9 = 0; var9 < 4; ++var9) {
+ boolean var5 = true;
+ if(var1.signLines[var9].length() > 15) {
+ var5 = false;
+ } else {
+ for(var6 = 0; var6 < var1.signLines[var9].length(); ++var6) {
+ if(ChatAllowedCharacters.allowedCharacters.indexOf(var1.signLines[var9].charAt(var6)) < 0) {
+ var5 = false;
+ }
+ }
+ }
+
+ if(!var5) {
+ var1.signLines[var9] = "!?";
+ }
+ }
+
+ if(var3 instanceof TileEntitySign) {
+ var9 = var1.xPosition;
+ int var10 = var1.yPosition;
+ var6 = var1.zPosition;
+ TileEntitySign var7 = (TileEntitySign)var3;
+
+ for(int var8 = 0; var8 < 4; ++var8) {
+ var7.signText[var8] = var1.signLines[var8];
+ }
+
+ var7.func_32001_a(false);
+ var7.onInventoryChanged();
+ var2.markBlockNeedsUpdate(var9, var10, var6);
+ }
+ }
+
+ }
+
+ public boolean isServerHandler() {
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/NetworkAcceptThread.java b/src/net/minecraft/src/NetworkAcceptThread.java
new file mode 100644
index 0000000..ae5748c
--- /dev/null
+++ b/src/net/minecraft/src/NetworkAcceptThread.java
@@ -0,0 +1,42 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.util.HashMap;
+import net.minecraft.server.MinecraftServer;
+
+class NetworkAcceptThread extends Thread {
+ final MinecraftServer mcServer;
+ final NetworkListenThread field_985_b;
+
+ NetworkAcceptThread(NetworkListenThread var1, String var2, MinecraftServer var3) {
+ super(var2);
+ this.field_985_b = var1;
+ this.mcServer = var3;
+ }
+
+ public void run() {
+ HashMap var1 = new HashMap();
+
+ while(this.field_985_b.field_973_b) {
+ try {
+ Socket var2 = NetworkListenThread.func_713_a(this.field_985_b).accept();
+ if(var2 != null) {
+ InetAddress var3 = var2.getInetAddress();
+ if(var1.containsKey(var3) && !"127.0.0.1".equals(var3.getHostAddress()) && System.currentTimeMillis() - ((Long)var1.get(var3)).longValue() < 5000L) {
+ var1.put(var3, Long.valueOf(System.currentTimeMillis()));
+ var2.close();
+ } else {
+ var1.put(var3, Long.valueOf(System.currentTimeMillis()));
+ NetLoginHandler var4 = new NetLoginHandler(this.mcServer, var2, "Connection #" + NetworkListenThread.func_712_b(this.field_985_b));
+ NetworkListenThread.func_716_a(this.field_985_b, var4);
+ }
+ }
+ } catch (IOException var5) {
+ var5.printStackTrace();
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/NetworkListenThread.java b/src/net/minecraft/src/NetworkListenThread.java
new file mode 100644
index 0000000..7b05f39
--- /dev/null
+++ b/src/net/minecraft/src/NetworkListenThread.java
@@ -0,0 +1,91 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.minecraft.server.MinecraftServer;
+
+public class NetworkListenThread {
+ public static Logger logger = Logger.getLogger("Minecraft");
+ private ServerSocket serverSocket;
+ private Thread networkAcceptThread;
+ public volatile boolean field_973_b = false;
+ private int field_977_f = 0;
+ private ArrayList pendingConnections = new ArrayList();
+ private ArrayList playerList = new ArrayList();
+ public MinecraftServer mcServer;
+
+ public NetworkListenThread(MinecraftServer var1, InetAddress var2, int var3) throws IOException {
+ this.mcServer = var1;
+ this.serverSocket = new ServerSocket(var3, 0, var2);
+ this.serverSocket.setPerformancePreferences(0, 2, 1);
+ this.field_973_b = true;
+ this.networkAcceptThread = new NetworkAcceptThread(this, "Listen thread", var1);
+ this.networkAcceptThread.start();
+ }
+
+ public void addPlayer(NetServerHandler var1) {
+ this.playerList.add(var1);
+ }
+
+ private void addPendingConnection(NetLoginHandler var1) {
+ if(var1 == null) {
+ throw new IllegalArgumentException("Got null pendingconnection!");
+ } else {
+ this.pendingConnections.add(var1);
+ }
+ }
+
+ public void handleNetworkListenThread() {
+ int var1;
+ for(var1 = 0; var1 < this.pendingConnections.size(); ++var1) {
+ NetLoginHandler var2 = (NetLoginHandler)this.pendingConnections.get(var1);
+
+ try {
+ var2.tryLogin();
+ } catch (Exception var5) {
+ var2.kickUser("Internal server error");
+ logger.log(Level.WARNING, "Failed to handle packet: " + var5, var5);
+ }
+
+ if(var2.finishedProcessing) {
+ this.pendingConnections.remove(var1--);
+ }
+
+ var2.netManager.func_28138_a();
+ }
+
+ for(var1 = 0; var1 < this.playerList.size(); ++var1) {
+ NetServerHandler var6 = (NetServerHandler)this.playerList.get(var1);
+
+ try {
+ var6.handlePackets();
+ } catch (Exception var4) {
+ logger.log(Level.WARNING, "Failed to handle packet: " + var4, var4);
+ var6.kickPlayer("Internal server error");
+ }
+
+ if(var6.connectionClosed) {
+ this.playerList.remove(var1--);
+ }
+
+ var6.netManager.func_28138_a();
+ }
+
+ }
+
+ static ServerSocket func_713_a(NetworkListenThread var0) {
+ return var0.serverSocket;
+ }
+
+ static int func_712_b(NetworkListenThread var0) {
+ return var0.field_977_f++;
+ }
+
+ static void func_716_a(NetworkListenThread var0, NetLoginHandler var1) {
+ var0.addPendingConnection(var1);
+ }
+}
diff --git a/src/net/minecraft/src/NetworkManager.java b/src/net/minecraft/src/NetworkManager.java
new file mode 100644
index 0000000..f01a40e
--- /dev/null
+++ b/src/net/minecraft/src/NetworkManager.java
@@ -0,0 +1,268 @@
+package net.minecraft.src;
+
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.SocketException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class NetworkManager {
+ public static final Object threadSyncObject = new Object();
+ public static int numReadThreads;
+ public static int numWriteThreads;
+ private Object sendQueueLock = new Object();
+ private Socket networkSocket;
+ private final SocketAddress remoteSocketAddress;
+ private DataInputStream socketInputStream;
+ private DataOutputStream socketOutputStream;
+ private boolean isRunning = true;
+ private List readPackets = Collections.synchronizedList(new ArrayList());
+ private List dataPackets = Collections.synchronizedList(new ArrayList());
+ private List chunkDataPackets = Collections.synchronizedList(new ArrayList());
+ private NetHandler netHandler;
+ private boolean isServerTerminating = false;
+ private Thread writeThread;
+ private Thread readThread;
+ private boolean isTerminating = false;
+ private String terminationReason = "";
+ private Object[] field_20176_t;
+ private int timeSinceLastRead = 0;
+ private int sendQueueByteLength = 0;
+ public static int[] field_28141_d = new int[256];
+ public static int[] field_28140_e = new int[256];
+ public int chunkDataSendCounter = 0;
+ private int field_20175_w = 50;
+
+ public NetworkManager(Socket var1, String var2, NetHandler var3) throws IOException {
+ this.networkSocket = var1;
+ this.remoteSocketAddress = var1.getRemoteSocketAddress();
+ this.netHandler = var3;
+
+ try {
+ var1.setSoTimeout(30000);
+ var1.setTrafficClass(24);
+ } catch (SocketException var5) {
+ System.err.println(var5.getMessage());
+ }
+
+ this.socketInputStream = new DataInputStream(var1.getInputStream());
+ this.socketOutputStream = new DataOutputStream(new BufferedOutputStream(var1.getOutputStream(), 5120));
+ this.readThread = new NetworkReaderThread(this, var2 + " read thread");
+ this.writeThread = new NetworkWriterThread(this, var2 + " write thread");
+ this.readThread.start();
+ this.writeThread.start();
+ }
+
+ public void setNetHandler(NetHandler var1) {
+ this.netHandler = var1;
+ }
+
+ public void addToSendQueue(Packet var1) {
+ if(!this.isServerTerminating) {
+ Object var2 = this.sendQueueLock;
+ synchronized(var2) {
+ this.sendQueueByteLength += var1.getPacketSize() + 1;
+ if(var1.isChunkDataPacket) {
+ this.chunkDataPackets.add(var1);
+ } else {
+ this.dataPackets.add(var1);
+ }
+
+ }
+ }
+ }
+
+ private boolean sendPacket() {
+ boolean var1 = false;
+
+ try {
+ int[] var10000;
+ int var10001;
+ Packet var2;
+ Object var3;
+ if(!this.dataPackets.isEmpty() && (this.chunkDataSendCounter == 0 || System.currentTimeMillis() - ((Packet)this.dataPackets.get(0)).creationTimeMillis >= (long)this.chunkDataSendCounter)) {
+ var3 = this.sendQueueLock;
+ synchronized(var3) {
+ var2 = (Packet)this.dataPackets.remove(0);
+ this.sendQueueByteLength -= var2.getPacketSize() + 1;
+ }
+
+ Packet.writePacket(var2, this.socketOutputStream);
+ var10000 = field_28140_e;
+ var10001 = var2.getPacketId();
+ var10000[var10001] += var2.getPacketSize() + 1;
+ var1 = true;
+ }
+
+ if(this.field_20175_w-- <= 0 && !this.chunkDataPackets.isEmpty() && (this.chunkDataSendCounter == 0 || System.currentTimeMillis() - ((Packet)this.chunkDataPackets.get(0)).creationTimeMillis >= (long)this.chunkDataSendCounter)) {
+ var3 = this.sendQueueLock;
+ synchronized(var3) {
+ var2 = (Packet)this.chunkDataPackets.remove(0);
+ this.sendQueueByteLength -= var2.getPacketSize() + 1;
+ }
+
+ Packet.writePacket(var2, this.socketOutputStream);
+ var10000 = field_28140_e;
+ var10001 = var2.getPacketId();
+ var10000[var10001] += var2.getPacketSize() + 1;
+ this.field_20175_w = 0;
+ var1 = true;
+ }
+
+ return var1;
+ } catch (Exception var8) {
+ if(!this.isTerminating) {
+ this.onNetworkError(var8);
+ }
+
+ return false;
+ }
+ }
+
+ public void func_28138_a() {
+ this.readThread.interrupt();
+ this.writeThread.interrupt();
+ }
+
+ private boolean readPacket() {
+ boolean var1 = false;
+
+ try {
+ Packet var2 = Packet.readPacket(this.socketInputStream, this.netHandler.isServerHandler());
+ if(var2 != null) {
+ int[] var10000 = field_28141_d;
+ int var10001 = var2.getPacketId();
+ var10000[var10001] += var2.getPacketSize() + 1;
+ this.readPackets.add(var2);
+ var1 = true;
+ } else {
+ this.networkShutdown("disconnect.endOfStream", new Object[0]);
+ }
+
+ return var1;
+ } catch (Exception var3) {
+ if(!this.isTerminating) {
+ this.onNetworkError(var3);
+ }
+
+ return false;
+ }
+ }
+
+ private void onNetworkError(Exception var1) {
+ var1.printStackTrace();
+ this.networkShutdown("disconnect.genericReason", new Object[]{"Internal exception: " + var1.toString()});
+ }
+
+ public void networkShutdown(String var1, Object... var2) {
+ if(this.isRunning) {
+ this.isTerminating = true;
+ this.terminationReason = var1;
+ this.field_20176_t = var2;
+ (new NetworkMasterThread(this)).start();
+ this.isRunning = false;
+
+ try {
+ this.socketInputStream.close();
+ this.socketInputStream = null;
+ } catch (Throwable var6) {
+ }
+
+ try {
+ this.socketOutputStream.close();
+ this.socketOutputStream = null;
+ } catch (Throwable var5) {
+ }
+
+ try {
+ this.networkSocket.close();
+ this.networkSocket = null;
+ } catch (Throwable var4) {
+ }
+
+ }
+ }
+
+ public void processReadPackets() {
+ if(this.sendQueueByteLength > 1048576) {
+ this.networkShutdown("disconnect.overflow", new Object[0]);
+ }
+
+ if(this.readPackets.isEmpty()) {
+ if(this.timeSinceLastRead++ == 1200) {
+ this.networkShutdown("disconnect.timeout", new Object[0]);
+ }
+ } else {
+ this.timeSinceLastRead = 0;
+ }
+
+ int var1 = 100;
+
+ while(!this.readPackets.isEmpty() && var1-- >= 0) {
+ Packet var2 = (Packet)this.readPackets.remove(0);
+ var2.processPacket(this.netHandler);
+ }
+
+ this.func_28138_a();
+ if(this.isTerminating && this.readPackets.isEmpty()) {
+ this.netHandler.handleErrorMessage(this.terminationReason, this.field_20176_t);
+ }
+
+ }
+
+ public SocketAddress getRemoteAddress() {
+ return this.remoteSocketAddress;
+ }
+
+ public void serverShutdown() {
+ this.func_28138_a();
+ this.isServerTerminating = true;
+ this.readThread.interrupt();
+ (new ThreadMonitorConnection(this)).start();
+ }
+
+ public int getNumChunkDataPackets() {
+ return this.chunkDataPackets.size();
+ }
+
+ static boolean isRunning(NetworkManager var0) {
+ return var0.isRunning;
+ }
+
+ static boolean isServerTerminating(NetworkManager var0) {
+ return var0.isServerTerminating;
+ }
+
+ static boolean readNetworkPacket(NetworkManager var0) {
+ return var0.readPacket();
+ }
+
+ static boolean sendNetworkPacket(NetworkManager var0) {
+ return var0.sendPacket();
+ }
+
+ static DataOutputStream func_28136_f(NetworkManager var0) {
+ return var0.socketOutputStream;
+ }
+
+ static boolean func_28135_e(NetworkManager var0) {
+ return var0.isTerminating;
+ }
+
+ static void func_30007_a(NetworkManager var0, Exception var1) {
+ var0.onNetworkError(var1);
+ }
+
+ static Thread getReadThread(NetworkManager var0) {
+ return var0.readThread;
+ }
+
+ static Thread getWriteThread(NetworkManager var0) {
+ return var0.writeThread;
+ }
+}
diff --git a/src/net/minecraft/src/NetworkMasterThread.java b/src/net/minecraft/src/NetworkMasterThread.java
new file mode 100644
index 0000000..1ffb183
--- /dev/null
+++ b/src/net/minecraft/src/NetworkMasterThread.java
@@ -0,0 +1,31 @@
+package net.minecraft.src;
+
+class NetworkMasterThread extends Thread {
+ final NetworkManager netManager;
+
+ NetworkMasterThread(NetworkManager var1) {
+ this.netManager = var1;
+ }
+
+ public void run() {
+ try {
+ Thread.sleep(5000L);
+ if(NetworkManager.getReadThread(this.netManager).isAlive()) {
+ try {
+ NetworkManager.getReadThread(this.netManager).stop();
+ } catch (Throwable var3) {
+ }
+ }
+
+ if(NetworkManager.getWriteThread(this.netManager).isAlive()) {
+ try {
+ NetworkManager.getWriteThread(this.netManager).stop();
+ } catch (Throwable var2) {
+ }
+ }
+ } catch (InterruptedException var4) {
+ var4.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/NetworkReaderThread.java b/src/net/minecraft/src/NetworkReaderThread.java
new file mode 100644
index 0000000..b2ee8ee
--- /dev/null
+++ b/src/net/minecraft/src/NetworkReaderThread.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+class NetworkReaderThread extends Thread {
+ final NetworkManager netManager;
+
+ NetworkReaderThread(NetworkManager var1, String var2) {
+ super(var2);
+ this.netManager = var1;
+ }
+
+ public void run() {
+ Object var1 = NetworkManager.threadSyncObject;
+ synchronized(var1) {
+ ++NetworkManager.numReadThreads;
+ }
+
+ while(true) {
+ boolean var12 = false;
+
+ try {
+ var12 = true;
+ if(!NetworkManager.isRunning(this.netManager)) {
+ var12 = false;
+ break;
+ }
+
+ if(NetworkManager.isServerTerminating(this.netManager)) {
+ var12 = false;
+ break;
+ }
+
+ while(NetworkManager.readNetworkPacket(this.netManager)) {
+ }
+
+ try {
+ sleep(100L);
+ } catch (InterruptedException var15) {
+ }
+ } finally {
+ if(var12) {
+ Object var5 = NetworkManager.threadSyncObject;
+ synchronized(var5) {
+ --NetworkManager.numReadThreads;
+ }
+ }
+ }
+ }
+
+ var1 = NetworkManager.threadSyncObject;
+ synchronized(var1) {
+ --NetworkManager.numReadThreads;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/NetworkWriterThread.java b/src/net/minecraft/src/NetworkWriterThread.java
new file mode 100644
index 0000000..23b02b7
--- /dev/null
+++ b/src/net/minecraft/src/NetworkWriterThread.java
@@ -0,0 +1,63 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+
+class NetworkWriterThread extends Thread {
+ final NetworkManager netManager;
+
+ NetworkWriterThread(NetworkManager var1, String var2) {
+ super(var2);
+ this.netManager = var1;
+ }
+
+ public void run() {
+ Object var1 = NetworkManager.threadSyncObject;
+ synchronized(var1) {
+ ++NetworkManager.numWriteThreads;
+ }
+
+ while(true) {
+ boolean var13 = false;
+
+ try {
+ var13 = true;
+ if(!NetworkManager.isRunning(this.netManager)) {
+ var13 = false;
+ break;
+ }
+
+ while(NetworkManager.sendNetworkPacket(this.netManager)) {
+ }
+
+ try {
+ sleep(100L);
+ } catch (InterruptedException var16) {
+ }
+
+ try {
+ if(NetworkManager.func_28136_f(this.netManager) != null) {
+ NetworkManager.func_28136_f(this.netManager).flush();
+ }
+ } catch (IOException var18) {
+ if(!NetworkManager.func_28135_e(this.netManager)) {
+ NetworkManager.func_30007_a(this.netManager, var18);
+ }
+
+ var18.printStackTrace();
+ }
+ } finally {
+ if(var13) {
+ Object var5 = NetworkManager.threadSyncObject;
+ synchronized(var5) {
+ --NetworkManager.numWriteThreads;
+ }
+ }
+ }
+ }
+
+ var1 = NetworkManager.threadSyncObject;
+ synchronized(var1) {
+ --NetworkManager.numWriteThreads;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/NextTickListEntry.java b/src/net/minecraft/src/NextTickListEntry.java
new file mode 100644
index 0000000..c7638e9
--- /dev/null
+++ b/src/net/minecraft/src/NextTickListEntry.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+public class NextTickListEntry implements Comparable {
+ private static long nextTickEntryID = 0L;
+ public int xCoord;
+ public int yCoord;
+ public int zCoord;
+ public int blockID;
+ public long scheduledTime;
+ private long tickEntryID = nextTickEntryID++;
+
+ public NextTickListEntry(int var1, int var2, int var3, int var4) {
+ this.xCoord = var1;
+ this.yCoord = var2;
+ this.zCoord = var3;
+ this.blockID = var4;
+ }
+
+ public boolean equals(Object var1) {
+ if(!(var1 instanceof NextTickListEntry)) {
+ return false;
+ } else {
+ NextTickListEntry var2 = (NextTickListEntry)var1;
+ return this.xCoord == var2.xCoord && this.yCoord == var2.yCoord && this.zCoord == var2.zCoord && this.blockID == var2.blockID;
+ }
+ }
+
+ public int hashCode() {
+ return (this.xCoord * 128 * 1024 + this.zCoord * 128 + this.yCoord) * 256 + this.blockID;
+ }
+
+ public NextTickListEntry setScheduledTime(long var1) {
+ this.scheduledTime = var1;
+ return this;
+ }
+
+ public int comparer(NextTickListEntry var1) {
+ return this.scheduledTime < var1.scheduledTime ? -1 : (this.scheduledTime > var1.scheduledTime ? 1 : (this.tickEntryID < var1.tickEntryID ? -1 : (this.tickEntryID > var1.tickEntryID ? 1 : 0)));
+ }
+
+ public int compareTo(Object var1) {
+ return this.comparer((NextTickListEntry)var1);
+ }
+}
diff --git a/src/net/minecraft/src/NibbleArray.java b/src/net/minecraft/src/NibbleArray.java
new file mode 100644
index 0000000..28a1f67
--- /dev/null
+++ b/src/net/minecraft/src/NibbleArray.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+public class NibbleArray {
+ public final byte[] data;
+
+ public NibbleArray(int var1) {
+ this.data = new byte[var1 >> 1];
+ }
+
+ public NibbleArray(byte[] var1) {
+ this.data = var1;
+ }
+
+ public int getNibble(int var1, int var2, int var3) {
+ int var4 = var1 << 11 | var3 << 7 | var2;
+ int var5 = var4 >> 1;
+ int var6 = var4 & 1;
+ return var6 == 0 ? this.data[var5] & 15 : this.data[var5] >> 4 & 15;
+ }
+
+ public void setNibble(int var1, int var2, int var3, int var4) {
+ int var5 = var1 << 11 | var3 << 7 | var2;
+ int var6 = var5 >> 1;
+ int var7 = var5 & 1;
+ if(var7 == 0) {
+ this.data[var6] = (byte)(this.data[var6] & 240 | var4 & 15);
+ } else {
+ this.data[var6] = (byte)(this.data[var6] & 15 | (var4 & 15) << 4);
+ }
+
+ }
+
+ public boolean isValid() {
+ return this.data != null;
+ }
+}
diff --git a/src/net/minecraft/src/NoiseGenerator.java b/src/net/minecraft/src/NoiseGenerator.java
new file mode 100644
index 0000000..53e6d05
--- /dev/null
+++ b/src/net/minecraft/src/NoiseGenerator.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public abstract class NoiseGenerator {
+}
diff --git a/src/net/minecraft/src/NoiseGenerator2.java b/src/net/minecraft/src/NoiseGenerator2.java
new file mode 100644
index 0000000..d4a35c5
--- /dev/null
+++ b/src/net/minecraft/src/NoiseGenerator2.java
@@ -0,0 +1,114 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class NoiseGenerator2 {
+ private static int[][] field_4317_d = new int[][]{{1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1}};
+ private int[] field_4316_e;
+ public double field_4313_a;
+ public double field_4312_b;
+ public double field_4318_c;
+ private static final double field_4315_f = 0.5D * (Math.sqrt(3.0D) - 1.0D);
+ private static final double field_4314_g = (3.0D - Math.sqrt(3.0D)) / 6.0D;
+
+ public NoiseGenerator2() {
+ this(new Random());
+ }
+
+ public NoiseGenerator2(Random var1) {
+ this.field_4316_e = new int[512];
+ this.field_4313_a = var1.nextDouble() * 256.0D;
+ this.field_4312_b = var1.nextDouble() * 256.0D;
+ this.field_4318_c = var1.nextDouble() * 256.0D;
+
+ int var2;
+ for(var2 = 0; var2 < 256; this.field_4316_e[var2] = var2++) {
+ }
+
+ for(var2 = 0; var2 < 256; ++var2) {
+ int var3 = var1.nextInt(256 - var2) + var2;
+ int var4 = this.field_4316_e[var2];
+ this.field_4316_e[var2] = this.field_4316_e[var3];
+ this.field_4316_e[var3] = var4;
+ this.field_4316_e[var2 + 256] = this.field_4316_e[var2];
+ }
+
+ }
+
+ private static int wrap(double var0) {
+ return var0 > 0.0D ? (int)var0 : (int)var0 - 1;
+ }
+
+ private static double func_4114_a(int[] var0, double var1, double var3) {
+ return (double)var0[0] * var1 + (double)var0[1] * var3;
+ }
+
+ public void func_4115_a(double[] var1, double var2, double var4, int var6, int var7, double var8, double var10, double var12) {
+ int var14 = 0;
+
+ for(int var15 = 0; var15 < var6; ++var15) {
+ double var16 = (var2 + (double)var15) * var8 + this.field_4313_a;
+
+ for(int var18 = 0; var18 < var7; ++var18) {
+ double var19 = (var4 + (double)var18) * var10 + this.field_4312_b;
+ double var27 = (var16 + var19) * field_4315_f;
+ int var29 = wrap(var16 + var27);
+ int var30 = wrap(var19 + var27);
+ double var31 = (double)(var29 + var30) * field_4314_g;
+ double var33 = (double)var29 - var31;
+ double var35 = (double)var30 - var31;
+ double var37 = var16 - var33;
+ double var39 = var19 - var35;
+ byte var41;
+ byte var42;
+ if(var37 > var39) {
+ var41 = 1;
+ var42 = 0;
+ } else {
+ var41 = 0;
+ var42 = 1;
+ }
+
+ double var43 = var37 - (double)var41 + field_4314_g;
+ double var45 = var39 - (double)var42 + field_4314_g;
+ double var47 = var37 - 1.0D + 2.0D * field_4314_g;
+ double var49 = var39 - 1.0D + 2.0D * field_4314_g;
+ int var51 = var29 & 255;
+ int var52 = var30 & 255;
+ int var53 = this.field_4316_e[var51 + this.field_4316_e[var52]] % 12;
+ int var54 = this.field_4316_e[var51 + var41 + this.field_4316_e[var52 + var42]] % 12;
+ int var55 = this.field_4316_e[var51 + 1 + this.field_4316_e[var52 + 1]] % 12;
+ double var56 = 0.5D - var37 * var37 - var39 * var39;
+ double var21;
+ if(var56 < 0.0D) {
+ var21 = 0.0D;
+ } else {
+ var56 *= var56;
+ var21 = var56 * var56 * func_4114_a(field_4317_d[var53], var37, var39);
+ }
+
+ double var58 = 0.5D - var43 * var43 - var45 * var45;
+ double var23;
+ if(var58 < 0.0D) {
+ var23 = 0.0D;
+ } else {
+ var58 *= var58;
+ var23 = var58 * var58 * func_4114_a(field_4317_d[var54], var43, var45);
+ }
+
+ double var60 = 0.5D - var47 * var47 - var49 * var49;
+ double var25;
+ if(var60 < 0.0D) {
+ var25 = 0.0D;
+ } else {
+ var60 *= var60;
+ var25 = var60 * var60 * func_4114_a(field_4317_d[var55], var47, var49);
+ }
+
+ int var10001 = var14++;
+ var1[var10001] += 70.0D * (var21 + var23 + var25) * var12;
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/NoiseGeneratorOctaves.java b/src/net/minecraft/src/NoiseGeneratorOctaves.java
new file mode 100644
index 0000000..6aa9c06
--- /dev/null
+++ b/src/net/minecraft/src/NoiseGeneratorOctaves.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class NoiseGeneratorOctaves extends NoiseGenerator {
+ private NoiseGeneratorPerlin[] generatorCollection;
+ private int field_938_b;
+
+ public NoiseGeneratorOctaves(Random var1, int var2) {
+ this.field_938_b = var2;
+ this.generatorCollection = new NoiseGeneratorPerlin[var2];
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ this.generatorCollection[var3] = new NoiseGeneratorPerlin(var1);
+ }
+
+ }
+
+ public double func_647_a(double var1, double var3) {
+ double var5 = 0.0D;
+ double var7 = 1.0D;
+
+ for(int var9 = 0; var9 < this.field_938_b; ++var9) {
+ var5 += this.generatorCollection[var9].func_642_a(var1 * var7, var3 * var7) / var7;
+ var7 /= 2.0D;
+ }
+
+ return var5;
+ }
+
+ public double[] generateNoiseOctaves(double[] var1, double var2, double var4, double var6, int var8, int var9, int var10, double var11, double var13, double var15) {
+ if(var1 == null) {
+ var1 = new double[var8 * var9 * var10];
+ } else {
+ for(int var17 = 0; var17 < var1.length; ++var17) {
+ var1[var17] = 0.0D;
+ }
+ }
+
+ double var20 = 1.0D;
+
+ for(int var19 = 0; var19 < this.field_938_b; ++var19) {
+ this.generatorCollection[var19].func_646_a(var1, var2, var4, var6, var8, var9, var10, var11 * var20, var13 * var20, var15 * var20, var20);
+ var20 /= 2.0D;
+ }
+
+ return var1;
+ }
+
+ public double[] func_4103_a(double[] var1, int var2, int var3, int var4, int var5, double var6, double var8, double var10) {
+ return this.generateNoiseOctaves(var1, (double)var2, 10.0D, (double)var3, var4, 1, var5, var6, 1.0D, var8);
+ }
+}
diff --git a/src/net/minecraft/src/NoiseGeneratorOctaves2.java b/src/net/minecraft/src/NoiseGeneratorOctaves2.java
new file mode 100644
index 0000000..445671e
--- /dev/null
+++ b/src/net/minecraft/src/NoiseGeneratorOctaves2.java
@@ -0,0 +1,45 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class NoiseGeneratorOctaves2 extends NoiseGenerator {
+ private NoiseGenerator2[] field_4308_a;
+ private int field_4307_b;
+
+ public NoiseGeneratorOctaves2(Random var1, int var2) {
+ this.field_4307_b = var2;
+ this.field_4308_a = new NoiseGenerator2[var2];
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ this.field_4308_a[var3] = new NoiseGenerator2(var1);
+ }
+
+ }
+
+ public double[] func_4101_a(double[] var1, double var2, double var4, int var6, int var7, double var8, double var10, double var12) {
+ return this.func_4100_a(var1, var2, var4, var6, var7, var8, var10, var12, 0.5D);
+ }
+
+ public double[] func_4100_a(double[] var1, double var2, double var4, int var6, int var7, double var8, double var10, double var12, double var14) {
+ var8 /= 1.5D;
+ var10 /= 1.5D;
+ if(var1 != null && var1.length >= var6 * var7) {
+ for(int var16 = 0; var16 < var1.length; ++var16) {
+ var1[var16] = 0.0D;
+ }
+ } else {
+ var1 = new double[var6 * var7];
+ }
+
+ double var21 = 1.0D;
+ double var18 = 1.0D;
+
+ for(int var20 = 0; var20 < this.field_4307_b; ++var20) {
+ this.field_4308_a[var20].func_4115_a(var1, var2, var4, var6, var7, var8 * var18, var10 * var18, 0.55D / var21);
+ var18 *= var12;
+ var21 *= var14;
+ }
+
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/NoiseGeneratorPerlin.java b/src/net/minecraft/src/NoiseGeneratorPerlin.java
new file mode 100644
index 0000000..855e3bf
--- /dev/null
+++ b/src/net/minecraft/src/NoiseGeneratorPerlin.java
@@ -0,0 +1,221 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class NoiseGeneratorPerlin extends NoiseGenerator {
+ private int[] permutations;
+ public double xCoord;
+ public double yCoord;
+ public double zCoord;
+
+ public NoiseGeneratorPerlin() {
+ this(new Random());
+ }
+
+ public NoiseGeneratorPerlin(Random var1) {
+ this.permutations = new int[512];
+ this.xCoord = var1.nextDouble() * 256.0D;
+ this.yCoord = var1.nextDouble() * 256.0D;
+ this.zCoord = var1.nextDouble() * 256.0D;
+
+ int var2;
+ for(var2 = 0; var2 < 256; this.permutations[var2] = var2++) {
+ }
+
+ for(var2 = 0; var2 < 256; ++var2) {
+ int var3 = var1.nextInt(256 - var2) + var2;
+ int var4 = this.permutations[var2];
+ this.permutations[var2] = this.permutations[var3];
+ this.permutations[var3] = var4;
+ this.permutations[var2 + 256] = this.permutations[var2];
+ }
+
+ }
+
+ public double generateNoise(double var1, double var3, double var5) {
+ double var7 = var1 + this.xCoord;
+ double var9 = var3 + this.yCoord;
+ double var11 = var5 + this.zCoord;
+ int var13 = (int)var7;
+ int var14 = (int)var9;
+ int var15 = (int)var11;
+ if(var7 < (double)var13) {
+ --var13;
+ }
+
+ if(var9 < (double)var14) {
+ --var14;
+ }
+
+ if(var11 < (double)var15) {
+ --var15;
+ }
+
+ int var16 = var13 & 255;
+ int var17 = var14 & 255;
+ int var18 = var15 & 255;
+ var7 -= (double)var13;
+ var9 -= (double)var14;
+ var11 -= (double)var15;
+ double var19 = var7 * var7 * var7 * (var7 * (var7 * 6.0D - 15.0D) + 10.0D);
+ double var21 = var9 * var9 * var9 * (var9 * (var9 * 6.0D - 15.0D) + 10.0D);
+ double var23 = var11 * var11 * var11 * (var11 * (var11 * 6.0D - 15.0D) + 10.0D);
+ int var25 = this.permutations[var16] + var17;
+ int var26 = this.permutations[var25] + var18;
+ int var27 = this.permutations[var25 + 1] + var18;
+ int var28 = this.permutations[var16 + 1] + var17;
+ int var29 = this.permutations[var28] + var18;
+ int var30 = this.permutations[var28 + 1] + var18;
+ return this.lerp(var23, this.lerp(var21, this.lerp(var19, this.grad(this.permutations[var26], var7, var9, var11), this.grad(this.permutations[var29], var7 - 1.0D, var9, var11)), this.lerp(var19, this.grad(this.permutations[var27], var7, var9 - 1.0D, var11), this.grad(this.permutations[var30], var7 - 1.0D, var9 - 1.0D, var11))), this.lerp(var21, this.lerp(var19, this.grad(this.permutations[var26 + 1], var7, var9, var11 - 1.0D), this.grad(this.permutations[var29 + 1], var7 - 1.0D, var9, var11 - 1.0D)), this.lerp(var19, this.grad(this.permutations[var27 + 1], var7, var9 - 1.0D, var11 - 1.0D), this.grad(this.permutations[var30 + 1], var7 - 1.0D, var9 - 1.0D, var11 - 1.0D))));
+ }
+
+ public final double lerp(double var1, double var3, double var5) {
+ return var3 + var1 * (var5 - var3);
+ }
+
+ public final double func_4102_a(int var1, double var2, double var4) {
+ int var6 = var1 & 15;
+ double var7 = (double)(1 - ((var6 & 8) >> 3)) * var2;
+ double var9 = var6 < 4 ? 0.0D : (var6 != 12 && var6 != 14 ? var4 : var2);
+ return ((var6 & 1) == 0 ? var7 : -var7) + ((var6 & 2) == 0 ? var9 : -var9);
+ }
+
+ public final double grad(int var1, double var2, double var4, double var6) {
+ int var8 = var1 & 15;
+ double var9 = var8 < 8 ? var2 : var4;
+ double var11 = var8 < 4 ? var4 : (var8 != 12 && var8 != 14 ? var6 : var2);
+ return ((var8 & 1) == 0 ? var9 : -var9) + ((var8 & 2) == 0 ? var11 : -var11);
+ }
+
+ public double func_642_a(double var1, double var3) {
+ return this.generateNoise(var1, var3, 0.0D);
+ }
+
+ public void func_646_a(double[] var1, double var2, double var4, double var6, int var8, int var9, int var10, double var11, double var13, double var15, double var17) {
+ int var10001;
+ int var19;
+ int var22;
+ double var31;
+ double var35;
+ int var37;
+ double var38;
+ int var40;
+ int var41;
+ double var42;
+ int var75;
+ if(var9 == 1) {
+ boolean var64 = false;
+ boolean var65 = false;
+ boolean var21 = false;
+ boolean var68 = false;
+ double var70 = 0.0D;
+ double var73 = 0.0D;
+ var75 = 0;
+ double var77 = 1.0D / var17;
+
+ for(int var30 = 0; var30 < var8; ++var30) {
+ var31 = (var2 + (double)var30) * var11 + this.xCoord;
+ int var78 = (int)var31;
+ if(var31 < (double)var78) {
+ --var78;
+ }
+
+ int var34 = var78 & 255;
+ var31 -= (double)var78;
+ var35 = var31 * var31 * var31 * (var31 * (var31 * 6.0D - 15.0D) + 10.0D);
+
+ for(var37 = 0; var37 < var10; ++var37) {
+ var38 = (var6 + (double)var37) * var15 + this.zCoord;
+ var40 = (int)var38;
+ if(var38 < (double)var40) {
+ --var40;
+ }
+
+ var41 = var40 & 255;
+ var38 -= (double)var40;
+ var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D);
+ var19 = this.permutations[var34] + 0;
+ int var66 = this.permutations[var19] + var41;
+ int var67 = this.permutations[var34 + 1] + 0;
+ var22 = this.permutations[var67] + var41;
+ var70 = this.lerp(var35, this.func_4102_a(this.permutations[var66], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38));
+ var73 = this.lerp(var35, this.grad(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D));
+ double var79 = this.lerp(var42, var70, var73);
+ var10001 = var75++;
+ var1[var10001] += var79 * var77;
+ }
+ }
+
+ } else {
+ var19 = 0;
+ double var20 = 1.0D / var17;
+ var22 = -1;
+ boolean var23 = false;
+ boolean var24 = false;
+ boolean var25 = false;
+ boolean var26 = false;
+ boolean var27 = false;
+ boolean var28 = false;
+ double var29 = 0.0D;
+ var31 = 0.0D;
+ double var33 = 0.0D;
+ var35 = 0.0D;
+
+ for(var37 = 0; var37 < var8; ++var37) {
+ var38 = (var2 + (double)var37) * var11 + this.xCoord;
+ var40 = (int)var38;
+ if(var38 < (double)var40) {
+ --var40;
+ }
+
+ var41 = var40 & 255;
+ var38 -= (double)var40;
+ var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D);
+
+ for(int var44 = 0; var44 < var10; ++var44) {
+ double var45 = (var6 + (double)var44) * var15 + this.zCoord;
+ int var47 = (int)var45;
+ if(var45 < (double)var47) {
+ --var47;
+ }
+
+ int var48 = var47 & 255;
+ var45 -= (double)var47;
+ double var49 = var45 * var45 * var45 * (var45 * (var45 * 6.0D - 15.0D) + 10.0D);
+
+ for(int var51 = 0; var51 < var9; ++var51) {
+ double var52 = (var4 + (double)var51) * var13 + this.yCoord;
+ int var54 = (int)var52;
+ if(var52 < (double)var54) {
+ --var54;
+ }
+
+ int var55 = var54 & 255;
+ var52 -= (double)var54;
+ double var56 = var52 * var52 * var52 * (var52 * (var52 * 6.0D - 15.0D) + 10.0D);
+ if(var51 == 0 || var55 != var22) {
+ var22 = var55;
+ int var69 = this.permutations[var41] + var55;
+ int var71 = this.permutations[var69] + var48;
+ int var72 = this.permutations[var69 + 1] + var48;
+ int var74 = this.permutations[var41 + 1] + var55;
+ var75 = this.permutations[var74] + var48;
+ int var76 = this.permutations[var74 + 1] + var48;
+ var29 = this.lerp(var42, this.grad(this.permutations[var71], var38, var52, var45), this.grad(this.permutations[var75], var38 - 1.0D, var52, var45));
+ var31 = this.lerp(var42, this.grad(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45));
+ var33 = this.lerp(var42, this.grad(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D));
+ var35 = this.lerp(var42, this.grad(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D));
+ }
+
+ double var58 = this.lerp(var56, var29, var31);
+ double var60 = this.lerp(var56, var33, var35);
+ double var62 = this.lerp(var49, var58, var60);
+ var10001 = var19++;
+ var1[var10001] += var62 * var20;
+ }
+ }
+ }
+
+ }
+ }
+}
diff --git a/src/net/minecraft/src/Packet.java b/src/net/minecraft/src/Packet.java
new file mode 100644
index 0000000..6034919
--- /dev/null
+++ b/src/net/minecraft/src/Packet.java
@@ -0,0 +1,196 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public abstract class Packet {
+ private static Map packetIdToClassMap = new HashMap();
+ private static Map packetClassToIdMap = new HashMap();
+ private static Set clientPacketIdList = new HashSet();
+ private static Set serverPacketIdList = new HashSet();
+ public final long creationTimeMillis = System.currentTimeMillis();
+ public boolean isChunkDataPacket = false;
+ private static HashMap packetStats;
+ private static int totalPacketsCount;
+
+ static void addIdClassMapping(int var0, boolean var1, boolean var2, Class var3) {
+ if(packetIdToClassMap.containsKey(Integer.valueOf(var0))) {
+ throw new IllegalArgumentException("Duplicate packet id:" + var0);
+ } else if(packetClassToIdMap.containsKey(var3)) {
+ throw new IllegalArgumentException("Duplicate packet class:" + var3);
+ } else {
+ packetIdToClassMap.put(Integer.valueOf(var0), var3);
+ packetClassToIdMap.put(var3, Integer.valueOf(var0));
+ if(var1) {
+ clientPacketIdList.add(Integer.valueOf(var0));
+ }
+
+ if(var2) {
+ serverPacketIdList.add(Integer.valueOf(var0));
+ }
+
+ }
+ }
+
+ public static Packet getNewPacket(int var0) {
+ try {
+ Class var1 = (Class)packetIdToClassMap.get(Integer.valueOf(var0));
+ return var1 == null ? null : (Packet)var1.newInstance();
+ } catch (Exception var2) {
+ var2.printStackTrace();
+ System.out.println("Skipping packet with id " + var0);
+ return null;
+ }
+ }
+
+ public final int getPacketId() {
+ return ((Integer)packetClassToIdMap.get(this.getClass())).intValue();
+ }
+
+ public static Packet readPacket(DataInputStream var0, boolean var1) throws IOException {
+ boolean var2 = false;
+ Packet var3 = null;
+
+ int var6;
+ try {
+ var6 = var0.read();
+ if(var6 == -1) {
+ return null;
+ }
+
+ if(var1 && !serverPacketIdList.contains(Integer.valueOf(var6)) || !var1 && !clientPacketIdList.contains(Integer.valueOf(var6))) {
+ throw new IOException("Bad packet id " + var6);
+ }
+
+ var3 = getNewPacket(var6);
+ if(var3 == null) {
+ throw new IOException("Bad packet id " + var6);
+ }
+
+ var3.readPacketData(var0);
+ } catch (EOFException var5) {
+ System.out.println("Reached end of stream");
+ return null;
+ }
+
+ PacketCounter var4 = (PacketCounter)packetStats.get(Integer.valueOf(var6));
+ if(var4 == null) {
+ var4 = new PacketCounter((Empty1)null);
+ packetStats.put(Integer.valueOf(var6), var4);
+ }
+
+ var4.addPacket(var3.getPacketSize());
+ ++totalPacketsCount;
+ if(totalPacketsCount % 1000 == 0) {
+ }
+
+ return var3;
+ }
+
+ public static void writePacket(Packet var0, DataOutputStream var1) throws IOException {
+ var1.write(var0.getPacketId());
+ var0.writePacketData(var1);
+ }
+
+ public static void writeString(String var0, DataOutputStream var1) throws IOException {
+ if(var0.length() > Short.MAX_VALUE) {
+ throw new IOException("String too big");
+ } else {
+ var1.writeShort(var0.length());
+ var1.writeChars(var0);
+ }
+ }
+
+ public static String readString(DataInputStream var0, int var1) throws IOException {
+ short var2 = var0.readShort();
+ if(var2 > var1) {
+ throw new IOException("Received string length longer than maximum allowed (" + var2 + " > " + var1 + ")");
+ } else if(var2 < 0) {
+ throw new IOException("Received string length is less than zero! Weird string!");
+ } else {
+ StringBuilder var3 = new StringBuilder();
+
+ for(int var4 = 0; var4 < var2; ++var4) {
+ var3.append(var0.readChar());
+ }
+
+ return var3.toString();
+ }
+ }
+
+ public abstract void readPacketData(DataInputStream var1) throws IOException;
+
+ public abstract void writePacketData(DataOutputStream var1) throws IOException;
+
+ public abstract void processPacket(NetHandler var1);
+
+ public abstract int getPacketSize();
+
+ static {
+ addIdClassMapping(0, true, true, Packet0KeepAlive.class);
+ addIdClassMapping(1, true, true, Packet1Login.class);
+ addIdClassMapping(2, true, true, Packet2Handshake.class);
+ addIdClassMapping(3, true, true, Packet3Chat.class);
+ addIdClassMapping(4, true, false, Packet4UpdateTime.class);
+ addIdClassMapping(5, true, false, Packet5PlayerInventory.class);
+ addIdClassMapping(6, true, false, Packet6SpawnPosition.class);
+ addIdClassMapping(7, false, true, Packet7UseEntity.class);
+ addIdClassMapping(8, true, false, Packet8UpdateHealth.class);
+ addIdClassMapping(9, true, true, Packet9Respawn.class);
+ addIdClassMapping(10, true, true, Packet10Flying.class);
+ addIdClassMapping(11, true, true, Packet11PlayerPosition.class);
+ addIdClassMapping(12, true, true, Packet12PlayerLook.class);
+ addIdClassMapping(13, true, true, Packet13PlayerLookMove.class);
+ addIdClassMapping(14, false, true, Packet14BlockDig.class);
+ addIdClassMapping(15, false, true, Packet15Place.class);
+ addIdClassMapping(16, false, true, Packet16BlockItemSwitch.class);
+ addIdClassMapping(17, true, false, Packet17Sleep.class);
+ addIdClassMapping(18, true, true, Packet18Animation.class);
+ addIdClassMapping(19, false, true, Packet19EntityAction.class);
+ addIdClassMapping(20, true, false, Packet20NamedEntitySpawn.class);
+ addIdClassMapping(21, true, false, Packet21PickupSpawn.class);
+ addIdClassMapping(22, true, false, Packet22Collect.class);
+ addIdClassMapping(23, true, false, Packet23VehicleSpawn.class);
+ addIdClassMapping(24, true, false, Packet24MobSpawn.class);
+ addIdClassMapping(25, true, false, Packet25EntityPainting.class);
+ addIdClassMapping(27, false, true, Packet27Position.class);
+ addIdClassMapping(28, true, false, Packet28EntityVelocity.class);
+ addIdClassMapping(29, true, false, Packet29DestroyEntity.class);
+ addIdClassMapping(30, true, false, Packet30Entity.class);
+ addIdClassMapping(31, true, false, Packet31RelEntityMove.class);
+ addIdClassMapping(32, true, false, Packet32EntityLook.class);
+ addIdClassMapping(33, true, false, Packet33RelEntityMoveLook.class);
+ addIdClassMapping(34, true, false, Packet34EntityTeleport.class);
+ addIdClassMapping(38, true, false, Packet38EntityStatus.class);
+ addIdClassMapping(39, true, false, Packet39AttachEntity.class);
+ addIdClassMapping(40, true, false, Packet40EntityMetadata.class);
+ addIdClassMapping(50, true, false, Packet50PreChunk.class);
+ addIdClassMapping(51, true, false, Packet51MapChunk.class);
+ addIdClassMapping(52, true, false, Packet52MultiBlockChange.class);
+ addIdClassMapping(53, true, false, Packet53BlockChange.class);
+ addIdClassMapping(54, true, false, Packet54PlayNoteBlock.class);
+ addIdClassMapping(60, true, false, Packet60Explosion.class);
+ addIdClassMapping(61, true, false, Packet61DoorChange.class);
+ addIdClassMapping(70, true, false, Packet70Bed.class);
+ addIdClassMapping(71, true, false, Packet71Weather.class);
+ addIdClassMapping(100, true, false, Packet100OpenWindow.class);
+ addIdClassMapping(101, true, true, Packet101CloseWindow.class);
+ addIdClassMapping(102, false, true, Packet102WindowClick.class);
+ addIdClassMapping(103, true, false, Packet103SetSlot.class);
+ addIdClassMapping(104, true, false, Packet104WindowItems.class);
+ addIdClassMapping(105, true, false, Packet105UpdateProgressbar.class);
+ addIdClassMapping(106, true, true, Packet106Transaction.class);
+ addIdClassMapping(130, true, true, Packet130UpdateSign.class);
+ addIdClassMapping(131, true, false, Packet131MapData.class);
+ addIdClassMapping(200, true, false, Packet200Statistic.class);
+ addIdClassMapping(255, true, true, Packet255KickDisconnect.class);
+ packetStats = new HashMap();
+ totalPacketsCount = 0;
+ }
+}
diff --git a/src/net/minecraft/src/Packet0KeepAlive.java b/src/net/minecraft/src/Packet0KeepAlive.java
new file mode 100644
index 0000000..e6f804d
--- /dev/null
+++ b/src/net/minecraft/src/Packet0KeepAlive.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet0KeepAlive extends Packet {
+ public void processPacket(NetHandler var1) {
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ }
+
+ public int getPacketSize() {
+ return 0;
+ }
+}
diff --git a/src/net/minecraft/src/Packet100OpenWindow.java b/src/net/minecraft/src/Packet100OpenWindow.java
new file mode 100644
index 0000000..8fe2dc1
--- /dev/null
+++ b/src/net/minecraft/src/Packet100OpenWindow.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet100OpenWindow extends Packet {
+ public int windowId;
+ public int inventoryType;
+ public String windowTitle;
+ public int slotsCount;
+
+ public Packet100OpenWindow() {
+ }
+
+ public Packet100OpenWindow(int var1, int var2, String var3, int var4) {
+ this.windowId = var1;
+ this.inventoryType = var2;
+ this.windowTitle = var3;
+ this.slotsCount = var4;
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_20004_a(this);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.windowId = var1.readByte();
+ this.inventoryType = var1.readByte();
+ this.windowTitle = var1.readUTF();
+ this.slotsCount = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeByte(this.windowId);
+ var1.writeByte(this.inventoryType);
+ var1.writeUTF(this.windowTitle);
+ var1.writeByte(this.slotsCount);
+ }
+
+ public int getPacketSize() {
+ return 3 + this.windowTitle.length();
+ }
+}
diff --git a/src/net/minecraft/src/Packet101CloseWindow.java b/src/net/minecraft/src/Packet101CloseWindow.java
new file mode 100644
index 0000000..d0e1cae
--- /dev/null
+++ b/src/net/minecraft/src/Packet101CloseWindow.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet101CloseWindow extends Packet {
+ public int windowId;
+
+ public Packet101CloseWindow() {
+ }
+
+ public Packet101CloseWindow(int var1) {
+ this.windowId = var1;
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleCraftingGuiClosedPacked(this);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.windowId = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeByte(this.windowId);
+ }
+
+ public int getPacketSize() {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/Packet102WindowClick.java b/src/net/minecraft/src/Packet102WindowClick.java
new file mode 100644
index 0000000..3e605de
--- /dev/null
+++ b/src/net/minecraft/src/Packet102WindowClick.java
@@ -0,0 +1,55 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet102WindowClick extends Packet {
+ public int window_Id;
+ public int inventorySlot;
+ public int mouseClick;
+ public short action;
+ public ItemStack itemStack;
+ public boolean field_27039_f;
+
+ public void processPacket(NetHandler var1) {
+ var1.func_20007_a(this);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.window_Id = var1.readByte();
+ this.inventorySlot = var1.readShort();
+ this.mouseClick = var1.readByte();
+ this.action = var1.readShort();
+ this.field_27039_f = var1.readBoolean();
+ short var2 = var1.readShort();
+ if(var2 >= 0) {
+ byte var3 = var1.readByte();
+ short var4 = var1.readShort();
+ this.itemStack = new ItemStack(var2, var3, var4);
+ } else {
+ this.itemStack = null;
+ }
+
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeByte(this.window_Id);
+ var1.writeShort(this.inventorySlot);
+ var1.writeByte(this.mouseClick);
+ var1.writeShort(this.action);
+ var1.writeBoolean(this.field_27039_f);
+ if(this.itemStack == null) {
+ var1.writeShort(-1);
+ } else {
+ var1.writeShort(this.itemStack.itemID);
+ var1.writeByte(this.itemStack.stackSize);
+ var1.writeShort(this.itemStack.getItemDamage());
+ }
+
+ }
+
+ public int getPacketSize() {
+ return 11;
+ }
+}
diff --git a/src/net/minecraft/src/Packet103SetSlot.java b/src/net/minecraft/src/Packet103SetSlot.java
new file mode 100644
index 0000000..001075d
--- /dev/null
+++ b/src/net/minecraft/src/Packet103SetSlot.java
@@ -0,0 +1,55 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet103SetSlot extends Packet {
+ public int windowId;
+ public int itemSlot;
+ public ItemStack myItemStack;
+
+ public Packet103SetSlot() {
+ }
+
+ public Packet103SetSlot(int var1, int var2, ItemStack var3) {
+ this.windowId = var1;
+ this.itemSlot = var2;
+ this.myItemStack = var3 == null ? var3 : var3.copy();
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_20003_a(this);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.windowId = var1.readByte();
+ this.itemSlot = var1.readShort();
+ short var2 = var1.readShort();
+ if(var2 >= 0) {
+ byte var3 = var1.readByte();
+ short var4 = var1.readShort();
+ this.myItemStack = new ItemStack(var2, var3, var4);
+ } else {
+ this.myItemStack = null;
+ }
+
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeByte(this.windowId);
+ var1.writeShort(this.itemSlot);
+ if(this.myItemStack == null) {
+ var1.writeShort(-1);
+ } else {
+ var1.writeShort(this.myItemStack.itemID);
+ var1.writeByte(this.myItemStack.stackSize);
+ var1.writeShort(this.myItemStack.getItemDamage());
+ }
+
+ }
+
+ public int getPacketSize() {
+ return 8;
+ }
+}
diff --git a/src/net/minecraft/src/Packet104WindowItems.java b/src/net/minecraft/src/Packet104WindowItems.java
new file mode 100644
index 0000000..d5004ee
--- /dev/null
+++ b/src/net/minecraft/src/Packet104WindowItems.java
@@ -0,0 +1,65 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+public class Packet104WindowItems extends Packet {
+ public int windowId;
+ public ItemStack[] itemStack;
+
+ public Packet104WindowItems() {
+ }
+
+ public Packet104WindowItems(int var1, List var2) {
+ this.windowId = var1;
+ this.itemStack = new ItemStack[var2.size()];
+
+ for(int var3 = 0; var3 < this.itemStack.length; ++var3) {
+ ItemStack var4 = (ItemStack)var2.get(var3);
+ this.itemStack[var3] = var4 == null ? null : var4.copy();
+ }
+
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.windowId = var1.readByte();
+ short var2 = var1.readShort();
+ this.itemStack = new ItemStack[var2];
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ short var4 = var1.readShort();
+ if(var4 >= 0) {
+ byte var5 = var1.readByte();
+ short var6 = var1.readShort();
+ this.itemStack[var3] = new ItemStack(var4, var5, var6);
+ }
+ }
+
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeByte(this.windowId);
+ var1.writeShort(this.itemStack.length);
+
+ for(int var2 = 0; var2 < this.itemStack.length; ++var2) {
+ if(this.itemStack[var2] == null) {
+ var1.writeShort(-1);
+ } else {
+ var1.writeShort((short)this.itemStack[var2].itemID);
+ var1.writeByte((byte)this.itemStack[var2].stackSize);
+ var1.writeShort((short)this.itemStack[var2].getItemDamage());
+ }
+ }
+
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_20001_a(this);
+ }
+
+ public int getPacketSize() {
+ return 3 + this.itemStack.length * 5;
+ }
+}
diff --git a/src/net/minecraft/src/Packet105UpdateProgressbar.java b/src/net/minecraft/src/Packet105UpdateProgressbar.java
new file mode 100644
index 0000000..c35e7f5
--- /dev/null
+++ b/src/net/minecraft/src/Packet105UpdateProgressbar.java
@@ -0,0 +1,40 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet105UpdateProgressbar extends Packet {
+ public int windowId;
+ public int progressBar;
+ public int progressBarValue;
+
+ public Packet105UpdateProgressbar() {
+ }
+
+ public Packet105UpdateProgressbar(int var1, int var2, int var3) {
+ this.windowId = var1;
+ this.progressBar = var2;
+ this.progressBarValue = var3;
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_20002_a(this);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.windowId = var1.readByte();
+ this.progressBar = var1.readShort();
+ this.progressBarValue = var1.readShort();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeByte(this.windowId);
+ var1.writeShort(this.progressBar);
+ var1.writeShort(this.progressBarValue);
+ }
+
+ public int getPacketSize() {
+ return 5;
+ }
+}
diff --git a/src/net/minecraft/src/Packet106Transaction.java b/src/net/minecraft/src/Packet106Transaction.java
new file mode 100644
index 0000000..1114b12
--- /dev/null
+++ b/src/net/minecraft/src/Packet106Transaction.java
@@ -0,0 +1,40 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet106Transaction extends Packet {
+ public int windowId;
+ public short shortWindowId;
+ public boolean field_20035_c;
+
+ public Packet106Transaction() {
+ }
+
+ public Packet106Transaction(int var1, short var2, boolean var3) {
+ this.windowId = var1;
+ this.shortWindowId = var2;
+ this.field_20035_c = var3;
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_20008_a(this);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.windowId = var1.readByte();
+ this.shortWindowId = var1.readShort();
+ this.field_20035_c = var1.readByte() != 0;
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeByte(this.windowId);
+ var1.writeShort(this.shortWindowId);
+ var1.writeByte(this.field_20035_c ? 1 : 0);
+ }
+
+ public int getPacketSize() {
+ return 4;
+ }
+}
diff --git a/src/net/minecraft/src/Packet10Flying.java b/src/net/minecraft/src/Packet10Flying.java
new file mode 100644
index 0000000..cc634da
--- /dev/null
+++ b/src/net/minecraft/src/Packet10Flying.java
@@ -0,0 +1,33 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet10Flying extends Packet {
+ public double xPosition;
+ public double yPosition;
+ public double zPosition;
+ public double stance;
+ public float yaw;
+ public float pitch;
+ public boolean onGround;
+ public boolean moving;
+ public boolean rotating;
+
+ public void processPacket(NetHandler var1) {
+ var1.handleFlying(this);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.onGround = var1.read() != 0;
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.write(this.onGround ? 1 : 0);
+ }
+
+ public int getPacketSize() {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/Packet11PlayerPosition.java b/src/net/minecraft/src/Packet11PlayerPosition.java
new file mode 100644
index 0000000..6e995f8
--- /dev/null
+++ b/src/net/minecraft/src/Packet11PlayerPosition.java
@@ -0,0 +1,31 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet11PlayerPosition extends Packet10Flying {
+ public Packet11PlayerPosition() {
+ this.moving = true;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xPosition = var1.readDouble();
+ this.yPosition = var1.readDouble();
+ this.stance = var1.readDouble();
+ this.zPosition = var1.readDouble();
+ super.readPacketData(var1);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeDouble(this.xPosition);
+ var1.writeDouble(this.yPosition);
+ var1.writeDouble(this.stance);
+ var1.writeDouble(this.zPosition);
+ super.writePacketData(var1);
+ }
+
+ public int getPacketSize() {
+ return 33;
+ }
+}
diff --git a/src/net/minecraft/src/Packet12PlayerLook.java b/src/net/minecraft/src/Packet12PlayerLook.java
new file mode 100644
index 0000000..994a079
--- /dev/null
+++ b/src/net/minecraft/src/Packet12PlayerLook.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet12PlayerLook extends Packet10Flying {
+ public Packet12PlayerLook() {
+ this.rotating = true;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.yaw = var1.readFloat();
+ this.pitch = var1.readFloat();
+ super.readPacketData(var1);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeFloat(this.yaw);
+ var1.writeFloat(this.pitch);
+ super.writePacketData(var1);
+ }
+
+ public int getPacketSize() {
+ return 9;
+ }
+}
diff --git a/src/net/minecraft/src/Packet130UpdateSign.java b/src/net/minecraft/src/Packet130UpdateSign.java
new file mode 100644
index 0000000..43d9a33
--- /dev/null
+++ b/src/net/minecraft/src/Packet130UpdateSign.java
@@ -0,0 +1,61 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet130UpdateSign extends Packet {
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public String[] signLines;
+
+ public Packet130UpdateSign() {
+ this.isChunkDataPacket = true;
+ }
+
+ public Packet130UpdateSign(int var1, int var2, int var3, String[] var4) {
+ this.isChunkDataPacket = true;
+ this.xPosition = var1;
+ this.yPosition = var2;
+ this.zPosition = var3;
+ this.signLines = var4;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readShort();
+ this.zPosition = var1.readInt();
+ this.signLines = new String[4];
+
+ for(int var2 = 0; var2 < 4; ++var2) {
+ this.signLines[var2] = readString(var1, 15);
+ }
+
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.xPosition);
+ var1.writeShort(this.yPosition);
+ var1.writeInt(this.zPosition);
+
+ for(int var2 = 0; var2 < 4; ++var2) {
+ writeString(this.signLines[var2], var1);
+ }
+
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleUpdateSign(this);
+ }
+
+ public int getPacketSize() {
+ int var1 = 0;
+
+ for(int var2 = 0; var2 < 4; ++var2) {
+ var1 += this.signLines[var2].length();
+ }
+
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/Packet131MapData.java b/src/net/minecraft/src/Packet131MapData.java
new file mode 100644
index 0000000..71f82f4
--- /dev/null
+++ b/src/net/minecraft/src/Packet131MapData.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet131MapData extends Packet {
+ public short field_28052_a;
+ public short field_28051_b;
+ public byte[] field_28053_c;
+
+ public Packet131MapData() {
+ this.isChunkDataPacket = true;
+ }
+
+ public Packet131MapData(short var1, short var2, byte[] var3) {
+ this.isChunkDataPacket = true;
+ this.field_28052_a = var1;
+ this.field_28051_b = var2;
+ this.field_28053_c = var3;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.field_28052_a = var1.readShort();
+ this.field_28051_b = var1.readShort();
+ this.field_28053_c = new byte[var1.readByte() & 255];
+ var1.readFully(this.field_28053_c);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeShort(this.field_28052_a);
+ var1.writeShort(this.field_28051_b);
+ var1.writeByte(this.field_28053_c.length);
+ var1.write(this.field_28053_c);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_28001_a(this);
+ }
+
+ public int getPacketSize() {
+ return 4 + this.field_28053_c.length;
+ }
+}
diff --git a/src/net/minecraft/src/Packet13PlayerLookMove.java b/src/net/minecraft/src/Packet13PlayerLookMove.java
new file mode 100644
index 0000000..f4fafeb
--- /dev/null
+++ b/src/net/minecraft/src/Packet13PlayerLookMove.java
@@ -0,0 +1,48 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet13PlayerLookMove extends Packet10Flying {
+ public Packet13PlayerLookMove() {
+ this.rotating = true;
+ this.moving = true;
+ }
+
+ public Packet13PlayerLookMove(double var1, double var3, double var5, double var7, float var9, float var10, boolean var11) {
+ this.xPosition = var1;
+ this.yPosition = var3;
+ this.stance = var5;
+ this.zPosition = var7;
+ this.yaw = var9;
+ this.pitch = var10;
+ this.onGround = var11;
+ this.rotating = true;
+ this.moving = true;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xPosition = var1.readDouble();
+ this.yPosition = var1.readDouble();
+ this.stance = var1.readDouble();
+ this.zPosition = var1.readDouble();
+ this.yaw = var1.readFloat();
+ this.pitch = var1.readFloat();
+ super.readPacketData(var1);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeDouble(this.xPosition);
+ var1.writeDouble(this.yPosition);
+ var1.writeDouble(this.stance);
+ var1.writeDouble(this.zPosition);
+ var1.writeFloat(this.yaw);
+ var1.writeFloat(this.pitch);
+ super.writePacketData(var1);
+ }
+
+ public int getPacketSize() {
+ return 41;
+ }
+}
diff --git a/src/net/minecraft/src/Packet14BlockDig.java b/src/net/minecraft/src/Packet14BlockDig.java
new file mode 100644
index 0000000..0e8d39c
--- /dev/null
+++ b/src/net/minecraft/src/Packet14BlockDig.java
@@ -0,0 +1,37 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet14BlockDig extends Packet {
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public int face;
+ public int status;
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.status = var1.read();
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.read();
+ this.zPosition = var1.readInt();
+ this.face = var1.read();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.write(this.status);
+ var1.writeInt(this.xPosition);
+ var1.write(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.write(this.face);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleBlockDig(this);
+ }
+
+ public int getPacketSize() {
+ return 11;
+ }
+}
diff --git a/src/net/minecraft/src/Packet15Place.java b/src/net/minecraft/src/Packet15Place.java
new file mode 100644
index 0000000..6dfb7bd
--- /dev/null
+++ b/src/net/minecraft/src/Packet15Place.java
@@ -0,0 +1,52 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet15Place extends Packet {
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public int direction;
+ public ItemStack itemStack;
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.read();
+ this.zPosition = var1.readInt();
+ this.direction = var1.read();
+ short var2 = var1.readShort();
+ if(var2 >= 0) {
+ byte var3 = var1.readByte();
+ short var4 = var1.readShort();
+ this.itemStack = new ItemStack(var2, var3, var4);
+ } else {
+ this.itemStack = null;
+ }
+
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.xPosition);
+ var1.write(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.write(this.direction);
+ if(this.itemStack == null) {
+ var1.writeShort(-1);
+ } else {
+ var1.writeShort(this.itemStack.itemID);
+ var1.writeByte(this.itemStack.stackSize);
+ var1.writeShort(this.itemStack.getItemDamage());
+ }
+
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handlePlace(this);
+ }
+
+ public int getPacketSize() {
+ return 15;
+ }
+}
diff --git a/src/net/minecraft/src/Packet16BlockItemSwitch.java b/src/net/minecraft/src/Packet16BlockItemSwitch.java
new file mode 100644
index 0000000..038d6c3
--- /dev/null
+++ b/src/net/minecraft/src/Packet16BlockItemSwitch.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet16BlockItemSwitch extends Packet {
+ public int id;
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.id = var1.readShort();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeShort(this.id);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleBlockItemSwitch(this);
+ }
+
+ public int getPacketSize() {
+ return 2;
+ }
+}
diff --git a/src/net/minecraft/src/Packet17Sleep.java b/src/net/minecraft/src/Packet17Sleep.java
new file mode 100644
index 0000000..ae83e67
--- /dev/null
+++ b/src/net/minecraft/src/Packet17Sleep.java
@@ -0,0 +1,48 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet17Sleep extends Packet {
+ public int field_22041_a;
+ public int field_22040_b;
+ public int field_22044_c;
+ public int field_22043_d;
+ public int field_22042_e;
+
+ public Packet17Sleep() {
+ }
+
+ public Packet17Sleep(Entity var1, int var2, int var3, int var4, int var5) {
+ this.field_22042_e = var2;
+ this.field_22040_b = var3;
+ this.field_22044_c = var4;
+ this.field_22043_d = var5;
+ this.field_22041_a = var1.entityId;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.field_22041_a = var1.readInt();
+ this.field_22042_e = var1.readByte();
+ this.field_22040_b = var1.readInt();
+ this.field_22044_c = var1.readByte();
+ this.field_22043_d = var1.readInt();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.field_22041_a);
+ var1.writeByte(this.field_22042_e);
+ var1.writeInt(this.field_22040_b);
+ var1.writeByte(this.field_22044_c);
+ var1.writeInt(this.field_22043_d);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_22002_a(this);
+ }
+
+ public int getPacketSize() {
+ return 14;
+ }
+}
diff --git a/src/net/minecraft/src/Packet18Animation.java b/src/net/minecraft/src/Packet18Animation.java
new file mode 100644
index 0000000..f9eec62
--- /dev/null
+++ b/src/net/minecraft/src/Packet18Animation.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet18Animation extends Packet {
+ public int entityId;
+ public int animate;
+
+ public Packet18Animation() {
+ }
+
+ public Packet18Animation(Entity var1, int var2) {
+ this.entityId = var1.entityId;
+ this.animate = var2;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.animate = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ var1.writeByte(this.animate);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleArmAnimation(this);
+ }
+
+ public int getPacketSize() {
+ return 5;
+ }
+}
diff --git a/src/net/minecraft/src/Packet19EntityAction.java b/src/net/minecraft/src/Packet19EntityAction.java
new file mode 100644
index 0000000..5f98a92
--- /dev/null
+++ b/src/net/minecraft/src/Packet19EntityAction.java
@@ -0,0 +1,28 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet19EntityAction extends Packet {
+ public int entityId;
+ public int state;
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.state = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ var1.writeByte(this.state);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_21001_a(this);
+ }
+
+ public int getPacketSize() {
+ return 5;
+ }
+}
diff --git a/src/net/minecraft/src/Packet1Login.java b/src/net/minecraft/src/Packet1Login.java
new file mode 100644
index 0000000..68d41b9
--- /dev/null
+++ b/src/net/minecraft/src/Packet1Login.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet1Login extends Packet {
+ public int protocolVersion;
+ public String username;
+ public long mapSeed;
+ public byte dimension;
+
+ public Packet1Login() {
+ }
+
+ public Packet1Login(String var1, int var2, long var3, byte var5) {
+ this.username = var1;
+ this.protocolVersion = var2;
+ this.mapSeed = var3;
+ this.dimension = var5;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.protocolVersion = var1.readInt();
+ this.username = readString(var1, 16);
+ this.mapSeed = var1.readLong();
+ this.dimension = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.protocolVersion);
+ writeString(this.username, var1);
+ var1.writeLong(this.mapSeed);
+ var1.writeByte(this.dimension);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleLogin(this);
+ }
+
+ public int getPacketSize() {
+ return 4 + this.username.length() + 4 + 5;
+ }
+}
diff --git a/src/net/minecraft/src/Packet200Statistic.java b/src/net/minecraft/src/Packet200Statistic.java
new file mode 100644
index 0000000..1b6c3f4
--- /dev/null
+++ b/src/net/minecraft/src/Packet200Statistic.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet200Statistic extends Packet {
+ public int field_27041_a;
+ public int field_27040_b;
+
+ public Packet200Statistic() {
+ }
+
+ public Packet200Statistic(int var1, int var2) {
+ this.field_27041_a = var1;
+ this.field_27040_b = var2;
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_27001_a(this);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.field_27041_a = var1.readInt();
+ this.field_27040_b = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.field_27041_a);
+ var1.writeByte(this.field_27040_b);
+ }
+
+ public int getPacketSize() {
+ return 6;
+ }
+}
diff --git a/src/net/minecraft/src/Packet20NamedEntitySpawn.java b/src/net/minecraft/src/Packet20NamedEntitySpawn.java
new file mode 100644
index 0000000..a4f019c
--- /dev/null
+++ b/src/net/minecraft/src/Packet20NamedEntitySpawn.java
@@ -0,0 +1,61 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet20NamedEntitySpawn extends Packet {
+ public int entityId;
+ public String name;
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public byte rotation;
+ public byte pitch;
+ public int currentItem;
+
+ public Packet20NamedEntitySpawn() {
+ }
+
+ public Packet20NamedEntitySpawn(EntityPlayer var1) {
+ this.entityId = var1.entityId;
+ this.name = var1.username;
+ this.xPosition = MathHelper.floor_double(var1.posX * 32.0D);
+ this.yPosition = MathHelper.floor_double(var1.posY * 32.0D);
+ this.zPosition = MathHelper.floor_double(var1.posZ * 32.0D);
+ this.rotation = (byte)((int)(var1.rotationYaw * 256.0F / 360.0F));
+ this.pitch = (byte)((int)(var1.rotationPitch * 256.0F / 360.0F));
+ ItemStack var2 = var1.inventory.getCurrentItem();
+ this.currentItem = var2 == null ? 0 : var2.itemID;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.name = readString(var1, 16);
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readInt();
+ this.zPosition = var1.readInt();
+ this.rotation = var1.readByte();
+ this.pitch = var1.readByte();
+ this.currentItem = var1.readShort();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ writeString(this.name, var1);
+ var1.writeInt(this.xPosition);
+ var1.writeInt(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.writeByte(this.rotation);
+ var1.writeByte(this.pitch);
+ var1.writeShort(this.currentItem);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleNamedEntitySpawn(this);
+ }
+
+ public int getPacketSize() {
+ return 28;
+ }
+}
diff --git a/src/net/minecraft/src/Packet21PickupSpawn.java b/src/net/minecraft/src/Packet21PickupSpawn.java
new file mode 100644
index 0000000..c4092b1
--- /dev/null
+++ b/src/net/minecraft/src/Packet21PickupSpawn.java
@@ -0,0 +1,68 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet21PickupSpawn extends Packet {
+ public int entityId;
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public byte rotation;
+ public byte pitch;
+ public byte roll;
+ public int itemID;
+ public int count;
+ public int itemDamage;
+
+ public Packet21PickupSpawn() {
+ }
+
+ public Packet21PickupSpawn(EntityItem var1) {
+ this.entityId = var1.entityId;
+ this.itemID = var1.item.itemID;
+ this.count = var1.item.stackSize;
+ this.itemDamage = var1.item.getItemDamage();
+ this.xPosition = MathHelper.floor_double(var1.posX * 32.0D);
+ this.yPosition = MathHelper.floor_double(var1.posY * 32.0D);
+ this.zPosition = MathHelper.floor_double(var1.posZ * 32.0D);
+ this.rotation = (byte)((int)(var1.motionX * 128.0D));
+ this.pitch = (byte)((int)(var1.motionY * 128.0D));
+ this.roll = (byte)((int)(var1.motionZ * 128.0D));
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.itemID = var1.readShort();
+ this.count = var1.readByte();
+ this.itemDamage = var1.readShort();
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readInt();
+ this.zPosition = var1.readInt();
+ this.rotation = var1.readByte();
+ this.pitch = var1.readByte();
+ this.roll = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ var1.writeShort(this.itemID);
+ var1.writeByte(this.count);
+ var1.writeShort(this.itemDamage);
+ var1.writeInt(this.xPosition);
+ var1.writeInt(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.writeByte(this.rotation);
+ var1.writeByte(this.pitch);
+ var1.writeByte(this.roll);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handlePickupSpawn(this);
+ }
+
+ public int getPacketSize() {
+ return 24;
+ }
+}
diff --git a/src/net/minecraft/src/Packet22Collect.java b/src/net/minecraft/src/Packet22Collect.java
new file mode 100644
index 0000000..b8f1a00
--- /dev/null
+++ b/src/net/minecraft/src/Packet22Collect.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet22Collect extends Packet {
+ public int collectedEntityId;
+ public int collectorEntityId;
+
+ public Packet22Collect() {
+ }
+
+ public Packet22Collect(int var1, int var2) {
+ this.collectedEntityId = var1;
+ this.collectorEntityId = var2;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.collectedEntityId = var1.readInt();
+ this.collectorEntityId = var1.readInt();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.collectedEntityId);
+ var1.writeInt(this.collectorEntityId);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleCollect(this);
+ }
+
+ public int getPacketSize() {
+ return 8;
+ }
+}
diff --git a/src/net/minecraft/src/Packet23VehicleSpawn.java b/src/net/minecraft/src/Packet23VehicleSpawn.java
new file mode 100644
index 0000000..0e82a66
--- /dev/null
+++ b/src/net/minecraft/src/Packet23VehicleSpawn.java
@@ -0,0 +1,105 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet23VehicleSpawn extends Packet {
+ public int entityId;
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public int field_28044_e;
+ public int field_28043_f;
+ public int field_28042_g;
+ public int type;
+ public int field_28041_i;
+
+ public Packet23VehicleSpawn() {
+ }
+
+ public Packet23VehicleSpawn(Entity var1, int var2) {
+ this(var1, var2, 0);
+ }
+
+ public Packet23VehicleSpawn(Entity var1, int var2, int var3) {
+ this.entityId = var1.entityId;
+ this.xPosition = MathHelper.floor_double(var1.posX * 32.0D);
+ this.yPosition = MathHelper.floor_double(var1.posY * 32.0D);
+ this.zPosition = MathHelper.floor_double(var1.posZ * 32.0D);
+ this.type = var2;
+ this.field_28041_i = var3;
+ if(var3 > 0) {
+ double var4 = var1.motionX;
+ double var6 = var1.motionY;
+ double var8 = var1.motionZ;
+ double var10 = 3.9D;
+ if(var4 < -var10) {
+ var4 = -var10;
+ }
+
+ if(var6 < -var10) {
+ var6 = -var10;
+ }
+
+ if(var8 < -var10) {
+ var8 = -var10;
+ }
+
+ if(var4 > var10) {
+ var4 = var10;
+ }
+
+ if(var6 > var10) {
+ var6 = var10;
+ }
+
+ if(var8 > var10) {
+ var8 = var10;
+ }
+
+ this.field_28044_e = (int)(var4 * 8000.0D);
+ this.field_28043_f = (int)(var6 * 8000.0D);
+ this.field_28042_g = (int)(var8 * 8000.0D);
+ }
+
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.type = var1.readByte();
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readInt();
+ this.zPosition = var1.readInt();
+ this.field_28041_i = var1.readInt();
+ if(this.field_28041_i > 0) {
+ this.field_28044_e = var1.readShort();
+ this.field_28043_f = var1.readShort();
+ this.field_28042_g = var1.readShort();
+ }
+
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ var1.writeByte(this.type);
+ var1.writeInt(this.xPosition);
+ var1.writeInt(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.writeInt(this.field_28041_i);
+ if(this.field_28041_i > 0) {
+ var1.writeShort(this.field_28044_e);
+ var1.writeShort(this.field_28043_f);
+ var1.writeShort(this.field_28042_g);
+ }
+
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleVehicleSpawn(this);
+ }
+
+ public int getPacketSize() {
+ return 21 + this.field_28041_i > 0 ? 6 : 0;
+ }
+}
diff --git a/src/net/minecraft/src/Packet24MobSpawn.java b/src/net/minecraft/src/Packet24MobSpawn.java
new file mode 100644
index 0000000..7b20f7e
--- /dev/null
+++ b/src/net/minecraft/src/Packet24MobSpawn.java
@@ -0,0 +1,62 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+public class Packet24MobSpawn extends Packet {
+ public int entityId;
+ public byte type;
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public byte yaw;
+ public byte pitch;
+ private DataWatcher metaData;
+ private List receivedMetadata;
+
+ public Packet24MobSpawn() {
+ }
+
+ public Packet24MobSpawn(EntityLiving var1) {
+ this.entityId = var1.entityId;
+ this.type = (byte)EntityList.getEntityID(var1);
+ this.xPosition = MathHelper.floor_double(var1.posX * 32.0D);
+ this.yPosition = MathHelper.floor_double(var1.posY * 32.0D);
+ this.zPosition = MathHelper.floor_double(var1.posZ * 32.0D);
+ this.yaw = (byte)((int)(var1.rotationYaw * 256.0F / 360.0F));
+ this.pitch = (byte)((int)(var1.rotationPitch * 256.0F / 360.0F));
+ this.metaData = var1.getDataWatcher();
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.type = var1.readByte();
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readInt();
+ this.zPosition = var1.readInt();
+ this.yaw = var1.readByte();
+ this.pitch = var1.readByte();
+ this.receivedMetadata = DataWatcher.readWatchableObjects(var1);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ var1.writeByte(this.type);
+ var1.writeInt(this.xPosition);
+ var1.writeInt(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.writeByte(this.yaw);
+ var1.writeByte(this.pitch);
+ this.metaData.writeWatchableObjects(var1);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleMobSpawn(this);
+ }
+
+ public int getPacketSize() {
+ return 20;
+ }
+}
diff --git a/src/net/minecraft/src/Packet255KickDisconnect.java b/src/net/minecraft/src/Packet255KickDisconnect.java
new file mode 100644
index 0000000..eb0d5d6
--- /dev/null
+++ b/src/net/minecraft/src/Packet255KickDisconnect.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet255KickDisconnect extends Packet {
+ public String reason;
+
+ public Packet255KickDisconnect() {
+ }
+
+ public Packet255KickDisconnect(String var1) {
+ this.reason = var1;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.reason = readString(var1, 100);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ writeString(this.reason, var1);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleKickDisconnect(this);
+ }
+
+ public int getPacketSize() {
+ return this.reason.length();
+ }
+}
diff --git a/src/net/minecraft/src/Packet25EntityPainting.java b/src/net/minecraft/src/Packet25EntityPainting.java
new file mode 100644
index 0000000..8f59244
--- /dev/null
+++ b/src/net/minecraft/src/Packet25EntityPainting.java
@@ -0,0 +1,52 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet25EntityPainting extends Packet {
+ public int entityId;
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public int direction;
+ public String title;
+
+ public Packet25EntityPainting() {
+ }
+
+ public Packet25EntityPainting(EntityPainting var1) {
+ this.entityId = var1.entityId;
+ this.xPosition = var1.xPosition;
+ this.yPosition = var1.yPosition;
+ this.zPosition = var1.zPosition;
+ this.direction = var1.direction;
+ this.title = var1.art.title;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.title = readString(var1, EnumArt.field_27096_z);
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readInt();
+ this.zPosition = var1.readInt();
+ this.direction = var1.readInt();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ writeString(this.title, var1);
+ var1.writeInt(this.xPosition);
+ var1.writeInt(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.writeInt(this.direction);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_21003_a(this);
+ }
+
+ public int getPacketSize() {
+ return 24;
+ }
+}
diff --git a/src/net/minecraft/src/Packet27Position.java b/src/net/minecraft/src/Packet27Position.java
new file mode 100644
index 0000000..706358e
--- /dev/null
+++ b/src/net/minecraft/src/Packet27Position.java
@@ -0,0 +1,64 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet27Position extends Packet {
+ private float strafeMovement;
+ private float fowardMovement;
+ private boolean field_22039_c;
+ private boolean isInJump;
+ private float pitchRotation;
+ private float yawRotation;
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.strafeMovement = var1.readFloat();
+ this.fowardMovement = var1.readFloat();
+ this.pitchRotation = var1.readFloat();
+ this.yawRotation = var1.readFloat();
+ this.field_22039_c = var1.readBoolean();
+ this.isInJump = var1.readBoolean();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeFloat(this.strafeMovement);
+ var1.writeFloat(this.fowardMovement);
+ var1.writeFloat(this.pitchRotation);
+ var1.writeFloat(this.yawRotation);
+ var1.writeBoolean(this.field_22039_c);
+ var1.writeBoolean(this.isInJump);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleMovementTypePacket(this);
+ }
+
+ public int getPacketSize() {
+ return 18;
+ }
+
+ public float func_22031_c() {
+ return this.strafeMovement;
+ }
+
+ public float func_22029_d() {
+ return this.pitchRotation;
+ }
+
+ public float func_22028_e() {
+ return this.fowardMovement;
+ }
+
+ public float func_22033_f() {
+ return this.yawRotation;
+ }
+
+ public boolean func_22032_g() {
+ return this.field_22039_c;
+ }
+
+ public boolean func_22030_h() {
+ return this.isInJump;
+ }
+}
diff --git a/src/net/minecraft/src/Packet28EntityVelocity.java b/src/net/minecraft/src/Packet28EntityVelocity.java
new file mode 100644
index 0000000..ed613fa
--- /dev/null
+++ b/src/net/minecraft/src/Packet28EntityVelocity.java
@@ -0,0 +1,73 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet28EntityVelocity extends Packet {
+ public int entityId;
+ public int motionX;
+ public int motionY;
+ public int motionZ;
+
+ public Packet28EntityVelocity() {
+ }
+
+ public Packet28EntityVelocity(Entity var1) {
+ this(var1.entityId, var1.motionX, var1.motionY, var1.motionZ);
+ }
+
+ public Packet28EntityVelocity(int var1, double var2, double var4, double var6) {
+ this.entityId = var1;
+ double var8 = 3.9D;
+ if(var2 < -var8) {
+ var2 = -var8;
+ }
+
+ if(var4 < -var8) {
+ var4 = -var8;
+ }
+
+ if(var6 < -var8) {
+ var6 = -var8;
+ }
+
+ if(var2 > var8) {
+ var2 = var8;
+ }
+
+ if(var4 > var8) {
+ var4 = var8;
+ }
+
+ if(var6 > var8) {
+ var6 = var8;
+ }
+
+ this.motionX = (int)(var2 * 8000.0D);
+ this.motionY = (int)(var4 * 8000.0D);
+ this.motionZ = (int)(var6 * 8000.0D);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.motionX = var1.readShort();
+ this.motionY = var1.readShort();
+ this.motionZ = var1.readShort();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ var1.writeShort(this.motionX);
+ var1.writeShort(this.motionY);
+ var1.writeShort(this.motionZ);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_6002_a(this);
+ }
+
+ public int getPacketSize() {
+ return 10;
+ }
+}
diff --git a/src/net/minecraft/src/Packet29DestroyEntity.java b/src/net/minecraft/src/Packet29DestroyEntity.java
new file mode 100644
index 0000000..ea806fa
--- /dev/null
+++ b/src/net/minecraft/src/Packet29DestroyEntity.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet29DestroyEntity extends Packet {
+ public int entityId;
+
+ public Packet29DestroyEntity() {
+ }
+
+ public Packet29DestroyEntity(int var1) {
+ this.entityId = var1;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleDestroyEntity(this);
+ }
+
+ public int getPacketSize() {
+ return 4;
+ }
+}
diff --git a/src/net/minecraft/src/Packet2Handshake.java b/src/net/minecraft/src/Packet2Handshake.java
new file mode 100644
index 0000000..d4a28cc
--- /dev/null
+++ b/src/net/minecraft/src/Packet2Handshake.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet2Handshake extends Packet {
+ public String username;
+
+ public Packet2Handshake() {
+ }
+
+ public Packet2Handshake(String var1) {
+ this.username = var1;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.username = readString(var1, 32);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ writeString(this.username, var1);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleHandshake(this);
+ }
+
+ public int getPacketSize() {
+ return 4 + this.username.length() + 4;
+ }
+}
diff --git a/src/net/minecraft/src/Packet30Entity.java b/src/net/minecraft/src/Packet30Entity.java
new file mode 100644
index 0000000..72c78dc
--- /dev/null
+++ b/src/net/minecraft/src/Packet30Entity.java
@@ -0,0 +1,38 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet30Entity extends Packet {
+ public int entityId;
+ public byte xPosition;
+ public byte yPosition;
+ public byte zPosition;
+ public byte yaw;
+ public byte pitch;
+ public boolean rotating = false;
+
+ public Packet30Entity() {
+ }
+
+ public Packet30Entity(int var1) {
+ this.entityId = var1;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleEntity(this);
+ }
+
+ public int getPacketSize() {
+ return 4;
+ }
+}
diff --git a/src/net/minecraft/src/Packet31RelEntityMove.java b/src/net/minecraft/src/Packet31RelEntityMove.java
new file mode 100644
index 0000000..87e1eef
--- /dev/null
+++ b/src/net/minecraft/src/Packet31RelEntityMove.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet31RelEntityMove extends Packet30Entity {
+ public Packet31RelEntityMove() {
+ }
+
+ public Packet31RelEntityMove(int var1, byte var2, byte var3, byte var4) {
+ super(var1);
+ this.xPosition = var2;
+ this.yPosition = var3;
+ this.zPosition = var4;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ super.readPacketData(var1);
+ this.xPosition = var1.readByte();
+ this.yPosition = var1.readByte();
+ this.zPosition = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ super.writePacketData(var1);
+ var1.writeByte(this.xPosition);
+ var1.writeByte(this.yPosition);
+ var1.writeByte(this.zPosition);
+ }
+
+ public int getPacketSize() {
+ return 7;
+ }
+}
diff --git a/src/net/minecraft/src/Packet32EntityLook.java b/src/net/minecraft/src/Packet32EntityLook.java
new file mode 100644
index 0000000..8402123
--- /dev/null
+++ b/src/net/minecraft/src/Packet32EntityLook.java
@@ -0,0 +1,34 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet32EntityLook extends Packet30Entity {
+ public Packet32EntityLook() {
+ this.rotating = true;
+ }
+
+ public Packet32EntityLook(int var1, byte var2, byte var3) {
+ super(var1);
+ this.yaw = var2;
+ this.pitch = var3;
+ this.rotating = true;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ super.readPacketData(var1);
+ this.yaw = var1.readByte();
+ this.pitch = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ super.writePacketData(var1);
+ var1.writeByte(this.yaw);
+ var1.writeByte(this.pitch);
+ }
+
+ public int getPacketSize() {
+ return 6;
+ }
+}
diff --git a/src/net/minecraft/src/Packet33RelEntityMoveLook.java b/src/net/minecraft/src/Packet33RelEntityMoveLook.java
new file mode 100644
index 0000000..012f84b
--- /dev/null
+++ b/src/net/minecraft/src/Packet33RelEntityMoveLook.java
@@ -0,0 +1,43 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet33RelEntityMoveLook extends Packet30Entity {
+ public Packet33RelEntityMoveLook() {
+ this.rotating = true;
+ }
+
+ public Packet33RelEntityMoveLook(int var1, byte var2, byte var3, byte var4, byte var5, byte var6) {
+ super(var1);
+ this.xPosition = var2;
+ this.yPosition = var3;
+ this.zPosition = var4;
+ this.yaw = var5;
+ this.pitch = var6;
+ this.rotating = true;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ super.readPacketData(var1);
+ this.xPosition = var1.readByte();
+ this.yPosition = var1.readByte();
+ this.zPosition = var1.readByte();
+ this.yaw = var1.readByte();
+ this.pitch = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ super.writePacketData(var1);
+ var1.writeByte(this.xPosition);
+ var1.writeByte(this.yPosition);
+ var1.writeByte(this.zPosition);
+ var1.writeByte(this.yaw);
+ var1.writeByte(this.pitch);
+ }
+
+ public int getPacketSize() {
+ return 9;
+ }
+}
diff --git a/src/net/minecraft/src/Packet34EntityTeleport.java b/src/net/minecraft/src/Packet34EntityTeleport.java
new file mode 100644
index 0000000..4ac3240
--- /dev/null
+++ b/src/net/minecraft/src/Packet34EntityTeleport.java
@@ -0,0 +1,61 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet34EntityTeleport extends Packet {
+ public int entityId;
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public byte yaw;
+ public byte pitch;
+
+ public Packet34EntityTeleport() {
+ }
+
+ public Packet34EntityTeleport(Entity var1) {
+ this.entityId = var1.entityId;
+ this.xPosition = MathHelper.floor_double(var1.posX * 32.0D);
+ this.yPosition = MathHelper.floor_double(var1.posY * 32.0D);
+ this.zPosition = MathHelper.floor_double(var1.posZ * 32.0D);
+ this.yaw = (byte)((int)(var1.rotationYaw * 256.0F / 360.0F));
+ this.pitch = (byte)((int)(var1.rotationPitch * 256.0F / 360.0F));
+ }
+
+ public Packet34EntityTeleport(int var1, int var2, int var3, int var4, byte var5, byte var6) {
+ this.entityId = var1;
+ this.xPosition = var2;
+ this.yPosition = var3;
+ this.zPosition = var4;
+ this.yaw = var5;
+ this.pitch = var6;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readInt();
+ this.zPosition = var1.readInt();
+ this.yaw = (byte)var1.read();
+ this.pitch = (byte)var1.read();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ var1.writeInt(this.xPosition);
+ var1.writeInt(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.write(this.yaw);
+ var1.write(this.pitch);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleEntityTeleport(this);
+ }
+
+ public int getPacketSize() {
+ return 34;
+ }
+}
diff --git a/src/net/minecraft/src/Packet38EntityStatus.java b/src/net/minecraft/src/Packet38EntityStatus.java
new file mode 100644
index 0000000..63f44da
--- /dev/null
+++ b/src/net/minecraft/src/Packet38EntityStatus.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet38EntityStatus extends Packet {
+ public int entityId;
+ public byte entityStatus;
+
+ public Packet38EntityStatus() {
+ }
+
+ public Packet38EntityStatus(int var1, byte var2) {
+ this.entityId = var1;
+ this.entityStatus = var2;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.entityStatus = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ var1.writeByte(this.entityStatus);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_9001_a(this);
+ }
+
+ public int getPacketSize() {
+ return 5;
+ }
+}
diff --git a/src/net/minecraft/src/Packet39AttachEntity.java b/src/net/minecraft/src/Packet39AttachEntity.java
new file mode 100644
index 0000000..a691593
--- /dev/null
+++ b/src/net/minecraft/src/Packet39AttachEntity.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet39AttachEntity extends Packet {
+ public int entityId;
+ public int vehicleEntityId;
+
+ public Packet39AttachEntity() {
+ }
+
+ public Packet39AttachEntity(Entity var1, Entity var2) {
+ this.entityId = var1.entityId;
+ this.vehicleEntityId = var2 != null ? var2.entityId : -1;
+ }
+
+ public int getPacketSize() {
+ return 8;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.vehicleEntityId = var1.readInt();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ var1.writeInt(this.vehicleEntityId);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_6003_a(this);
+ }
+}
diff --git a/src/net/minecraft/src/Packet3Chat.java b/src/net/minecraft/src/Packet3Chat.java
new file mode 100644
index 0000000..baa9eb3
--- /dev/null
+++ b/src/net/minecraft/src/Packet3Chat.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet3Chat extends Packet {
+ public String message;
+
+ public Packet3Chat() {
+ }
+
+ public Packet3Chat(String var1) {
+ if(var1.length() > 119) {
+ var1 = var1.substring(0, 119);
+ }
+
+ this.message = var1;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.message = readString(var1, 119);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ writeString(this.message, var1);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleChat(this);
+ }
+
+ public int getPacketSize() {
+ return this.message.length();
+ }
+}
diff --git a/src/net/minecraft/src/Packet40EntityMetadata.java b/src/net/minecraft/src/Packet40EntityMetadata.java
new file mode 100644
index 0000000..ede0937
--- /dev/null
+++ b/src/net/minecraft/src/Packet40EntityMetadata.java
@@ -0,0 +1,37 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+public class Packet40EntityMetadata extends Packet {
+ public int entityId;
+ private List field_21018_b;
+
+ public Packet40EntityMetadata() {
+ }
+
+ public Packet40EntityMetadata(int var1, DataWatcher var2) {
+ this.entityId = var1;
+ this.field_21018_b = var2.getChangedObjects();
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityId = var1.readInt();
+ this.field_21018_b = DataWatcher.readWatchableObjects(var1);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityId);
+ DataWatcher.writeObjectsInListToStream(this.field_21018_b, var1);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_21002_a(this);
+ }
+
+ public int getPacketSize() {
+ return 5;
+ }
+}
diff --git a/src/net/minecraft/src/Packet4UpdateTime.java b/src/net/minecraft/src/Packet4UpdateTime.java
new file mode 100644
index 0000000..d3331e8
--- /dev/null
+++ b/src/net/minecraft/src/Packet4UpdateTime.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet4UpdateTime extends Packet {
+ public long time;
+
+ public Packet4UpdateTime() {
+ }
+
+ public Packet4UpdateTime(long var1) {
+ this.time = var1;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.time = var1.readLong();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeLong(this.time);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleUpdateTime(this);
+ }
+
+ public int getPacketSize() {
+ return 8;
+ }
+}
diff --git a/src/net/minecraft/src/Packet50PreChunk.java b/src/net/minecraft/src/Packet50PreChunk.java
new file mode 100644
index 0000000..d16546d
--- /dev/null
+++ b/src/net/minecraft/src/Packet50PreChunk.java
@@ -0,0 +1,42 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet50PreChunk extends Packet {
+ public int xPosition;
+ public int yPosition;
+ public boolean mode;
+
+ public Packet50PreChunk() {
+ this.isChunkDataPacket = false;
+ }
+
+ public Packet50PreChunk(int var1, int var2, boolean var3) {
+ this.isChunkDataPacket = false;
+ this.xPosition = var1;
+ this.yPosition = var2;
+ this.mode = var3;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readInt();
+ this.mode = var1.read() != 0;
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.xPosition);
+ var1.writeInt(this.yPosition);
+ var1.write(this.mode ? 1 : 0);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handlePreChunk(this);
+ }
+
+ public int getPacketSize() {
+ return 9;
+ }
+}
diff --git a/src/net/minecraft/src/Packet51MapChunk.java b/src/net/minecraft/src/Packet51MapChunk.java
new file mode 100644
index 0000000..53d3724
--- /dev/null
+++ b/src/net/minecraft/src/Packet51MapChunk.java
@@ -0,0 +1,88 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.zip.DataFormatException;
+import java.util.zip.Deflater;
+import java.util.zip.Inflater;
+
+public class Packet51MapChunk extends Packet {
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public int xSize;
+ public int ySize;
+ public int zSize;
+ public byte[] chunk;
+ private int chunkSize;
+
+ public Packet51MapChunk() {
+ this.isChunkDataPacket = true;
+ }
+
+ public Packet51MapChunk(int var1, int var2, int var3, int var4, int var5, int var6, World var7) {
+ this.isChunkDataPacket = true;
+ this.xPosition = var1;
+ this.yPosition = var2;
+ this.zPosition = var3;
+ this.xSize = var4;
+ this.ySize = var5;
+ this.zSize = var6;
+ byte[] var8 = var7.getChunkData(var1, var2, var3, var4, var5, var6);
+ Deflater var9 = new Deflater(-1);
+
+ try {
+ var9.setInput(var8);
+ var9.finish();
+ this.chunk = new byte[var4 * var5 * var6 * 5 / 2];
+ this.chunkSize = var9.deflate(this.chunk);
+ } finally {
+ var9.end();
+ }
+
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readShort();
+ this.zPosition = var1.readInt();
+ this.xSize = var1.read() + 1;
+ this.ySize = var1.read() + 1;
+ this.zSize = var1.read() + 1;
+ this.chunkSize = var1.readInt();
+ byte[] var2 = new byte[this.chunkSize];
+ var1.readFully(var2);
+ this.chunk = new byte[this.xSize * this.ySize * this.zSize * 5 / 2];
+ Inflater var3 = new Inflater();
+ var3.setInput(var2);
+
+ try {
+ var3.inflate(this.chunk);
+ } catch (DataFormatException var8) {
+ throw new IOException("Bad compressed data format");
+ } finally {
+ var3.end();
+ }
+
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.xPosition);
+ var1.writeShort(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.write(this.xSize - 1);
+ var1.write(this.ySize - 1);
+ var1.write(this.zSize - 1);
+ var1.writeInt(this.chunkSize);
+ var1.write(this.chunk, 0, this.chunkSize);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleMapChunk(this);
+ }
+
+ public int getPacketSize() {
+ return 17 + this.chunkSize;
+ }
+}
diff --git a/src/net/minecraft/src/Packet52MultiBlockChange.java b/src/net/minecraft/src/Packet52MultiBlockChange.java
new file mode 100644
index 0000000..f0fe916
--- /dev/null
+++ b/src/net/minecraft/src/Packet52MultiBlockChange.java
@@ -0,0 +1,76 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet52MultiBlockChange extends Packet {
+ public int xPosition;
+ public int zPosition;
+ public short[] coordinateArray;
+ public byte[] typeArray;
+ public byte[] metadataArray;
+ public int size;
+
+ public Packet52MultiBlockChange() {
+ this.isChunkDataPacket = true;
+ }
+
+ public Packet52MultiBlockChange(int var1, int var2, short[] var3, int var4, World var5) {
+ this.isChunkDataPacket = true;
+ this.xPosition = var1;
+ this.zPosition = var2;
+ this.size = var4;
+ this.coordinateArray = new short[var4];
+ this.typeArray = new byte[var4];
+ this.metadataArray = new byte[var4];
+ Chunk var6 = var5.getChunkFromChunkCoords(var1, var2);
+
+ for(int var7 = 0; var7 < var4; ++var7) {
+ int var8 = var3[var7] >> 12 & 15;
+ int var9 = var3[var7] >> 8 & 15;
+ int var10 = var3[var7] & 255;
+ this.coordinateArray[var7] = var3[var7];
+ this.typeArray[var7] = (byte)var6.getBlockID(var8, var10, var9);
+ this.metadataArray[var7] = (byte)var6.getBlockMetadata(var8, var10, var9);
+ }
+
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xPosition = var1.readInt();
+ this.zPosition = var1.readInt();
+ this.size = var1.readShort() & '\uffff';
+ this.coordinateArray = new short[this.size];
+ this.typeArray = new byte[this.size];
+ this.metadataArray = new byte[this.size];
+
+ for(int var2 = 0; var2 < this.size; ++var2) {
+ this.coordinateArray[var2] = var1.readShort();
+ }
+
+ var1.readFully(this.typeArray);
+ var1.readFully(this.metadataArray);
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.xPosition);
+ var1.writeInt(this.zPosition);
+ var1.writeShort((short)this.size);
+
+ for(int var2 = 0; var2 < this.size; ++var2) {
+ var1.writeShort(this.coordinateArray[var2]);
+ }
+
+ var1.write(this.typeArray);
+ var1.write(this.metadataArray);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleMultiBlockChange(this);
+ }
+
+ public int getPacketSize() {
+ return 10 + this.size * 4;
+ }
+}
diff --git a/src/net/minecraft/src/Packet53BlockChange.java b/src/net/minecraft/src/Packet53BlockChange.java
new file mode 100644
index 0000000..132f795
--- /dev/null
+++ b/src/net/minecraft/src/Packet53BlockChange.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet53BlockChange extends Packet {
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+ public int type;
+ public int metadata;
+
+ public Packet53BlockChange() {
+ this.isChunkDataPacket = true;
+ }
+
+ public Packet53BlockChange(int var1, int var2, int var3, World var4) {
+ this.isChunkDataPacket = true;
+ this.xPosition = var1;
+ this.yPosition = var2;
+ this.zPosition = var3;
+ this.type = var4.getBlockId(var1, var2, var3);
+ this.metadata = var4.getBlockMetadata(var1, var2, var3);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.read();
+ this.zPosition = var1.readInt();
+ this.type = var1.read();
+ this.metadata = var1.read();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.xPosition);
+ var1.write(this.yPosition);
+ var1.writeInt(this.zPosition);
+ var1.write(this.type);
+ var1.write(this.metadata);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleBlockChange(this);
+ }
+
+ public int getPacketSize() {
+ return 11;
+ }
+}
diff --git a/src/net/minecraft/src/Packet54PlayNoteBlock.java b/src/net/minecraft/src/Packet54PlayNoteBlock.java
new file mode 100644
index 0000000..9526c9a
--- /dev/null
+++ b/src/net/minecraft/src/Packet54PlayNoteBlock.java
@@ -0,0 +1,48 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet54PlayNoteBlock extends Packet {
+ public int xLocation;
+ public int yLocation;
+ public int zLocation;
+ public int instrumentType;
+ public int pitch;
+
+ public Packet54PlayNoteBlock() {
+ }
+
+ public Packet54PlayNoteBlock(int var1, int var2, int var3, int var4, int var5) {
+ this.xLocation = var1;
+ this.yLocation = var2;
+ this.zLocation = var3;
+ this.instrumentType = var4;
+ this.pitch = var5;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xLocation = var1.readInt();
+ this.yLocation = var1.readShort();
+ this.zLocation = var1.readInt();
+ this.instrumentType = var1.read();
+ this.pitch = var1.read();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.xLocation);
+ var1.writeShort(this.yLocation);
+ var1.writeInt(this.zLocation);
+ var1.write(this.instrumentType);
+ var1.write(this.pitch);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_21004_a(this);
+ }
+
+ public int getPacketSize() {
+ return 12;
+ }
+}
diff --git a/src/net/minecraft/src/Packet5PlayerInventory.java b/src/net/minecraft/src/Packet5PlayerInventory.java
new file mode 100644
index 0000000..f94dc18
--- /dev/null
+++ b/src/net/minecraft/src/Packet5PlayerInventory.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet5PlayerInventory extends Packet {
+ public int entityID;
+ public int slot;
+ public int itemID;
+ public int itemDamage;
+
+ public Packet5PlayerInventory() {
+ }
+
+ public Packet5PlayerInventory(int var1, int var2, ItemStack var3) {
+ this.entityID = var1;
+ this.slot = var2;
+ if(var3 == null) {
+ this.itemID = -1;
+ this.itemDamage = 0;
+ } else {
+ this.itemID = var3.itemID;
+ this.itemDamage = var3.getItemDamage();
+ }
+
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.entityID = var1.readInt();
+ this.slot = var1.readShort();
+ this.itemID = var1.readShort();
+ this.itemDamage = var1.readShort();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.entityID);
+ var1.writeShort(this.slot);
+ var1.writeShort(this.itemID);
+ var1.writeShort(this.itemDamage);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handlePlayerInventory(this);
+ }
+
+ public int getPacketSize() {
+ return 8;
+ }
+}
diff --git a/src/net/minecraft/src/Packet60Explosion.java b/src/net/minecraft/src/Packet60Explosion.java
new file mode 100644
index 0000000..4889627
--- /dev/null
+++ b/src/net/minecraft/src/Packet60Explosion.java
@@ -0,0 +1,78 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+public class Packet60Explosion extends Packet {
+ public double explosionX;
+ public double explosionY;
+ public double explosionZ;
+ public float explosionSize;
+ public Set destroyedBlockPositions;
+
+ public Packet60Explosion() {
+ }
+
+ public Packet60Explosion(double var1, double var3, double var5, float var7, Set var8) {
+ this.explosionX = var1;
+ this.explosionY = var3;
+ this.explosionZ = var5;
+ this.explosionSize = var7;
+ this.destroyedBlockPositions = new HashSet(var8);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.explosionX = var1.readDouble();
+ this.explosionY = var1.readDouble();
+ this.explosionZ = var1.readDouble();
+ this.explosionSize = var1.readFloat();
+ int var2 = var1.readInt();
+ this.destroyedBlockPositions = new HashSet();
+ int var3 = (int)this.explosionX;
+ int var4 = (int)this.explosionY;
+ int var5 = (int)this.explosionZ;
+
+ for(int var6 = 0; var6 < var2; ++var6) {
+ int var7 = var1.readByte() + var3;
+ int var8 = var1.readByte() + var4;
+ int var9 = var1.readByte() + var5;
+ this.destroyedBlockPositions.add(new ChunkPosition(var7, var8, var9));
+ }
+
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeDouble(this.explosionX);
+ var1.writeDouble(this.explosionY);
+ var1.writeDouble(this.explosionZ);
+ var1.writeFloat(this.explosionSize);
+ var1.writeInt(this.destroyedBlockPositions.size());
+ int var2 = (int)this.explosionX;
+ int var3 = (int)this.explosionY;
+ int var4 = (int)this.explosionZ;
+ Iterator var5 = this.destroyedBlockPositions.iterator();
+
+ while(var5.hasNext()) {
+ ChunkPosition var6 = (ChunkPosition)var5.next();
+ int var7 = var6.x - var2;
+ int var8 = var6.y - var3;
+ int var9 = var6.z - var4;
+ var1.writeByte(var7);
+ var1.writeByte(var8);
+ var1.writeByte(var9);
+ }
+
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_12001_a(this);
+ }
+
+ public int getPacketSize() {
+ return 32 + this.destroyedBlockPositions.size() * 3;
+ }
+}
diff --git a/src/net/minecraft/src/Packet61DoorChange.java b/src/net/minecraft/src/Packet61DoorChange.java
new file mode 100644
index 0000000..bd2a59f
--- /dev/null
+++ b/src/net/minecraft/src/Packet61DoorChange.java
@@ -0,0 +1,48 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet61DoorChange extends Packet {
+ public int field_28047_a;
+ public int field_28046_b;
+ public int field_28050_c;
+ public int field_28049_d;
+ public int field_28048_e;
+
+ public Packet61DoorChange() {
+ }
+
+ public Packet61DoorChange(int var1, int var2, int var3, int var4, int var5) {
+ this.field_28047_a = var1;
+ this.field_28050_c = var2;
+ this.field_28049_d = var3;
+ this.field_28048_e = var4;
+ this.field_28046_b = var5;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.field_28047_a = var1.readInt();
+ this.field_28050_c = var1.readInt();
+ this.field_28049_d = var1.readByte();
+ this.field_28048_e = var1.readInt();
+ this.field_28046_b = var1.readInt();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.field_28047_a);
+ var1.writeInt(this.field_28050_c);
+ var1.writeByte(this.field_28049_d);
+ var1.writeInt(this.field_28048_e);
+ var1.writeInt(this.field_28046_b);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_28002_a(this);
+ }
+
+ public int getPacketSize() {
+ return 20;
+ }
+}
diff --git a/src/net/minecraft/src/Packet6SpawnPosition.java b/src/net/minecraft/src/Packet6SpawnPosition.java
new file mode 100644
index 0000000..1cbf443
--- /dev/null
+++ b/src/net/minecraft/src/Packet6SpawnPosition.java
@@ -0,0 +1,40 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet6SpawnPosition extends Packet {
+ public int xPosition;
+ public int yPosition;
+ public int zPosition;
+
+ public Packet6SpawnPosition() {
+ }
+
+ public Packet6SpawnPosition(int var1, int var2, int var3) {
+ this.xPosition = var1;
+ this.yPosition = var2;
+ this.zPosition = var3;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.xPosition = var1.readInt();
+ this.yPosition = var1.readInt();
+ this.zPosition = var1.readInt();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.xPosition);
+ var1.writeInt(this.yPosition);
+ var1.writeInt(this.zPosition);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleSpawnPosition(this);
+ }
+
+ public int getPacketSize() {
+ return 12;
+ }
+}
diff --git a/src/net/minecraft/src/Packet70Bed.java b/src/net/minecraft/src/Packet70Bed.java
new file mode 100644
index 0000000..2594f41
--- /dev/null
+++ b/src/net/minecraft/src/Packet70Bed.java
@@ -0,0 +1,33 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet70Bed extends Packet {
+ public static final String[] field_25016_a = new String[]{"tile.bed.notValid", null, null};
+ public int field_25015_b;
+
+ public Packet70Bed() {
+ }
+
+ public Packet70Bed(int var1) {
+ this.field_25015_b = var1;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.field_25015_b = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeByte(this.field_25015_b);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_25001_a(this);
+ }
+
+ public int getPacketSize() {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/Packet71Weather.java b/src/net/minecraft/src/Packet71Weather.java
new file mode 100644
index 0000000..8185458
--- /dev/null
+++ b/src/net/minecraft/src/Packet71Weather.java
@@ -0,0 +1,51 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet71Weather extends Packet {
+ public int field_27043_a;
+ public int field_27042_b;
+ public int field_27046_c;
+ public int field_27045_d;
+ public int field_27044_e;
+
+ public Packet71Weather() {
+ }
+
+ public Packet71Weather(Entity var1) {
+ this.field_27043_a = var1.entityId;
+ this.field_27042_b = MathHelper.floor_double(var1.posX * 32.0D);
+ this.field_27046_c = MathHelper.floor_double(var1.posY * 32.0D);
+ this.field_27045_d = MathHelper.floor_double(var1.posZ * 32.0D);
+ if(var1 instanceof EntityLightningBolt) {
+ this.field_27044_e = 1;
+ }
+
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.field_27043_a = var1.readInt();
+ this.field_27044_e = var1.readByte();
+ this.field_27042_b = var1.readInt();
+ this.field_27046_c = var1.readInt();
+ this.field_27045_d = var1.readInt();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.field_27043_a);
+ var1.writeByte(this.field_27044_e);
+ var1.writeInt(this.field_27042_b);
+ var1.writeInt(this.field_27046_c);
+ var1.writeInt(this.field_27045_d);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_27002_a(this);
+ }
+
+ public int getPacketSize() {
+ return 17;
+ }
+}
diff --git a/src/net/minecraft/src/Packet7UseEntity.java b/src/net/minecraft/src/Packet7UseEntity.java
new file mode 100644
index 0000000..0c6e489
--- /dev/null
+++ b/src/net/minecraft/src/Packet7UseEntity.java
@@ -0,0 +1,31 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet7UseEntity extends Packet {
+ public int playerEntityId;
+ public int targetEntity;
+ public int isLeftClick;
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.playerEntityId = var1.readInt();
+ this.targetEntity = var1.readInt();
+ this.isLeftClick = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeInt(this.playerEntityId);
+ var1.writeInt(this.targetEntity);
+ var1.writeByte(this.isLeftClick);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.func_6006_a(this);
+ }
+
+ public int getPacketSize() {
+ return 9;
+ }
+}
diff --git a/src/net/minecraft/src/Packet8UpdateHealth.java b/src/net/minecraft/src/Packet8UpdateHealth.java
new file mode 100644
index 0000000..7870825
--- /dev/null
+++ b/src/net/minecraft/src/Packet8UpdateHealth.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet8UpdateHealth extends Packet {
+ public int healthMP;
+
+ public Packet8UpdateHealth() {
+ }
+
+ public Packet8UpdateHealth(int var1) {
+ this.healthMP = var1;
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.healthMP = var1.readShort();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeShort(this.healthMP);
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleHealth(this);
+ }
+
+ public int getPacketSize() {
+ return 2;
+ }
+}
diff --git a/src/net/minecraft/src/Packet9Respawn.java b/src/net/minecraft/src/Packet9Respawn.java
new file mode 100644
index 0000000..8bcb58b
--- /dev/null
+++ b/src/net/minecraft/src/Packet9Respawn.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+public class Packet9Respawn extends Packet {
+ public byte field_28045_a;
+
+ public Packet9Respawn() {
+ }
+
+ public Packet9Respawn(byte var1) {
+ this.field_28045_a = var1;
+ }
+
+ public void processPacket(NetHandler var1) {
+ var1.handleRespawnPacket(this);
+ }
+
+ public void readPacketData(DataInputStream var1) throws IOException {
+ this.field_28045_a = var1.readByte();
+ }
+
+ public void writePacketData(DataOutputStream var1) throws IOException {
+ var1.writeByte(this.field_28045_a);
+ }
+
+ public int getPacketSize() {
+ return 1;
+ }
+}
diff --git a/src/net/minecraft/src/PacketCounter.java b/src/net/minecraft/src/PacketCounter.java
new file mode 100644
index 0000000..0b6fb45
--- /dev/null
+++ b/src/net/minecraft/src/PacketCounter.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+class PacketCounter {
+ private int totalPackets;
+ private long totalBytes;
+
+ private PacketCounter() {
+ }
+
+ public void addPacket(int var1) {
+ ++this.totalPackets;
+ this.totalBytes += (long)var1;
+ }
+
+ PacketCounter(Empty1 var1) {
+ this();
+ }
+}
diff --git a/src/net/minecraft/src/Path.java b/src/net/minecraft/src/Path.java
new file mode 100644
index 0000000..ce289f0
--- /dev/null
+++ b/src/net/minecraft/src/Path.java
@@ -0,0 +1,119 @@
+package net.minecraft.src;
+
+public class Path {
+ private PathPoint[] pathPoints = new PathPoint[1024];
+ private int count = 0;
+
+ public PathPoint addPoint(PathPoint var1) {
+ if(var1.index >= 0) {
+ throw new IllegalStateException("OW KNOWS!");
+ } else {
+ if(this.count == this.pathPoints.length) {
+ PathPoint[] var2 = new PathPoint[this.count << 1];
+ System.arraycopy(this.pathPoints, 0, var2, 0, this.count);
+ this.pathPoints = var2;
+ }
+
+ this.pathPoints[this.count] = var1;
+ var1.index = this.count;
+ this.sortBack(this.count++);
+ return var1;
+ }
+ }
+
+ public void clearPath() {
+ this.count = 0;
+ }
+
+ public PathPoint dequeue() {
+ PathPoint var1 = this.pathPoints[0];
+ this.pathPoints[0] = this.pathPoints[--this.count];
+ this.pathPoints[this.count] = null;
+ if(this.count > 0) {
+ this.sortForward(0);
+ }
+
+ var1.index = -1;
+ return var1;
+ }
+
+ public void changeDistance(PathPoint var1, float var2) {
+ float var3 = var1.distanceToTarget;
+ var1.distanceToTarget = var2;
+ if(var2 < var3) {
+ this.sortBack(var1.index);
+ } else {
+ this.sortForward(var1.index);
+ }
+
+ }
+
+ private void sortBack(int var1) {
+ PathPoint var2 = this.pathPoints[var1];
+
+ int var4;
+ for(float var3 = var2.distanceToTarget; var1 > 0; var1 = var4) {
+ var4 = var1 - 1 >> 1;
+ PathPoint var5 = this.pathPoints[var4];
+ if(var3 >= var5.distanceToTarget) {
+ break;
+ }
+
+ this.pathPoints[var1] = var5;
+ var5.index = var1;
+ }
+
+ this.pathPoints[var1] = var2;
+ var2.index = var1;
+ }
+
+ private void sortForward(int var1) {
+ PathPoint var2 = this.pathPoints[var1];
+ float var3 = var2.distanceToTarget;
+
+ while(true) {
+ int var4 = 1 + (var1 << 1);
+ int var5 = var4 + 1;
+ if(var4 >= this.count) {
+ break;
+ }
+
+ PathPoint var6 = this.pathPoints[var4];
+ float var7 = var6.distanceToTarget;
+ PathPoint var8;
+ float var9;
+ if(var5 >= this.count) {
+ var8 = null;
+ var9 = Float.POSITIVE_INFINITY;
+ } else {
+ var8 = this.pathPoints[var5];
+ var9 = var8.distanceToTarget;
+ }
+
+ if(var7 < var9) {
+ if(var7 >= var3) {
+ break;
+ }
+
+ this.pathPoints[var1] = var6;
+ var6.index = var1;
+ var1 = var4;
+ } else {
+ if(var9 >= var3) {
+ break;
+ }
+
+ this.pathPoints[var1] = var8;
+ var8.index = var1;
+ var1 = var5;
+ }
+ }
+
+ this.pathPoints[var1] = var2;
+ var2.index = var1;
+ }
+
+ public boolean isPathEmpty() {
+ return this.count == 0;
+ }
+}
diff --git a/src/net/minecraft/src/PathEntity.java b/src/net/minecraft/src/PathEntity.java
new file mode 100644
index 0000000..04de79a
--- /dev/null
+++ b/src/net/minecraft/src/PathEntity.java
@@ -0,0 +1,31 @@
+package net.minecraft.src;
+
+public class PathEntity {
+ private final PathPoint[] points;
+ public final int pathLength;
+ private int pathIndex;
+
+ public PathEntity(PathPoint[] var1) {
+ this.points = var1;
+ this.pathLength = var1.length;
+ }
+
+ public void incrementPathIndex() {
+ ++this.pathIndex;
+ }
+
+ public boolean isFinished() {
+ return this.pathIndex >= this.points.length;
+ }
+
+ public PathPoint func_22211_c() {
+ return this.pathLength > 0 ? this.points[this.pathLength - 1] : null;
+ }
+
+ public Vec3D getPosition(Entity var1) {
+ double var2 = (double)this.points[this.pathIndex].xCoord + (double)((int)(var1.width + 1.0F)) * 0.5D;
+ double var4 = (double)this.points[this.pathIndex].yCoord;
+ double var6 = (double)this.points[this.pathIndex].zCoord + (double)((int)(var1.width + 1.0F)) * 0.5D;
+ return Vec3D.createVector(var2, var4, var6);
+ }
+}
diff --git a/src/net/minecraft/src/PathPoint.java b/src/net/minecraft/src/PathPoint.java
new file mode 100644
index 0000000..2c933eb
--- /dev/null
+++ b/src/net/minecraft/src/PathPoint.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+public class PathPoint {
+ public final int xCoord;
+ public final int yCoord;
+ public final int zCoord;
+ private final int hash;
+ int index = -1;
+ float totalPathDistance;
+ float distanceToNext;
+ float distanceToTarget;
+ PathPoint previous;
+ public boolean isFirst = false;
+
+ public PathPoint(int var1, int var2, int var3) {
+ this.xCoord = var1;
+ this.yCoord = var2;
+ this.zCoord = var3;
+ this.hash = func_22203_a(var1, var2, var3);
+ }
+
+ public static int func_22203_a(int var0, int var1, int var2) {
+ return var1 & 255 | (var0 & Short.MAX_VALUE) << 8 | (var2 & Short.MAX_VALUE) << 24 | (var0 < 0 ? Integer.MIN_VALUE : 0) | (var2 < 0 ? -Short.MIN_VALUE : 0);
+ }
+
+ public float distanceTo(PathPoint var1) {
+ float var2 = (float)(var1.xCoord - this.xCoord);
+ float var3 = (float)(var1.yCoord - this.yCoord);
+ float var4 = (float)(var1.zCoord - this.zCoord);
+ return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4);
+ }
+
+ public boolean equals(Object var1) {
+ if(!(var1 instanceof PathPoint)) {
+ return false;
+ } else {
+ PathPoint var2 = (PathPoint)var1;
+ return this.hash == var2.hash && this.xCoord == var2.xCoord && this.yCoord == var2.yCoord && this.zCoord == var2.zCoord;
+ }
+ }
+
+ public int hashCode() {
+ return this.hash;
+ }
+
+ public boolean isAssigned() {
+ return this.index >= 0;
+ }
+
+ public String toString() {
+ return this.xCoord + ", " + this.yCoord + ", " + this.zCoord;
+ }
+}
diff --git a/src/net/minecraft/src/Pathfinder.java b/src/net/minecraft/src/Pathfinder.java
new file mode 100644
index 0000000..6fc3678
--- /dev/null
+++ b/src/net/minecraft/src/Pathfinder.java
@@ -0,0 +1,209 @@
+package net.minecraft.src;
+
+public class Pathfinder {
+ private IBlockAccess worldMap;
+ private Path path = new Path();
+ private MCHash pointMap = new MCHash();
+ private PathPoint[] pathOptions = new PathPoint[32];
+
+ public Pathfinder(IBlockAccess var1) {
+ this.worldMap = var1;
+ }
+
+ public PathEntity createEntityPathTo(Entity var1, Entity var2, float var3) {
+ return this.createEntityPathTo(var1, var2.posX, var2.boundingBox.minY, var2.posZ, var3);
+ }
+
+ public PathEntity createEntityPathTo(Entity var1, int var2, int var3, int var4, float var5) {
+ return this.createEntityPathTo(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), var5);
+ }
+
+ private PathEntity createEntityPathTo(Entity var1, double var2, double var4, double var6, float var8) {
+ this.path.clearPath();
+ this.pointMap.clearMap();
+ PathPoint var9 = this.openPoint(MathHelper.floor_double(var1.boundingBox.minX), MathHelper.floor_double(var1.boundingBox.minY), MathHelper.floor_double(var1.boundingBox.minZ));
+ PathPoint var10 = this.openPoint(MathHelper.floor_double(var2 - (double)(var1.width / 2.0F)), MathHelper.floor_double(var4), MathHelper.floor_double(var6 - (double)(var1.width / 2.0F)));
+ PathPoint var11 = new PathPoint(MathHelper.floor_float(var1.width + 1.0F), MathHelper.floor_float(var1.height + 1.0F), MathHelper.floor_float(var1.width + 1.0F));
+ PathEntity var12 = this.addToPath(var1, var9, var10, var11, var8);
+ return var12;
+ }
+
+ private PathEntity addToPath(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) {
+ var2.totalPathDistance = 0.0F;
+ var2.distanceToNext = var2.distanceTo(var3);
+ var2.distanceToTarget = var2.distanceToNext;
+ this.path.clearPath();
+ this.path.addPoint(var2);
+ PathPoint var6 = var2;
+
+ while(!this.path.isPathEmpty()) {
+ PathPoint var7 = this.path.dequeue();
+ if(var7.equals(var3)) {
+ return this.createEntityPath(var2, var3);
+ }
+
+ if(var7.distanceTo(var3) < var6.distanceTo(var3)) {
+ var6 = var7;
+ }
+
+ var7.isFirst = true;
+ int var8 = this.findPathOptions(var1, var7, var4, var3, var5);
+
+ for(int var9 = 0; var9 < var8; ++var9) {
+ PathPoint var10 = this.pathOptions[var9];
+ float var11 = var7.totalPathDistance + var7.distanceTo(var10);
+ if(!var10.isAssigned() || var11 < var10.totalPathDistance) {
+ var10.previous = var7;
+ var10.totalPathDistance = var11;
+ var10.distanceToNext = var10.distanceTo(var3);
+ if(var10.isAssigned()) {
+ this.path.changeDistance(var10, var10.totalPathDistance + var10.distanceToNext);
+ } else {
+ var10.distanceToTarget = var10.totalPathDistance + var10.distanceToNext;
+ this.path.addPoint(var10);
+ }
+ }
+ }
+ }
+
+ if(var6 == var2) {
+ return null;
+ } else {
+ return this.createEntityPath(var2, var6);
+ }
+ }
+
+ private int findPathOptions(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) {
+ int var6 = 0;
+ byte var7 = 0;
+ if(this.getVerticalOffset(var1, var2.xCoord, var2.yCoord + 1, var2.zCoord, var3) == 1) {
+ var7 = 1;
+ }
+
+ PathPoint var8 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord + 1, var3, var7);
+ PathPoint var9 = this.getSafePoint(var1, var2.xCoord - 1, var2.yCoord, var2.zCoord, var3, var7);
+ PathPoint var10 = this.getSafePoint(var1, var2.xCoord + 1, var2.yCoord, var2.zCoord, var3, var7);
+ PathPoint var11 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord - 1, var3, var7);
+ if(var8 != null && !var8.isFirst && var8.distanceTo(var4) < var5) {
+ this.pathOptions[var6++] = var8;
+ }
+
+ if(var9 != null && !var9.isFirst && var9.distanceTo(var4) < var5) {
+ this.pathOptions[var6++] = var9;
+ }
+
+ if(var10 != null && !var10.isFirst && var10.distanceTo(var4) < var5) {
+ this.pathOptions[var6++] = var10;
+ }
+
+ if(var11 != null && !var11.isFirst && var11.distanceTo(var4) < var5) {
+ this.pathOptions[var6++] = var11;
+ }
+
+ return var6;
+ }
+
+ private PathPoint getSafePoint(Entity var1, int var2, int var3, int var4, PathPoint var5, int var6) {
+ PathPoint var7 = null;
+ if(this.getVerticalOffset(var1, var2, var3, var4, var5) == 1) {
+ var7 = this.openPoint(var2, var3, var4);
+ }
+
+ if(var7 == null && var6 > 0 && this.getVerticalOffset(var1, var2, var3 + var6, var4, var5) == 1) {
+ var7 = this.openPoint(var2, var3 + var6, var4);
+ var3 += var6;
+ }
+
+ if(var7 != null) {
+ int var8 = 0;
+ int var9 = 0;
+
+ while(var3 > 0) {
+ var9 = this.getVerticalOffset(var1, var2, var3 - 1, var4, var5);
+ if(var9 != 1) {
+ break;
+ }
+
+ ++var8;
+ if(var8 >= 4) {
+ return null;
+ }
+
+ --var3;
+ if(var3 > 0) {
+ var7 = this.openPoint(var2, var3, var4);
+ }
+ }
+
+ if(var9 == -2) {
+ return null;
+ }
+ }
+
+ return var7;
+ }
+
+ private final PathPoint openPoint(int var1, int var2, int var3) {
+ int var4 = PathPoint.func_22203_a(var1, var2, var3);
+ PathPoint var5 = (PathPoint)this.pointMap.lookup(var4);
+ if(var5 == null) {
+ var5 = new PathPoint(var1, var2, var3);
+ this.pointMap.addKey(var4, var5);
+ }
+
+ return var5;
+ }
+
+ private int getVerticalOffset(Entity var1, int var2, int var3, int var4, PathPoint var5) {
+ for(int var6 = var2; var6 < var2 + var5.xCoord; ++var6) {
+ for(int var7 = var3; var7 < var3 + var5.yCoord; ++var7) {
+ for(int var8 = var4; var8 < var4 + var5.zCoord; ++var8) {
+ int var9 = this.worldMap.getBlockId(var6, var7, var8);
+ if(var9 > 0) {
+ if(var9 != Block.doorSteel.blockID && var9 != Block.doorWood.blockID) {
+ Material var11 = Block.blocksList[var9].blockMaterial;
+ if(var11.getIsSolid()) {
+ return 0;
+ }
+
+ if(var11 == Material.water) {
+ return -1;
+ }
+
+ if(var11 == Material.lava) {
+ return -2;
+ }
+ } else {
+ int var10 = this.worldMap.getBlockMetadata(var6, var7, var8);
+ if(!BlockDoor.func_27036_e(var10)) {
+ return 0;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return 1;
+ }
+
+ private PathEntity createEntityPath(PathPoint var1, PathPoint var2) {
+ int var3 = 1;
+
+ PathPoint var4;
+ for(var4 = var2; var4.previous != null; var4 = var4.previous) {
+ ++var3;
+ }
+
+ PathPoint[] var5 = new PathPoint[var3];
+ var4 = var2;
+ --var3;
+
+ for(var5[var3] = var2; var4.previous != null; var5[var3] = var4) {
+ var4 = var4.previous;
+ --var3;
+ }
+
+ return new PathEntity(var5);
+ }
+}
diff --git a/src/net/minecraft/src/PistonBlockTextures.java b/src/net/minecraft/src/PistonBlockTextures.java
new file mode 100644
index 0000000..b6d264c
--- /dev/null
+++ b/src/net/minecraft/src/PistonBlockTextures.java
@@ -0,0 +1,8 @@
+package net.minecraft.src;
+
+public class PistonBlockTextures {
+ public static final int[] field_31052_a = new int[]{1, 0, 3, 2, 5, 4};
+ public static final int[] field_31051_b = new int[]{0, 0, 0, 0, -1, 1};
+ public static final int[] field_31054_c = new int[]{-1, 1, 0, 0, 0, 0};
+ public static final int[] field_31053_d = new int[]{0, 0, -1, 1, 0, 0};
+}
diff --git a/src/net/minecraft/src/PlayerHash.java b/src/net/minecraft/src/PlayerHash.java
new file mode 100644
index 0000000..f957c52
--- /dev/null
+++ b/src/net/minecraft/src/PlayerHash.java
@@ -0,0 +1,128 @@
+package net.minecraft.src;
+
+public class PlayerHash {
+ private transient PlayerHashEntry[] hashArray = new PlayerHashEntry[16];
+ private transient int numHashElements;
+ private int capacity = 12;
+ private final float percentUsable = 12.0F / 16.0F;
+ private transient volatile int field_950_e;
+
+ private static int getHashedKey(long var0) {
+ return hash((int)(var0 ^ var0 >>> 32));
+ }
+
+ private static int hash(int var0) {
+ var0 ^= var0 >>> 20 ^ var0 >>> 12;
+ return var0 ^ var0 >>> 7 ^ var0 >>> 4;
+ }
+
+ private static int getHashIndex(int var0, int var1) {
+ return var0 & var1 - 1;
+ }
+
+ public Object getValueByKey(long var1) {
+ int var3 = getHashedKey(var1);
+
+ for(PlayerHashEntry var4 = this.hashArray[getHashIndex(var3, this.hashArray.length)]; var4 != null; var4 = var4.nextEntry) {
+ if(var4.key == var1) {
+ return var4.value;
+ }
+ }
+
+ return null;
+ }
+
+ public void add(long var1, Object var3) {
+ int var4 = getHashedKey(var1);
+ int var5 = getHashIndex(var4, this.hashArray.length);
+
+ for(PlayerHashEntry var6 = this.hashArray[var5]; var6 != null; var6 = var6.nextEntry) {
+ if(var6.key == var1) {
+ var6.value = var3;
+ }
+ }
+
+ ++this.field_950_e;
+ this.createKey(var4, var1, var3, var5);
+ }
+
+ private void resizeTable(int var1) {
+ PlayerHashEntry[] var2 = this.hashArray;
+ int var3 = var2.length;
+ if(var3 == 1073741824) {
+ this.capacity = Integer.MAX_VALUE;
+ } else {
+ PlayerHashEntry[] var4 = new PlayerHashEntry[var1];
+ this.copyHashTableTo(var4);
+ this.hashArray = var4;
+ this.capacity = (int)((float)var1 * this.percentUsable);
+ }
+ }
+
+ private void copyHashTableTo(PlayerHashEntry[] var1) {
+ PlayerHashEntry[] var2 = this.hashArray;
+ int var3 = var1.length;
+
+ for(int var4 = 0; var4 < var2.length; ++var4) {
+ PlayerHashEntry var5 = var2[var4];
+ if(var5 != null) {
+ var2[var4] = null;
+
+ PlayerHashEntry var6;
+ do {
+ var6 = var5.nextEntry;
+ int var7 = getHashIndex(var5.field_1026_d, var3);
+ var5.nextEntry = var1[var7];
+ var1[var7] = var5;
+ var5 = var6;
+ } while(var6 != null);
+ }
+ }
+
+ }
+
+ public Object remove(long var1) {
+ PlayerHashEntry var3 = this.removeKey(var1);
+ return var3 == null ? null : var3.value;
+ }
+
+ final PlayerHashEntry removeKey(long var1) {
+ int var3 = getHashedKey(var1);
+ int var4 = getHashIndex(var3, this.hashArray.length);
+ PlayerHashEntry var5 = this.hashArray[var4];
+
+ PlayerHashEntry var6;
+ PlayerHashEntry var7;
+ for(var6 = var5; var6 != null; var6 = var7) {
+ var7 = var6.nextEntry;
+ if(var6.key == var1) {
+ ++this.field_950_e;
+ --this.numHashElements;
+ if(var5 == var6) {
+ this.hashArray[var4] = var7;
+ } else {
+ var5.nextEntry = var7;
+ }
+
+ return var6;
+ }
+
+ var5 = var6;
+ }
+
+ return var6;
+ }
+
+ private void createKey(int var1, long var2, Object var4, int var5) {
+ PlayerHashEntry var6 = this.hashArray[var5];
+ this.hashArray[var5] = new PlayerHashEntry(var1, var2, var4, var6);
+ if(this.numHashElements++ >= this.capacity) {
+ this.resizeTable(2 * this.hashArray.length);
+ }
+
+ }
+
+ static int getHashCode(long var0) {
+ return getHashedKey(var0);
+ }
+}
diff --git a/src/net/minecraft/src/PlayerHashEntry.java b/src/net/minecraft/src/PlayerHashEntry.java
new file mode 100644
index 0000000..851c7d2
--- /dev/null
+++ b/src/net/minecraft/src/PlayerHashEntry.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+class PlayerHashEntry {
+ final long key;
+ Object value;
+ PlayerHashEntry nextEntry;
+ final int field_1026_d;
+
+ PlayerHashEntry(int var1, long var2, Object var4, PlayerHashEntry var5) {
+ this.value = var4;
+ this.nextEntry = var5;
+ this.key = var2;
+ this.field_1026_d = var1;
+ }
+
+ public final long func_736_a() {
+ return this.key;
+ }
+
+ public final Object func_735_b() {
+ return this.value;
+ }
+
+ public final boolean equals(Object var1) {
+ if(!(var1 instanceof PlayerHashEntry)) {
+ return false;
+ } else {
+ PlayerHashEntry var2 = (PlayerHashEntry)var1;
+ Long var3 = Long.valueOf(this.func_736_a());
+ Long var4 = Long.valueOf(var2.func_736_a());
+ if(var3 == var4 || var3 != null && var3.equals(var4)) {
+ Object var5 = this.func_735_b();
+ Object var6 = var2.func_735_b();
+ if(var5 == var6 || var5 != null && var5.equals(var6)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+
+ public final int hashCode() {
+ return PlayerHash.getHashCode(this.key);
+ }
+
+ public final String toString() {
+ return this.func_736_a() + "=" + this.func_735_b();
+ }
+}
diff --git a/src/net/minecraft/src/PlayerInstance.java b/src/net/minecraft/src/PlayerInstance.java
new file mode 100644
index 0000000..521762e
--- /dev/null
+++ b/src/net/minecraft/src/PlayerInstance.java
@@ -0,0 +1,179 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class PlayerInstance {
+ private List players;
+ private int chunkX;
+ private int chunkZ;
+ private ChunkCoordIntPair currentChunk;
+ private short[] blocksToUpdate;
+ private int numBlocksToUpdate;
+ private int minX;
+ private int maxX;
+ private int minY;
+ private int maxY;
+ private int minZ;
+ private int maxZ;
+ final PlayerManager playerManager;
+
+ public PlayerInstance(PlayerManager var1, int var2, int var3) {
+ this.playerManager = var1;
+ this.players = new ArrayList();
+ this.blocksToUpdate = new short[10];
+ this.numBlocksToUpdate = 0;
+ this.chunkX = var2;
+ this.chunkZ = var3;
+ this.currentChunk = new ChunkCoordIntPair(var2, var3);
+ var1.getMinecraftServer().chunkProviderServer.loadChunk(var2, var3);
+ }
+
+ public void addPlayer(EntityPlayerMP var1) {
+ if(this.players.contains(var1)) {
+ throw new IllegalStateException("Failed to add player. " + var1 + " already is in chunk " + this.chunkX + ", " + this.chunkZ);
+ } else {
+ var1.field_420_ah.add(this.currentChunk);
+ var1.playerNetServerHandler.sendPacket(new Packet50PreChunk(this.currentChunk.chunkXPos, this.currentChunk.chunkZPos, true));
+ this.players.add(var1);
+ var1.loadedChunks.add(this.currentChunk);
+ }
+ }
+
+ public void removePlayer(EntityPlayerMP var1) {
+ if(this.players.contains(var1)) {
+ this.players.remove(var1);
+ if(this.players.size() == 0) {
+ long var2 = (long)this.chunkX + 2147483647L | (long)this.chunkZ + 2147483647L << 32;
+ PlayerManager.getPlayerInstances(this.playerManager).remove(var2);
+ if(this.numBlocksToUpdate > 0) {
+ PlayerManager.getPlayerInstancesToUpdate(this.playerManager).remove(this);
+ }
+
+ this.playerManager.getMinecraftServer().chunkProviderServer.func_374_c(this.chunkX, this.chunkZ);
+ }
+
+ var1.loadedChunks.remove(this.currentChunk);
+ if(var1.field_420_ah.contains(this.currentChunk)) {
+ var1.playerNetServerHandler.sendPacket(new Packet50PreChunk(this.chunkX, this.chunkZ, false));
+ }
+
+ }
+ }
+
+ public void markBlockNeedsUpdate(int var1, int var2, int var3) {
+ if(this.numBlocksToUpdate == 0) {
+ PlayerManager.getPlayerInstancesToUpdate(this.playerManager).add(this);
+ this.minX = this.maxX = var1;
+ this.minY = this.maxY = var2;
+ this.minZ = this.maxZ = var3;
+ }
+
+ if(this.minX > var1) {
+ this.minX = var1;
+ }
+
+ if(this.maxX < var1) {
+ this.maxX = var1;
+ }
+
+ if(this.minY > var2) {
+ this.minY = var2;
+ }
+
+ if(this.maxY < var2) {
+ this.maxY = var2;
+ }
+
+ if(this.minZ > var3) {
+ this.minZ = var3;
+ }
+
+ if(this.maxZ < var3) {
+ this.maxZ = var3;
+ }
+
+ if(this.numBlocksToUpdate < 10) {
+ short var4 = (short)(var1 << 12 | var3 << 8 | var2);
+
+ for(int var5 = 0; var5 < this.numBlocksToUpdate; ++var5) {
+ if(this.blocksToUpdate[var5] == var4) {
+ return;
+ }
+ }
+
+ this.blocksToUpdate[this.numBlocksToUpdate++] = var4;
+ }
+
+ }
+
+ public void sendPacketToPlayersInInstance(Packet var1) {
+ for(int var2 = 0; var2 < this.players.size(); ++var2) {
+ EntityPlayerMP var3 = (EntityPlayerMP)this.players.get(var2);
+ if(var3.field_420_ah.contains(this.currentChunk)) {
+ var3.playerNetServerHandler.sendPacket(var1);
+ }
+ }
+
+ }
+
+ public void onUpdate() {
+ WorldServer var1 = this.playerManager.getMinecraftServer();
+ if(this.numBlocksToUpdate != 0) {
+ int var2;
+ int var3;
+ int var4;
+ if(this.numBlocksToUpdate == 1) {
+ var2 = this.chunkX * 16 + this.minX;
+ var3 = this.minY;
+ var4 = this.chunkZ * 16 + this.minZ;
+ this.sendPacketToPlayersInInstance(new Packet53BlockChange(var2, var3, var4, var1));
+ if(Block.isBlockContainer[var1.getBlockId(var2, var3, var4)]) {
+ this.updateTileEntity(var1.getBlockTileEntity(var2, var3, var4));
+ }
+ } else {
+ int var5;
+ if(this.numBlocksToUpdate == 10) {
+ this.minY = this.minY / 2 * 2;
+ this.maxY = (this.maxY / 2 + 1) * 2;
+ var2 = this.minX + this.chunkX * 16;
+ var3 = this.minY;
+ var4 = this.minZ + this.chunkZ * 16;
+ var5 = this.maxX - this.minX + 1;
+ int var6 = this.maxY - this.minY + 2;
+ int var7 = this.maxZ - this.minZ + 1;
+ this.sendPacketToPlayersInInstance(new Packet51MapChunk(var2, var3, var4, var5, var6, var7, var1));
+ List var8 = var1.getTileEntityList(var2, var3, var4, var2 + var5, var3 + var6, var4 + var7);
+
+ for(int var9 = 0; var9 < var8.size(); ++var9) {
+ this.updateTileEntity((TileEntity)var8.get(var9));
+ }
+ } else {
+ this.sendPacketToPlayersInInstance(new Packet52MultiBlockChange(this.chunkX, this.chunkZ, this.blocksToUpdate, this.numBlocksToUpdate, var1));
+
+ for(var2 = 0; var2 < this.numBlocksToUpdate; ++var2) {
+ var3 = this.chunkX * 16 + (this.numBlocksToUpdate >> 12 & 15);
+ var4 = this.numBlocksToUpdate & 255;
+ var5 = this.chunkZ * 16 + (this.numBlocksToUpdate >> 8 & 15);
+ if(Block.isBlockContainer[var1.getBlockId(var3, var4, var5)]) {
+ System.out.println("Sending!");
+ this.updateTileEntity(var1.getBlockTileEntity(var3, var4, var5));
+ }
+ }
+ }
+ }
+
+ this.numBlocksToUpdate = 0;
+ }
+ }
+
+ private void updateTileEntity(TileEntity var1) {
+ if(var1 != null) {
+ Packet var2 = var1.getDescriptionPacket();
+ if(var2 != null) {
+ this.sendPacketToPlayersInInstance(var2);
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/PlayerListBox.java b/src/net/minecraft/src/PlayerListBox.java
new file mode 100644
index 0000000..ddd4542
--- /dev/null
+++ b/src/net/minecraft/src/PlayerListBox.java
@@ -0,0 +1,28 @@
+package net.minecraft.src;
+
+import java.util.Vector;
+import javax.swing.JList;
+import net.minecraft.server.MinecraftServer;
+
+public class PlayerListBox extends JList implements IUpdatePlayerListBox {
+ private MinecraftServer mcServer;
+ private int updateCounter = 0;
+
+ public PlayerListBox(MinecraftServer var1) {
+ this.mcServer = var1;
+ var1.func_6022_a(this);
+ }
+
+ public void update() {
+ if(this.updateCounter++ % 20 == 0) {
+ Vector var1 = new Vector();
+
+ for(int var2 = 0; var2 < this.mcServer.configManager.playerEntities.size(); ++var2) {
+ var1.add(((EntityPlayerMP)this.mcServer.configManager.playerEntities.get(var2)).username);
+ }
+
+ this.setListData(var1);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/PlayerManager.java b/src/net/minecraft/src/PlayerManager.java
new file mode 100644
index 0000000..af409ef
--- /dev/null
+++ b/src/net/minecraft/src/PlayerManager.java
@@ -0,0 +1,162 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+import net.minecraft.server.MinecraftServer;
+
+public class PlayerManager {
+ public List players = new ArrayList();
+ private PlayerHash playerInstances = new PlayerHash();
+ private List playerInstancesToUpdate = new ArrayList();
+ private MinecraftServer mcServer;
+ private int field_28110_e;
+ private int playerViewRadius;
+ private final int[][] field_22089_e = new int[][]{{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
+
+ public PlayerManager(MinecraftServer var1, int var2, int var3) {
+ if(var3 > 15) {
+ throw new IllegalArgumentException("Too big view radius!");
+ } else if(var3 < 3) {
+ throw new IllegalArgumentException("Too small view radius!");
+ } else {
+ this.playerViewRadius = var3;
+ this.mcServer = var1;
+ this.field_28110_e = var2;
+ }
+ }
+
+ public WorldServer getMinecraftServer() {
+ return this.mcServer.getWorldManager(this.field_28110_e);
+ }
+
+ public void updatePlayerInstances() {
+ for(int var1 = 0; var1 < this.playerInstancesToUpdate.size(); ++var1) {
+ ((PlayerInstance)this.playerInstancesToUpdate.get(var1)).onUpdate();
+ }
+
+ this.playerInstancesToUpdate.clear();
+ }
+
+ private PlayerInstance getPlayerInstance(int var1, int var2, boolean var3) {
+ long var4 = (long)var1 + 2147483647L | (long)var2 + 2147483647L << 32;
+ PlayerInstance var6 = (PlayerInstance)this.playerInstances.getValueByKey(var4);
+ if(var6 == null && var3) {
+ var6 = new PlayerInstance(this, var1, var2);
+ this.playerInstances.add(var4, var6);
+ }
+
+ return var6;
+ }
+
+ public void markBlockNeedsUpdate(int var1, int var2, int var3) {
+ int var4 = var1 >> 4;
+ int var5 = var3 >> 4;
+ PlayerInstance var6 = this.getPlayerInstance(var4, var5, false);
+ if(var6 != null) {
+ var6.markBlockNeedsUpdate(var1 & 15, var2, var3 & 15);
+ }
+
+ }
+
+ public void addPlayer(EntityPlayerMP var1) {
+ int var2 = (int)var1.posX >> 4;
+ int var3 = (int)var1.posZ >> 4;
+ var1.field_9155_d = var1.posX;
+ var1.field_9154_e = var1.posZ;
+ int var4 = 0;
+ int var5 = this.playerViewRadius;
+ int var6 = 0;
+ int var7 = 0;
+ this.getPlayerInstance(var2, var3, true).addPlayer(var1);
+
+ int var8;
+ for(var8 = 1; var8 <= var5 * 2; ++var8) {
+ for(int var9 = 0; var9 < 2; ++var9) {
+ int[] var10 = this.field_22089_e[var4++ % 4];
+
+ for(int var11 = 0; var11 < var8; ++var11) {
+ var6 += var10[0];
+ var7 += var10[1];
+ this.getPlayerInstance(var2 + var6, var3 + var7, true).addPlayer(var1);
+ }
+ }
+ }
+
+ var4 %= 4;
+
+ for(var8 = 0; var8 < var5 * 2; ++var8) {
+ var6 += this.field_22089_e[var4][0];
+ var7 += this.field_22089_e[var4][1];
+ this.getPlayerInstance(var2 + var6, var3 + var7, true).addPlayer(var1);
+ }
+
+ this.players.add(var1);
+ }
+
+ public void removePlayer(EntityPlayerMP var1) {
+ int var2 = (int)var1.field_9155_d >> 4;
+ int var3 = (int)var1.field_9154_e >> 4;
+
+ for(int var4 = var2 - this.playerViewRadius; var4 <= var2 + this.playerViewRadius; ++var4) {
+ for(int var5 = var3 - this.playerViewRadius; var5 <= var3 + this.playerViewRadius; ++var5) {
+ PlayerInstance var6 = this.getPlayerInstance(var4, var5, false);
+ if(var6 != null) {
+ var6.removePlayer(var1);
+ }
+ }
+ }
+
+ this.players.remove(var1);
+ }
+
+ private boolean func_544_a(int var1, int var2, int var3, int var4) {
+ int var5 = var1 - var3;
+ int var6 = var2 - var4;
+ return var5 >= -this.playerViewRadius && var5 <= this.playerViewRadius ? var6 >= -this.playerViewRadius && var6 <= this.playerViewRadius : false;
+ }
+
+ public void func_543_c(EntityPlayerMP var1) {
+ int var2 = (int)var1.posX >> 4;
+ int var3 = (int)var1.posZ >> 4;
+ double var4 = var1.field_9155_d - var1.posX;
+ double var6 = var1.field_9154_e - var1.posZ;
+ double var8 = var4 * var4 + var6 * var6;
+ if(var8 >= 64.0D) {
+ int var10 = (int)var1.field_9155_d >> 4;
+ int var11 = (int)var1.field_9154_e >> 4;
+ int var12 = var2 - var10;
+ int var13 = var3 - var11;
+ if(var12 != 0 || var13 != 0) {
+ for(int var14 = var2 - this.playerViewRadius; var14 <= var2 + this.playerViewRadius; ++var14) {
+ for(int var15 = var3 - this.playerViewRadius; var15 <= var3 + this.playerViewRadius; ++var15) {
+ if(!this.func_544_a(var14, var15, var10, var11)) {
+ this.getPlayerInstance(var14, var15, true).addPlayer(var1);
+ }
+
+ if(!this.func_544_a(var14 - var12, var15 - var13, var2, var3)) {
+ PlayerInstance var16 = this.getPlayerInstance(var14 - var12, var15 - var13, false);
+ if(var16 != null) {
+ var16.removePlayer(var1);
+ }
+ }
+ }
+ }
+
+ var1.field_9155_d = var1.posX;
+ var1.field_9154_e = var1.posZ;
+ }
+ }
+ }
+
+ public int getMaxTrackingDistance() {
+ return this.playerViewRadius * 16 - 16;
+ }
+
+ static PlayerHash getPlayerInstances(PlayerManager var0) {
+ return var0.playerInstances;
+ }
+
+ static List getPlayerInstancesToUpdate(PlayerManager var0) {
+ return var0.playerInstancesToUpdate;
+ }
+}
diff --git a/src/net/minecraft/src/PlayerNBTManager.java b/src/net/minecraft/src/PlayerNBTManager.java
new file mode 100644
index 0000000..c76c704
--- /dev/null
+++ b/src/net/minecraft/src/PlayerNBTManager.java
@@ -0,0 +1,216 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.logging.Logger;
+
+public class PlayerNBTManager implements IPlayerFileData, ISaveHandler {
+ private static final Logger logger = Logger.getLogger("Minecraft");
+ private final File worldDir;
+ private final File worldFile;
+ private final File field_28112_d;
+ private final long field_22100_d = System.currentTimeMillis();
+
+ public PlayerNBTManager(File var1, String var2, boolean var3) {
+ this.worldDir = new File(var1, var2);
+ this.worldDir.mkdirs();
+ this.worldFile = new File(this.worldDir, "players");
+ this.field_28112_d = new File(this.worldDir, "data");
+ this.field_28112_d.mkdirs();
+ if(var3) {
+ this.worldFile.mkdirs();
+ }
+
+ this.func_22098_f();
+ }
+
+ private void func_22098_f() {
+ try {
+ File var1 = new File(this.worldDir, "session.lock");
+ DataOutputStream var2 = new DataOutputStream(new FileOutputStream(var1));
+
+ try {
+ var2.writeLong(this.field_22100_d);
+ } finally {
+ var2.close();
+ }
+
+ } catch (IOException var7) {
+ var7.printStackTrace();
+ throw new RuntimeException("Failed to check session lock, aborting");
+ }
+ }
+
+ protected File getWorldDir() {
+ return this.worldDir;
+ }
+
+ public void func_22091_b() {
+ try {
+ File var1 = new File(this.worldDir, "session.lock");
+ DataInputStream var2 = new DataInputStream(new FileInputStream(var1));
+
+ try {
+ if(var2.readLong() != this.field_22100_d) {
+ throw new MinecraftException("The save is being accessed from another location, aborting");
+ }
+ } finally {
+ var2.close();
+ }
+
+ } catch (IOException var7) {
+ throw new MinecraftException("Failed to check session lock, aborting");
+ }
+ }
+
+ public IChunkLoader func_22092_a(WorldProvider var1) {
+ if(var1 instanceof WorldProviderHell) {
+ File var2 = new File(this.worldDir, "DIM-1");
+ var2.mkdirs();
+ return new ChunkLoader(var2, true);
+ } else {
+ return new ChunkLoader(this.worldDir, true);
+ }
+ }
+
+ public WorldInfo func_22096_c() {
+ File var1 = new File(this.worldDir, "level.dat");
+ NBTTagCompound var2;
+ NBTTagCompound var3;
+ if(var1.exists()) {
+ try {
+ var2 = CompressedStreamTools.func_770_a(new FileInputStream(var1));
+ var3 = var2.getCompoundTag("Data");
+ return new WorldInfo(var3);
+ } catch (Exception var5) {
+ var5.printStackTrace();
+ }
+ }
+
+ var1 = new File(this.worldDir, "level.dat_old");
+ if(var1.exists()) {
+ try {
+ var2 = CompressedStreamTools.func_770_a(new FileInputStream(var1));
+ var3 = var2.getCompoundTag("Data");
+ return new WorldInfo(var3);
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ }
+ }
+
+ return null;
+ }
+
+ public void func_22095_a(WorldInfo var1, List var2) {
+ NBTTagCompound var3 = var1.func_22183_a(var2);
+ NBTTagCompound var4 = new NBTTagCompound();
+ var4.setTag("Data", var3);
+
+ try {
+ File var5 = new File(this.worldDir, "level.dat_new");
+ File var6 = new File(this.worldDir, "level.dat_old");
+ File var7 = new File(this.worldDir, "level.dat");
+ CompressedStreamTools.writeGzippedCompoundToOutputStream(var4, new FileOutputStream(var5));
+ if(var6.exists()) {
+ var6.delete();
+ }
+
+ var7.renameTo(var6);
+ if(var7.exists()) {
+ var7.delete();
+ }
+
+ var5.renameTo(var7);
+ if(var5.exists()) {
+ var5.delete();
+ }
+ } catch (Exception var8) {
+ var8.printStackTrace();
+ }
+
+ }
+
+ public void func_22094_a(WorldInfo var1) {
+ NBTTagCompound var2 = var1.func_22185_a();
+ NBTTagCompound var3 = new NBTTagCompound();
+ var3.setTag("Data", var2);
+
+ try {
+ File var4 = new File(this.worldDir, "level.dat_new");
+ File var5 = new File(this.worldDir, "level.dat_old");
+ File var6 = new File(this.worldDir, "level.dat");
+ CompressedStreamTools.writeGzippedCompoundToOutputStream(var3, new FileOutputStream(var4));
+ if(var5.exists()) {
+ var5.delete();
+ }
+
+ var6.renameTo(var5);
+ if(var6.exists()) {
+ var6.delete();
+ }
+
+ var4.renameTo(var6);
+ if(var4.exists()) {
+ var4.delete();
+ }
+ } catch (Exception var7) {
+ var7.printStackTrace();
+ }
+
+ }
+
+ public void writePlayerData(EntityPlayer var1) {
+ try {
+ NBTTagCompound var2 = new NBTTagCompound();
+ var1.writeToNBT(var2);
+ File var3 = new File(this.worldFile, "_tmp_.dat");
+ File var4 = new File(this.worldFile, var1.username + ".dat");
+ CompressedStreamTools.writeGzippedCompoundToOutputStream(var2, new FileOutputStream(var3));
+ if(var4.exists()) {
+ var4.delete();
+ }
+
+ var3.renameTo(var4);
+ } catch (Exception var5) {
+ logger.warning("Failed to save player data for " + var1.username);
+ }
+
+ }
+
+ public void readPlayerData(EntityPlayer var1) {
+ NBTTagCompound var2 = this.getPlayerData(var1.username);
+ if(var2 != null) {
+ var1.readFromNBT(var2);
+ }
+
+ }
+
+ public NBTTagCompound getPlayerData(String var1) {
+ try {
+ File var2 = new File(this.worldFile, var1 + ".dat");
+ if(var2.exists()) {
+ return CompressedStreamTools.func_770_a(new FileInputStream(var2));
+ }
+ } catch (Exception var3) {
+ logger.warning("Failed to load player data for " + var1);
+ }
+
+ return null;
+ }
+
+ public IPlayerFileData func_22090_d() {
+ return this;
+ }
+
+ public void func_22093_e() {
+ }
+
+ public File func_28111_b(String var1) {
+ return new File(this.field_28112_d, var1 + ".dat");
+ }
+}
diff --git a/src/net/minecraft/src/PropertyManager.java b/src/net/minecraft/src/PropertyManager.java
new file mode 100644
index 0000000..42ea0ff
--- /dev/null
+++ b/src/net/minecraft/src/PropertyManager.java
@@ -0,0 +1,77 @@
+package net.minecraft.src;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class PropertyManager {
+ public static Logger logger = Logger.getLogger("Minecraft");
+ private Properties serverProperties = new Properties();
+ private File serverPropertiesFile;
+
+ public PropertyManager(File var1) {
+ this.serverPropertiesFile = var1;
+ if(var1.exists()) {
+ try {
+ this.serverProperties.load(new FileInputStream(var1));
+ } catch (Exception var3) {
+ logger.log(Level.WARNING, "Failed to load " + var1, var3);
+ this.generateNewProperties();
+ }
+ } else {
+ logger.log(Level.WARNING, var1 + " does not exist");
+ this.generateNewProperties();
+ }
+
+ }
+
+ public void generateNewProperties() {
+ logger.log(Level.INFO, "Generating new properties file");
+ this.saveProperties();
+ }
+
+ public void saveProperties() {
+ try {
+ this.serverProperties.store(new FileOutputStream(this.serverPropertiesFile), "Minecraft server properties");
+ } catch (Exception var2) {
+ logger.log(Level.WARNING, "Failed to save " + this.serverPropertiesFile, var2);
+ this.generateNewProperties();
+ }
+
+ }
+
+ public String getStringProperty(String var1, String var2) {
+ if(!this.serverProperties.containsKey(var1)) {
+ this.serverProperties.setProperty(var1, var2);
+ this.saveProperties();
+ }
+
+ return this.serverProperties.getProperty(var1, var2);
+ }
+
+ public int getIntProperty(String var1, int var2) {
+ try {
+ return Integer.parseInt(this.getStringProperty(var1, "" + var2));
+ } catch (Exception var4) {
+ this.serverProperties.setProperty(var1, "" + var2);
+ return var2;
+ }
+ }
+
+ public boolean getBooleanProperty(String var1, boolean var2) {
+ try {
+ return Boolean.parseBoolean(this.getStringProperty(var1, "" + var2));
+ } catch (Exception var4) {
+ this.serverProperties.setProperty(var1, "" + var2);
+ return var2;
+ }
+ }
+
+ public void setProperty(String var1, boolean var2) {
+ this.serverProperties.setProperty(var1, "" + var2);
+ this.saveProperties();
+ }
+}
diff --git a/src/net/minecraft/src/RailLogic.java b/src/net/minecraft/src/RailLogic.java
new file mode 100644
index 0000000..261c681
--- /dev/null
+++ b/src/net/minecraft/src/RailLogic.java
@@ -0,0 +1,348 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class RailLogic {
+ private World worldObj;
+ private int trackX;
+ private int trackY;
+ private int trackZ;
+ private final boolean field_27084_f;
+ private List connectedTracks;
+ final BlockRail minecartTrack;
+
+ public RailLogic(BlockRail var1, World var2, int var3, int var4, int var5) {
+ this.minecartTrack = var1;
+ this.connectedTracks = new ArrayList();
+ this.worldObj = var2;
+ this.trackX = var3;
+ this.trackY = var4;
+ this.trackZ = var5;
+ int var6 = var2.getBlockId(var3, var4, var5);
+ int var7 = var2.getBlockMetadata(var3, var4, var5);
+ if(BlockRail.func_27033_a((BlockRail)Block.blocksList[var6])) {
+ this.field_27084_f = true;
+ var7 &= -9;
+ } else {
+ this.field_27084_f = false;
+ }
+
+ this.func_27083_a(var7);
+ }
+
+ private void func_27083_a(int var1) {
+ this.connectedTracks.clear();
+ if(var1 == 0) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY, this.trackZ - 1));
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY, this.trackZ + 1));
+ } else if(var1 == 1) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX - 1, this.trackY, this.trackZ));
+ this.connectedTracks.add(new ChunkPosition(this.trackX + 1, this.trackY, this.trackZ));
+ } else if(var1 == 2) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX - 1, this.trackY, this.trackZ));
+ this.connectedTracks.add(new ChunkPosition(this.trackX + 1, this.trackY + 1, this.trackZ));
+ } else if(var1 == 3) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX - 1, this.trackY + 1, this.trackZ));
+ this.connectedTracks.add(new ChunkPosition(this.trackX + 1, this.trackY, this.trackZ));
+ } else if(var1 == 4) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY + 1, this.trackZ - 1));
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY, this.trackZ + 1));
+ } else if(var1 == 5) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY, this.trackZ - 1));
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY + 1, this.trackZ + 1));
+ } else if(var1 == 6) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX + 1, this.trackY, this.trackZ));
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY, this.trackZ + 1));
+ } else if(var1 == 7) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX - 1, this.trackY, this.trackZ));
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY, this.trackZ + 1));
+ } else if(var1 == 8) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX - 1, this.trackY, this.trackZ));
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY, this.trackZ - 1));
+ } else if(var1 == 9) {
+ this.connectedTracks.add(new ChunkPosition(this.trackX + 1, this.trackY, this.trackZ));
+ this.connectedTracks.add(new ChunkPosition(this.trackX, this.trackY, this.trackZ - 1));
+ }
+
+ }
+
+ private void func_591_b() {
+ for(int var1 = 0; var1 < this.connectedTracks.size(); ++var1) {
+ RailLogic var2 = this.getMinecartTrackLogic((ChunkPosition)this.connectedTracks.get(var1));
+ if(var2 != null && var2.isConnectedTo(this)) {
+ this.connectedTracks.set(var1, new ChunkPosition(var2.trackX, var2.trackY, var2.trackZ));
+ } else {
+ this.connectedTracks.remove(var1--);
+ }
+ }
+
+ }
+
+ private boolean isMinecartTrack(int var1, int var2, int var3) {
+ return BlockRail.func_27029_g(this.worldObj, var1, var2, var3) ? true : (BlockRail.func_27029_g(this.worldObj, var1, var2 + 1, var3) ? true : BlockRail.func_27029_g(this.worldObj, var1, var2 - 1, var3));
+ }
+
+ private RailLogic getMinecartTrackLogic(ChunkPosition var1) {
+ return BlockRail.func_27029_g(this.worldObj, var1.x, var1.y, var1.z) ? new RailLogic(this.minecartTrack, this.worldObj, var1.x, var1.y, var1.z) : (BlockRail.func_27029_g(this.worldObj, var1.x, var1.y + 1, var1.z) ? new RailLogic(this.minecartTrack, this.worldObj, var1.x, var1.y + 1, var1.z) : (BlockRail.func_27029_g(this.worldObj, var1.x, var1.y - 1, var1.z) ? new RailLogic(this.minecartTrack, this.worldObj, var1.x, var1.y - 1, var1.z) : null));
+ }
+
+ private boolean isConnectedTo(RailLogic var1) {
+ for(int var2 = 0; var2 < this.connectedTracks.size(); ++var2) {
+ ChunkPosition var3 = (ChunkPosition)this.connectedTracks.get(var2);
+ if(var3.x == var1.trackX && var3.z == var1.trackZ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private boolean func_599_b(int var1, int var2, int var3) {
+ for(int var4 = 0; var4 < this.connectedTracks.size(); ++var4) {
+ ChunkPosition var5 = (ChunkPosition)this.connectedTracks.get(var4);
+ if(var5.x == var1 && var5.z == var3) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private int getAdjacentTracks() {
+ int var1 = 0;
+ if(this.isMinecartTrack(this.trackX, this.trackY, this.trackZ - 1)) {
+ ++var1;
+ }
+
+ if(this.isMinecartTrack(this.trackX, this.trackY, this.trackZ + 1)) {
+ ++var1;
+ }
+
+ if(this.isMinecartTrack(this.trackX - 1, this.trackY, this.trackZ)) {
+ ++var1;
+ }
+
+ if(this.isMinecartTrack(this.trackX + 1, this.trackY, this.trackZ)) {
+ ++var1;
+ }
+
+ return var1;
+ }
+
+ private boolean handleKeyPress(RailLogic var1) {
+ if(this.isConnectedTo(var1)) {
+ return true;
+ } else if(this.connectedTracks.size() == 2) {
+ return false;
+ } else if(this.connectedTracks.size() == 0) {
+ return true;
+ } else {
+ ChunkPosition var2 = (ChunkPosition)this.connectedTracks.get(0);
+ return var1.trackY == this.trackY && var2.y == this.trackY ? true : true;
+ }
+ }
+
+ private void func_598_d(RailLogic var1) {
+ this.connectedTracks.add(new ChunkPosition(var1.trackX, var1.trackY, var1.trackZ));
+ boolean var2 = this.func_599_b(this.trackX, this.trackY, this.trackZ - 1);
+ boolean var3 = this.func_599_b(this.trackX, this.trackY, this.trackZ + 1);
+ boolean var4 = this.func_599_b(this.trackX - 1, this.trackY, this.trackZ);
+ boolean var5 = this.func_599_b(this.trackX + 1, this.trackY, this.trackZ);
+ byte var6 = -1;
+ if(var2 || var3) {
+ var6 = 0;
+ }
+
+ if(var4 || var5) {
+ var6 = 1;
+ }
+
+ if(!this.field_27084_f) {
+ if(var3 && var5 && !var2 && !var4) {
+ var6 = 6;
+ }
+
+ if(var3 && var4 && !var2 && !var5) {
+ var6 = 7;
+ }
+
+ if(var2 && var4 && !var3 && !var5) {
+ var6 = 8;
+ }
+
+ if(var2 && var5 && !var3 && !var4) {
+ var6 = 9;
+ }
+ }
+
+ if(var6 == 0) {
+ if(BlockRail.func_27029_g(this.worldObj, this.trackX, this.trackY + 1, this.trackZ - 1)) {
+ var6 = 4;
+ }
+
+ if(BlockRail.func_27029_g(this.worldObj, this.trackX, this.trackY + 1, this.trackZ + 1)) {
+ var6 = 5;
+ }
+ }
+
+ if(var6 == 1) {
+ if(BlockRail.func_27029_g(this.worldObj, this.trackX + 1, this.trackY + 1, this.trackZ)) {
+ var6 = 2;
+ }
+
+ if(BlockRail.func_27029_g(this.worldObj, this.trackX - 1, this.trackY + 1, this.trackZ)) {
+ var6 = 3;
+ }
+ }
+
+ if(var6 < 0) {
+ var6 = 0;
+ }
+
+ int var7 = var6;
+ if(this.field_27084_f) {
+ var7 = this.worldObj.getBlockMetadata(this.trackX, this.trackY, this.trackZ) & 8 | var6;
+ }
+
+ this.worldObj.setBlockMetadataWithNotify(this.trackX, this.trackY, this.trackZ, var7);
+ }
+
+ private boolean func_592_c(int var1, int var2, int var3) {
+ RailLogic var4 = this.getMinecartTrackLogic(new ChunkPosition(var1, var2, var3));
+ if(var4 == null) {
+ return false;
+ } else {
+ var4.func_591_b();
+ return var4.handleKeyPress(this);
+ }
+ }
+
+ public void func_596_a(boolean var1, boolean var2) {
+ boolean var3 = this.func_592_c(this.trackX, this.trackY, this.trackZ - 1);
+ boolean var4 = this.func_592_c(this.trackX, this.trackY, this.trackZ + 1);
+ boolean var5 = this.func_592_c(this.trackX - 1, this.trackY, this.trackZ);
+ boolean var6 = this.func_592_c(this.trackX + 1, this.trackY, this.trackZ);
+ byte var7 = -1;
+ if((var3 || var4) && !var5 && !var6) {
+ var7 = 0;
+ }
+
+ if((var5 || var6) && !var3 && !var4) {
+ var7 = 1;
+ }
+
+ if(!this.field_27084_f) {
+ if(var4 && var6 && !var3 && !var5) {
+ var7 = 6;
+ }
+
+ if(var4 && var5 && !var3 && !var6) {
+ var7 = 7;
+ }
+
+ if(var3 && var5 && !var4 && !var6) {
+ var7 = 8;
+ }
+
+ if(var3 && var6 && !var4 && !var5) {
+ var7 = 9;
+ }
+ }
+
+ if(var7 == -1) {
+ if(var3 || var4) {
+ var7 = 0;
+ }
+
+ if(var5 || var6) {
+ var7 = 1;
+ }
+
+ if(!this.field_27084_f) {
+ if(var1) {
+ if(var4 && var6) {
+ var7 = 6;
+ }
+
+ if(var5 && var4) {
+ var7 = 7;
+ }
+
+ if(var6 && var3) {
+ var7 = 9;
+ }
+
+ if(var3 && var5) {
+ var7 = 8;
+ }
+ } else {
+ if(var3 && var5) {
+ var7 = 8;
+ }
+
+ if(var6 && var3) {
+ var7 = 9;
+ }
+
+ if(var5 && var4) {
+ var7 = 7;
+ }
+
+ if(var4 && var6) {
+ var7 = 6;
+ }
+ }
+ }
+ }
+
+ if(var7 == 0) {
+ if(BlockRail.func_27029_g(this.worldObj, this.trackX, this.trackY + 1, this.trackZ - 1)) {
+ var7 = 4;
+ }
+
+ if(BlockRail.func_27029_g(this.worldObj, this.trackX, this.trackY + 1, this.trackZ + 1)) {
+ var7 = 5;
+ }
+ }
+
+ if(var7 == 1) {
+ if(BlockRail.func_27029_g(this.worldObj, this.trackX + 1, this.trackY + 1, this.trackZ)) {
+ var7 = 2;
+ }
+
+ if(BlockRail.func_27029_g(this.worldObj, this.trackX - 1, this.trackY + 1, this.trackZ)) {
+ var7 = 3;
+ }
+ }
+
+ if(var7 < 0) {
+ var7 = 0;
+ }
+
+ this.func_27083_a(var7);
+ int var8 = var7;
+ if(this.field_27084_f) {
+ var8 = this.worldObj.getBlockMetadata(this.trackX, this.trackY, this.trackZ) & 8 | var7;
+ }
+
+ if(var2 || this.worldObj.getBlockMetadata(this.trackX, this.trackY, this.trackZ) != var8) {
+ this.worldObj.setBlockMetadataWithNotify(this.trackX, this.trackY, this.trackZ, var8);
+
+ for(int var9 = 0; var9 < this.connectedTracks.size(); ++var9) {
+ RailLogic var10 = this.getMinecartTrackLogic((ChunkPosition)this.connectedTracks.get(var9));
+ if(var10 != null) {
+ var10.func_591_b();
+ if(var10.handleKeyPress(this)) {
+ var10.func_598_d(this);
+ }
+ }
+ }
+ }
+
+ }
+
+ static int getNAdjacentTracks(RailLogic var0) {
+ return var0.getAdjacentTracks();
+ }
+}
diff --git a/src/net/minecraft/src/RecipeSorter.java b/src/net/minecraft/src/RecipeSorter.java
new file mode 100644
index 0000000..51eaac2
--- /dev/null
+++ b/src/net/minecraft/src/RecipeSorter.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+import java.util.Comparator;
+
+class RecipeSorter implements Comparator {
+ final CraftingManager craftingManager;
+
+ RecipeSorter(CraftingManager var1) {
+ this.craftingManager = var1;
+ }
+
+ public int compareRecipes(IRecipe var1, IRecipe var2) {
+ return var1 instanceof ShapelessRecipes && var2 instanceof ShapedRecipes ? 1 : (var2 instanceof ShapelessRecipes && var1 instanceof ShapedRecipes ? -1 : (var2.getRecipeSize() < var1.getRecipeSize() ? -1 : (var2.getRecipeSize() > var1.getRecipeSize() ? 1 : 0)));
+ }
+
+ public int compare(Object var1, Object var2) {
+ return this.compareRecipes((IRecipe)var1, (IRecipe)var2);
+ }
+}
diff --git a/src/net/minecraft/src/RecipesArmor.java b/src/net/minecraft/src/RecipesArmor.java
new file mode 100644
index 0000000..7eef8a1
--- /dev/null
+++ b/src/net/minecraft/src/RecipesArmor.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+public class RecipesArmor {
+ private String[][] recipePatterns = new String[][]{{"XXX", "X X"}, {"X X", "XXX", "XXX"}, {"XXX", "X X", "X X"}, {"X X", "X X"}};
+ private Object[][] recipeItems = new Object[][]{{Item.leather, Block.fire, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.helmetLeather, Item.helmetChain, Item.helmetSteel, Item.helmetDiamond, Item.helmetGold}, {Item.plateLeather, Item.plateChain, Item.plateSteel, Item.plateDiamond, Item.plateGold}, {Item.legsLeather, Item.legsChain, Item.legsSteel, Item.legsDiamond, Item.legsGold}, {Item.bootsLeather, Item.bootsChain, Item.bootsSteel, Item.bootsDiamond, Item.bootsGold}};
+
+ public void addRecipes(CraftingManager var1) {
+ for(int var2 = 0; var2 < this.recipeItems[0].length; ++var2) {
+ Object var3 = this.recipeItems[0][var2];
+
+ for(int var4 = 0; var4 < this.recipeItems.length - 1; ++var4) {
+ Item var5 = (Item)this.recipeItems[var4 + 1][var2];
+ var1.addRecipe(new ItemStack(var5), new Object[]{this.recipePatterns[var4], Character.valueOf('X'), var3});
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/RecipesCrafting.java b/src/net/minecraft/src/RecipesCrafting.java
new file mode 100644
index 0000000..6a9098e
--- /dev/null
+++ b/src/net/minecraft/src/RecipesCrafting.java
@@ -0,0 +1,10 @@
+package net.minecraft.src;
+
+public class RecipesCrafting {
+ public void addRecipes(CraftingManager var1) {
+ var1.addRecipe(new ItemStack(Block.chest), new Object[]{"###", "# #", "###", Character.valueOf('#'), Block.planks});
+ var1.addRecipe(new ItemStack(Block.stoneOvenIdle), new Object[]{"###", "# #", "###", Character.valueOf('#'), Block.cobblestone});
+ var1.addRecipe(new ItemStack(Block.workbench), new Object[]{"##", "##", Character.valueOf('#'), Block.planks});
+ var1.addRecipe(new ItemStack(Block.sandStone), new Object[]{"##", "##", Character.valueOf('#'), Block.sand});
+ }
+}
diff --git a/src/net/minecraft/src/RecipesDyes.java b/src/net/minecraft/src/RecipesDyes.java
new file mode 100644
index 0000000..0e30cd3
--- /dev/null
+++ b/src/net/minecraft/src/RecipesDyes.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+public class RecipesDyes {
+ public void addRecipes(CraftingManager var1) {
+ for(int var2 = 0; var2 < 16; ++var2) {
+ var1.addShapelessRecipe(new ItemStack(Block.cloth, 1, BlockCloth.func_21034_d(var2)), new Object[]{new ItemStack(Item.dyePowder, 1, var2), new ItemStack(Item.itemsList[Block.cloth.blockID], 1, 0)});
+ }
+
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 11), new Object[]{Block.plantYellow});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 1), new Object[]{Block.plantRed});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 3, 15), new Object[]{Item.bone});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 9), new Object[]{new ItemStack(Item.dyePowder, 1, 1), new ItemStack(Item.dyePowder, 1, 15)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 14), new Object[]{new ItemStack(Item.dyePowder, 1, 1), new ItemStack(Item.dyePowder, 1, 11)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 10), new Object[]{new ItemStack(Item.dyePowder, 1, 2), new ItemStack(Item.dyePowder, 1, 15)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 8), new Object[]{new ItemStack(Item.dyePowder, 1, 0), new ItemStack(Item.dyePowder, 1, 15)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 7), new Object[]{new ItemStack(Item.dyePowder, 1, 8), new ItemStack(Item.dyePowder, 1, 15)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 3, 7), new Object[]{new ItemStack(Item.dyePowder, 1, 0), new ItemStack(Item.dyePowder, 1, 15), new ItemStack(Item.dyePowder, 1, 15)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 12), new Object[]{new ItemStack(Item.dyePowder, 1, 4), new ItemStack(Item.dyePowder, 1, 15)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 6), new Object[]{new ItemStack(Item.dyePowder, 1, 4), new ItemStack(Item.dyePowder, 1, 2)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 5), new Object[]{new ItemStack(Item.dyePowder, 1, 4), new ItemStack(Item.dyePowder, 1, 1)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 2, 13), new Object[]{new ItemStack(Item.dyePowder, 1, 5), new ItemStack(Item.dyePowder, 1, 9)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 3, 13), new Object[]{new ItemStack(Item.dyePowder, 1, 4), new ItemStack(Item.dyePowder, 1, 1), new ItemStack(Item.dyePowder, 1, 9)});
+ var1.addShapelessRecipe(new ItemStack(Item.dyePowder, 4, 13), new Object[]{new ItemStack(Item.dyePowder, 1, 4), new ItemStack(Item.dyePowder, 1, 1), new ItemStack(Item.dyePowder, 1, 1), new ItemStack(Item.dyePowder, 1, 15)});
+ }
+}
diff --git a/src/net/minecraft/src/RecipesFood.java b/src/net/minecraft/src/RecipesFood.java
new file mode 100644
index 0000000..c41a496
--- /dev/null
+++ b/src/net/minecraft/src/RecipesFood.java
@@ -0,0 +1,9 @@
+package net.minecraft.src;
+
+public class RecipesFood {
+ public void addRecipes(CraftingManager var1) {
+ var1.addRecipe(new ItemStack(Item.bowlSoup), new Object[]{"Y", "X", "#", Character.valueOf('X'), Block.mushroomBrown, Character.valueOf('Y'), Block.mushroomRed, Character.valueOf('#'), Item.bowlEmpty});
+ var1.addRecipe(new ItemStack(Item.bowlSoup), new Object[]{"Y", "X", "#", Character.valueOf('X'), Block.mushroomRed, Character.valueOf('Y'), Block.mushroomBrown, Character.valueOf('#'), Item.bowlEmpty});
+ var1.addRecipe(new ItemStack(Item.cookie, 8), new Object[]{"#X#", Character.valueOf('X'), new ItemStack(Item.dyePowder, 1, 3), Character.valueOf('#'), Item.wheat});
+ }
+}
diff --git a/src/net/minecraft/src/RecipesIngots.java b/src/net/minecraft/src/RecipesIngots.java
new file mode 100644
index 0000000..8256f58
--- /dev/null
+++ b/src/net/minecraft/src/RecipesIngots.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+public class RecipesIngots {
+ private Object[][] recipeItems = new Object[][]{{Block.blockGold, new ItemStack(Item.ingotGold, 9)}, {Block.blockSteel, new ItemStack(Item.ingotIron, 9)}, {Block.blockDiamond, new ItemStack(Item.diamond, 9)}, {Block.blockLapis, new ItemStack(Item.dyePowder, 9, 4)}};
+
+ public void addRecipes(CraftingManager var1) {
+ for(int var2 = 0; var2 < this.recipeItems.length; ++var2) {
+ Block var3 = (Block)this.recipeItems[var2][0];
+ ItemStack var4 = (ItemStack)this.recipeItems[var2][1];
+ var1.addRecipe(new ItemStack(var3), new Object[]{"###", "###", "###", Character.valueOf('#'), var4});
+ var1.addRecipe(var4, new Object[]{"#", Character.valueOf('#'), var3});
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/RecipesTools.java b/src/net/minecraft/src/RecipesTools.java
new file mode 100644
index 0000000..061dae0
--- /dev/null
+++ b/src/net/minecraft/src/RecipesTools.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public class RecipesTools {
+ private String[][] recipePatterns = new String[][]{{"XXX", " # ", " # "}, {"X", "#", "#"}, {"XX", "X#", " #"}, {"XX", " #", " #"}};
+ private Object[][] recipeItems = new Object[][]{{Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.pickaxeWood, Item.pickaxeStone, Item.pickaxeSteel, Item.pickaxeDiamond, Item.pickaxeGold}, {Item.shovelWood, Item.shovelStone, Item.shovelSteel, Item.shovelDiamond, Item.shovelGold}, {Item.axeWood, Item.axeStone, Item.axeSteel, Item.axeDiamond, Item.axeGold}, {Item.hoeWood, Item.hoeStone, Item.hoeSteel, Item.hoeDiamond, Item.hoeGold}};
+
+ public void addRecipes(CraftingManager var1) {
+ for(int var2 = 0; var2 < this.recipeItems[0].length; ++var2) {
+ Object var3 = this.recipeItems[0][var2];
+
+ for(int var4 = 0; var4 < this.recipeItems.length - 1; ++var4) {
+ Item var5 = (Item)this.recipeItems[var4 + 1][var2];
+ var1.addRecipe(new ItemStack(var5), new Object[]{this.recipePatterns[var4], Character.valueOf('#'), Item.stick, Character.valueOf('X'), var3});
+ }
+ }
+
+ var1.addRecipe(new ItemStack(Item.field_31022_bc), new Object[]{" #", "# ", Character.valueOf('#'), Item.ingotIron});
+ }
+}
diff --git a/src/net/minecraft/src/RecipesWeapons.java b/src/net/minecraft/src/RecipesWeapons.java
new file mode 100644
index 0000000..23b87e1
--- /dev/null
+++ b/src/net/minecraft/src/RecipesWeapons.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+public class RecipesWeapons {
+ private String[][] recipePatterns = new String[][]{{"X", "X", "#"}};
+ private Object[][] recipeItems = new Object[][]{{Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.swordWood, Item.swordStone, Item.swordSteel, Item.swordDiamond, Item.swordGold}};
+
+ public void addRecipes(CraftingManager var1) {
+ for(int var2 = 0; var2 < this.recipeItems[0].length; ++var2) {
+ Object var3 = this.recipeItems[0][var2];
+
+ for(int var4 = 0; var4 < this.recipeItems.length - 1; ++var4) {
+ Item var5 = (Item)this.recipeItems[var4 + 1][var2];
+ var1.addRecipe(new ItemStack(var5), new Object[]{this.recipePatterns[var4], Character.valueOf('#'), Item.stick, Character.valueOf('X'), var3});
+ }
+ }
+
+ var1.addRecipe(new ItemStack(Item.bow, 1), new Object[]{" #X", "# X", " #X", Character.valueOf('X'), Item.silk, Character.valueOf('#'), Item.stick});
+ var1.addRecipe(new ItemStack(Item.arrow, 4), new Object[]{"X", "#", "Y", Character.valueOf('Y'), Item.feather, Character.valueOf('X'), Item.flint, Character.valueOf('#'), Item.stick});
+ }
+}
diff --git a/src/net/minecraft/src/RedstoneUpdateInfo.java b/src/net/minecraft/src/RedstoneUpdateInfo.java
new file mode 100644
index 0000000..b987ecb
--- /dev/null
+++ b/src/net/minecraft/src/RedstoneUpdateInfo.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+class RedstoneUpdateInfo {
+ int x;
+ int y;
+ int z;
+ long updateTime;
+
+ public RedstoneUpdateInfo(int var1, int var2, int var3, long var4) {
+ this.x = var1;
+ this.y = var2;
+ this.z = var3;
+ this.updateTime = var4;
+ }
+}
diff --git a/src/net/minecraft/src/RegionFile.java b/src/net/minecraft/src/RegionFile.java
new file mode 100644
index 0000000..945f61e
--- /dev/null
+++ b/src/net/minecraft/src/RegionFile.java
@@ -0,0 +1,274 @@
+package net.minecraft.src;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.ArrayList;
+import java.util.zip.DeflaterOutputStream;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.InflaterInputStream;
+
+public class RegionFile {
+ private static final byte[] emptySector = new byte[4096];
+ private final File fileName;
+ private RandomAccessFile dataFile;
+ private final int[] offsets = new int[1024];
+ private final int[] chunkTimestamps = new int[1024];
+ private ArrayList sectorFree;
+ private int sizeDelta;
+ private long lastModified = 0L;
+
+ public RegionFile(File var1) {
+ this.fileName = var1;
+ this.debugln("REGION LOAD " + this.fileName);
+ this.sizeDelta = 0;
+
+ try {
+ if(var1.exists()) {
+ this.lastModified = var1.lastModified();
+ }
+
+ this.dataFile = new RandomAccessFile(var1, "rw");
+ int var2;
+ if(this.dataFile.length() < 4096L) {
+ for(var2 = 0; var2 < 1024; ++var2) {
+ this.dataFile.writeInt(0);
+ }
+
+ for(var2 = 0; var2 < 1024; ++var2) {
+ this.dataFile.writeInt(0);
+ }
+
+ this.sizeDelta += 8192;
+ }
+
+ if((this.dataFile.length() & 4095L) != 0L) {
+ for(var2 = 0; (long)var2 < (this.dataFile.length() & 4095L); ++var2) {
+ this.dataFile.write(0);
+ }
+ }
+
+ var2 = (int)this.dataFile.length() / 4096;
+ this.sectorFree = new ArrayList(var2);
+
+ int var3;
+ for(var3 = 0; var3 < var2; ++var3) {
+ this.sectorFree.add(Boolean.valueOf(true));
+ }
+
+ this.sectorFree.set(0, Boolean.valueOf(false));
+ this.sectorFree.set(1, Boolean.valueOf(false));
+ this.dataFile.seek(0L);
+
+ int var4;
+ for(var3 = 0; var3 < 1024; ++var3) {
+ var4 = this.dataFile.readInt();
+ this.offsets[var3] = var4;
+ if(var4 != 0 && (var4 >> 8) + (var4 & 255) <= this.sectorFree.size()) {
+ for(int var5 = 0; var5 < (var4 & 255); ++var5) {
+ this.sectorFree.set((var4 >> 8) + var5, Boolean.valueOf(false));
+ }
+ }
+ }
+
+ for(var3 = 0; var3 < 1024; ++var3) {
+ var4 = this.dataFile.readInt();
+ this.chunkTimestamps[var3] = var4;
+ }
+ } catch (IOException var6) {
+ var6.printStackTrace();
+ }
+
+ }
+
+ public synchronized int getSizeDelta() {
+ int var1 = this.sizeDelta;
+ this.sizeDelta = 0;
+ return var1;
+ }
+
+ private void debug(String var1) {
+ }
+
+ private void debugln(String var1) {
+ this.debug(var1 + "\n");
+ }
+
+ private void debug(String var1, int var2, int var3, String var4) {
+ this.debug("REGION " + var1 + " " + this.fileName.getName() + "[" + var2 + "," + var3 + "] = " + var4);
+ }
+
+ private void debug(String var1, int var2, int var3, int var4, String var5) {
+ this.debug("REGION " + var1 + " " + this.fileName.getName() + "[" + var2 + "," + var3 + "] " + var4 + "B = " + var5);
+ }
+
+ private void debugln(String var1, int var2, int var3, String var4) {
+ this.debug(var1, var2, var3, var4 + "\n");
+ }
+
+ public synchronized DataInputStream getChunkDataInputStream(int var1, int var2) {
+ if(this.outOfBounds(var1, var2)) {
+ this.debugln("READ", var1, var2, "out of bounds");
+ return null;
+ } else {
+ try {
+ int var3 = this.getOffset(var1, var2);
+ if(var3 == 0) {
+ return null;
+ } else {
+ int var4 = var3 >> 8;
+ int var5 = var3 & 255;
+ if(var4 + var5 > this.sectorFree.size()) {
+ this.debugln("READ", var1, var2, "invalid sector");
+ return null;
+ } else {
+ this.dataFile.seek((long)(var4 * 4096));
+ int var6 = this.dataFile.readInt();
+ if(var6 > 4096 * var5) {
+ this.debugln("READ", var1, var2, "invalid length: " + var6 + " > 4096 * " + var5);
+ return null;
+ } else {
+ byte var7 = this.dataFile.readByte();
+ byte[] var8;
+ DataInputStream var9;
+ if(var7 == 1) {
+ var8 = new byte[var6 - 1];
+ this.dataFile.read(var8);
+ var9 = new DataInputStream(new GZIPInputStream(new ByteArrayInputStream(var8)));
+ return var9;
+ } else if(var7 == 2) {
+ var8 = new byte[var6 - 1];
+ this.dataFile.read(var8);
+ var9 = new DataInputStream(new InflaterInputStream(new ByteArrayInputStream(var8)));
+ return var9;
+ } else {
+ this.debugln("READ", var1, var2, "unknown version " + var7);
+ return null;
+ }
+ }
+ }
+ }
+ } catch (IOException var10) {
+ this.debugln("READ", var1, var2, "exception");
+ return null;
+ }
+ }
+ }
+
+ public DataOutputStream getChunkDataOutputStream(int var1, int var2) {
+ return this.outOfBounds(var1, var2) ? null : new DataOutputStream(new DeflaterOutputStream(new RegionFileChunkBuffer(this, var1, var2)));
+ }
+
+ protected synchronized void write(int var1, int var2, byte[] var3, int var4) {
+ try {
+ int var5 = this.getOffset(var1, var2);
+ int var6 = var5 >> 8;
+ int var7 = var5 & 255;
+ int var8 = (var4 + 5) / 4096 + 1;
+ if(var8 >= 256) {
+ return;
+ }
+
+ if(var6 != 0 && var7 == var8) {
+ this.debug("SAVE", var1, var2, var4, "rewrite");
+ this.write(var6, var3, var4);
+ } else {
+ int var9;
+ for(var9 = 0; var9 < var7; ++var9) {
+ this.sectorFree.set(var6 + var9, Boolean.valueOf(true));
+ }
+
+ var9 = this.sectorFree.indexOf(Boolean.valueOf(true));
+ int var10 = 0;
+ int var11;
+ if(var9 != -1) {
+ for(var11 = var9; var11 < this.sectorFree.size(); ++var11) {
+ if(var10 != 0) {
+ if(((Boolean)this.sectorFree.get(var11)).booleanValue()) {
+ ++var10;
+ } else {
+ var10 = 0;
+ }
+ } else if(((Boolean)this.sectorFree.get(var11)).booleanValue()) {
+ var9 = var11;
+ var10 = 1;
+ }
+
+ if(var10 >= var8) {
+ break;
+ }
+ }
+ }
+
+ if(var10 >= var8) {
+ this.debug("SAVE", var1, var2, var4, "reuse");
+ var6 = var9;
+ this.setOffset(var1, var2, var9 << 8 | var8);
+
+ for(var11 = 0; var11 < var8; ++var11) {
+ this.sectorFree.set(var6 + var11, Boolean.valueOf(false));
+ }
+
+ this.write(var6, var3, var4);
+ } else {
+ this.debug("SAVE", var1, var2, var4, "grow");
+ this.dataFile.seek(this.dataFile.length());
+ var6 = this.sectorFree.size();
+
+ for(var11 = 0; var11 < var8; ++var11) {
+ this.dataFile.write(emptySector);
+ this.sectorFree.add(Boolean.valueOf(false));
+ }
+
+ this.sizeDelta += 4096 * var8;
+ this.write(var6, var3, var4);
+ this.setOffset(var1, var2, var6 << 8 | var8);
+ }
+ }
+
+ this.setChunkTimestamp(var1, var2, (int)(System.currentTimeMillis() / 1000L));
+ } catch (IOException var12) {
+ var12.printStackTrace();
+ }
+
+ }
+
+ private void write(int var1, byte[] var2, int var3) throws IOException {
+ this.debugln(" " + var1);
+ this.dataFile.seek((long)(var1 * 4096));
+ this.dataFile.writeInt(var3 + 1);
+ this.dataFile.writeByte(2);
+ this.dataFile.write(var2, 0, var3);
+ }
+
+ private boolean outOfBounds(int var1, int var2) {
+ return var1 < 0 || var1 >= 32 || var2 < 0 || var2 >= 32;
+ }
+
+ private int getOffset(int var1, int var2) {
+ return this.offsets[var1 + var2 * 32];
+ }
+
+ public boolean isChunkSaved(int var1, int var2) {
+ return this.getOffset(var1, var2) != 0;
+ }
+
+ private void setOffset(int var1, int var2, int var3) throws IOException {
+ this.offsets[var1 + var2 * 32] = var3;
+ this.dataFile.seek((long)((var1 + var2 * 32) * 4));
+ this.dataFile.writeInt(var3);
+ }
+
+ private void setChunkTimestamp(int var1, int var2, int var3) throws IOException {
+ this.chunkTimestamps[var1 + var2 * 32] = var3;
+ this.dataFile.seek((long)(4096 + (var1 + var2 * 32) * 4));
+ this.dataFile.writeInt(var3);
+ }
+
+ public void close() throws IOException {
+ this.dataFile.close();
+ }
+}
diff --git a/src/net/minecraft/src/RegionFileCache.java b/src/net/minecraft/src/RegionFileCache.java
new file mode 100644
index 0000000..b322dcb
--- /dev/null
+++ b/src/net/minecraft/src/RegionFileCache.java
@@ -0,0 +1,74 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public class RegionFileCache {
+ private static final Map field_22125_a = new HashMap();
+
+ public static synchronized RegionFile func_22123_a(File var0, int var1, int var2) {
+ File var3 = new File(var0, "region");
+ File var4 = new File(var3, "r." + (var1 >> 5) + "." + (var2 >> 5) + ".mcr");
+ Reference var5 = (Reference)field_22125_a.get(var4);
+ RegionFile var6;
+ if(var5 != null) {
+ var6 = (RegionFile)var5.get();
+ if(var6 != null) {
+ return var6;
+ }
+ }
+
+ if(!var3.exists()) {
+ var3.mkdirs();
+ }
+
+ if(field_22125_a.size() >= 256) {
+ func_22122_a();
+ }
+
+ var6 = new RegionFile(var4);
+ field_22125_a.put(var4, new SoftReference(var6));
+ return var6;
+ }
+
+ public static synchronized void func_22122_a() {
+ Iterator var0 = field_22125_a.values().iterator();
+
+ while(var0.hasNext()) {
+ Reference var1 = (Reference)var0.next();
+
+ try {
+ RegionFile var2 = (RegionFile)var1.get();
+ if(var2 != null) {
+ var2.close();
+ }
+ } catch (IOException var3) {
+ var3.printStackTrace();
+ }
+ }
+
+ field_22125_a.clear();
+ }
+
+ public static int func_22121_b(File var0, int var1, int var2) {
+ RegionFile var3 = func_22123_a(var0, var1, var2);
+ return var3.getSizeDelta();
+ }
+
+ public static DataInputStream func_22124_c(File var0, int var1, int var2) {
+ RegionFile var3 = func_22123_a(var0, var1, var2);
+ return var3.getChunkDataInputStream(var1 & 31, var2 & 31);
+ }
+
+ public static DataOutputStream func_22120_d(File var0, int var1, int var2) {
+ RegionFile var3 = func_22123_a(var0, var1, var2);
+ return var3.getChunkDataOutputStream(var1 & 31, var2 & 31);
+ }
+}
diff --git a/src/net/minecraft/src/RegionFileChunkBuffer.java b/src/net/minecraft/src/RegionFileChunkBuffer.java
new file mode 100644
index 0000000..0a95b71
--- /dev/null
+++ b/src/net/minecraft/src/RegionFileChunkBuffer.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+import java.io.ByteArrayOutputStream;
+
+class RegionFileChunkBuffer extends ByteArrayOutputStream {
+ private int field_22156_b;
+ private int field_22158_c;
+ final RegionFile field_22157_a;
+
+ public RegionFileChunkBuffer(RegionFile var1, int var2, int var3) {
+ super(8096);
+ this.field_22157_a = var1;
+ this.field_22156_b = var2;
+ this.field_22158_c = var3;
+ }
+
+ public void close() {
+ this.field_22157_a.write(this.field_22156_b, this.field_22158_c, this.buf, this.count);
+ }
+}
diff --git a/src/net/minecraft/src/SaveConverterMcRegion.java b/src/net/minecraft/src/SaveConverterMcRegion.java
new file mode 100644
index 0000000..821ea3c
--- /dev/null
+++ b/src/net/minecraft/src/SaveConverterMcRegion.java
@@ -0,0 +1,139 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.zip.GZIPInputStream;
+
+public class SaveConverterMcRegion extends SaveFormatOld {
+ public SaveConverterMcRegion(File var1) {
+ super(var1);
+ }
+
+ public ISaveHandler func_22105_a(String var1, boolean var2) {
+ return new SaveOldDir(this.field_22106_a, var1, var2);
+ }
+
+ public boolean isOldSaveType(String var1) {
+ WorldInfo var2 = this.getWorldInfo(var1);
+ return var2 != null && var2.getVersion() == 0;
+ }
+
+ public boolean converMapToMCRegion(String var1, IProgressUpdate var2) {
+ var2.setLoadingProgress(0);
+ ArrayList var3 = new ArrayList();
+ ArrayList var4 = new ArrayList();
+ ArrayList var5 = new ArrayList();
+ ArrayList var6 = new ArrayList();
+ File var7 = new File(this.field_22106_a, var1);
+ File var8 = new File(var7, "DIM-1");
+ System.out.println("Scanning folders...");
+ this.func_22108_a(var7, var3, var4);
+ if(var8.exists()) {
+ this.func_22108_a(var8, var5, var6);
+ }
+
+ int var9 = var3.size() + var5.size() + var4.size() + var6.size();
+ System.out.println("Total conversion count is " + var9);
+ this.func_22107_a(var7, var3, 0, var9, var2);
+ this.func_22107_a(var8, var5, var3.size(), var9, var2);
+ WorldInfo var10 = this.getWorldInfo(var1);
+ var10.setVersion(19132);
+ ISaveHandler var11 = this.func_22105_a(var1, false);
+ var11.func_22094_a(var10);
+ this.func_22109_a(var4, var3.size() + var5.size(), var9, var2);
+ if(var8.exists()) {
+ this.func_22109_a(var6, var3.size() + var5.size() + var4.size(), var9, var2);
+ }
+
+ return true;
+ }
+
+ private void func_22108_a(File var1, ArrayList var2, ArrayList var3) {
+ ChunkFolderPattern var4 = new ChunkFolderPattern((Empty2)null);
+ ChunkFilePattern var5 = new ChunkFilePattern((Empty2)null);
+ File[] var6 = var1.listFiles(var4);
+ File[] var7 = var6;
+ int var8 = var6.length;
+
+ for(int var9 = 0; var9 < var8; ++var9) {
+ File var10 = var7[var9];
+ var3.add(var10);
+ File[] var11 = var10.listFiles(var4);
+ File[] var12 = var11;
+ int var13 = var11.length;
+
+ for(int var14 = 0; var14 < var13; ++var14) {
+ File var15 = var12[var14];
+ File[] var16 = var15.listFiles(var5);
+ File[] var17 = var16;
+ int var18 = var16.length;
+
+ for(int var19 = 0; var19 < var18; ++var19) {
+ File var20 = var17[var19];
+ var2.add(new ChunkFile(var20));
+ }
+ }
+ }
+
+ }
+
+ private void func_22107_a(File var1, ArrayList var2, int var3, int var4, IProgressUpdate var5) {
+ Collections.sort(var2);
+ byte[] var6 = new byte[4096];
+ Iterator var7 = var2.iterator();
+
+ while(var7.hasNext()) {
+ ChunkFile var8 = (ChunkFile)var7.next();
+ int var9 = var8.func_22205_b();
+ int var10 = var8.func_22204_c();
+ RegionFile var11 = RegionFileCache.func_22123_a(var1, var9, var10);
+ if(!var11.isChunkSaved(var9 & 31, var10 & 31)) {
+ try {
+ DataInputStream var12 = new DataInputStream(new GZIPInputStream(new FileInputStream(var8.func_22207_a())));
+ DataOutputStream var13 = var11.getChunkDataOutputStream(var9 & 31, var10 & 31);
+ boolean var14 = false;
+
+ while(true) {
+ int var17 = var12.read(var6);
+ if(var17 == -1) {
+ var13.close();
+ var12.close();
+ break;
+ }
+
+ var13.write(var6, 0, var17);
+ }
+ } catch (IOException var15) {
+ var15.printStackTrace();
+ }
+ }
+
+ ++var3;
+ int var16 = (int)Math.round(100.0D * (double)var3 / (double)var4);
+ var5.setLoadingProgress(var16);
+ }
+
+ RegionFileCache.func_22122_a();
+ }
+
+ private void func_22109_a(ArrayList var1, int var2, int var3, IProgressUpdate var4) {
+ Iterator var5 = var1.iterator();
+
+ while(var5.hasNext()) {
+ File var6 = (File)var5.next();
+ File[] var7 = var6.listFiles();
+ func_22104_a(var7);
+ var6.delete();
+ ++var2;
+ int var8 = (int)Math.round(100.0D * (double)var2 / (double)var3);
+ var4.setLoadingProgress(var8);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/SaveFormatOld.java b/src/net/minecraft/src/SaveFormatOld.java
new file mode 100644
index 0000000..a78020c
--- /dev/null
+++ b/src/net/minecraft/src/SaveFormatOld.java
@@ -0,0 +1,72 @@
+package net.minecraft.src;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+public class SaveFormatOld implements ISaveFormat {
+ protected final File field_22106_a;
+
+ public SaveFormatOld(File var1) {
+ if(!var1.exists()) {
+ var1.mkdirs();
+ }
+
+ this.field_22106_a = var1;
+ }
+
+ public WorldInfo getWorldInfo(String var1) {
+ File var2 = new File(this.field_22106_a, var1);
+ if(!var2.exists()) {
+ return null;
+ } else {
+ File var3 = new File(var2, "level.dat");
+ NBTTagCompound var4;
+ NBTTagCompound var5;
+ if(var3.exists()) {
+ try {
+ var4 = CompressedStreamTools.func_770_a(new FileInputStream(var3));
+ var5 = var4.getCompoundTag("Data");
+ return new WorldInfo(var5);
+ } catch (Exception var7) {
+ var7.printStackTrace();
+ }
+ }
+
+ var3 = new File(var2, "level.dat_old");
+ if(var3.exists()) {
+ try {
+ var4 = CompressedStreamTools.func_770_a(new FileInputStream(var3));
+ var5 = var4.getCompoundTag("Data");
+ return new WorldInfo(var5);
+ } catch (Exception var6) {
+ var6.printStackTrace();
+ }
+ }
+
+ return null;
+ }
+ }
+
+ protected static void func_22104_a(File[] var0) {
+ for(int var1 = 0; var1 < var0.length; ++var1) {
+ if(var0[var1].isDirectory()) {
+ func_22104_a(var0[var1].listFiles());
+ }
+
+ var0[var1].delete();
+ }
+
+ }
+
+ public ISaveHandler func_22105_a(String var1, boolean var2) {
+ return new PlayerNBTManager(this.field_22106_a, var1, var2);
+ }
+
+ public boolean isOldSaveType(String var1) {
+ return false;
+ }
+
+ public boolean converMapToMCRegion(String var1, IProgressUpdate var2) {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/SaveOldDir.java b/src/net/minecraft/src/SaveOldDir.java
new file mode 100644
index 0000000..11f8e65
--- /dev/null
+++ b/src/net/minecraft/src/SaveOldDir.java
@@ -0,0 +1,30 @@
+package net.minecraft.src;
+
+import java.io.File;
+import java.util.List;
+
+public class SaveOldDir extends PlayerNBTManager {
+ public SaveOldDir(File var1, String var2, boolean var3) {
+ super(var1, var2, var3);
+ }
+
+ public IChunkLoader func_22092_a(WorldProvider var1) {
+ File var2 = this.getWorldDir();
+ if(var1 instanceof WorldProviderHell) {
+ File var3 = new File(var2, "DIM-1");
+ var3.mkdirs();
+ return new McRegionChunkLoader(var3);
+ } else {
+ return new McRegionChunkLoader(var2);
+ }
+ }
+
+ public void func_22095_a(WorldInfo var1, List var2) {
+ var1.setVersion(19132);
+ super.func_22095_a(var1, var2);
+ }
+
+ public void func_22093_e() {
+ RegionFileCache.func_22122_a();
+ }
+}
diff --git a/src/net/minecraft/src/ServerCommand.java b/src/net/minecraft/src/ServerCommand.java
new file mode 100644
index 0000000..d53335a
--- /dev/null
+++ b/src/net/minecraft/src/ServerCommand.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public class ServerCommand {
+ public final String command;
+ public final ICommandListener commandListener;
+
+ public ServerCommand(String var1, ICommandListener var2) {
+ this.command = var1;
+ this.commandListener = var2;
+ }
+}
diff --git a/src/net/minecraft/src/ServerConfigurationManager.java b/src/net/minecraft/src/ServerConfigurationManager.java
new file mode 100644
index 0000000..57136f1
--- /dev/null
+++ b/src/net/minecraft/src/ServerConfigurationManager.java
@@ -0,0 +1,555 @@
+package net.minecraft.src;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Logger;
+import net.minecraft.server.MinecraftServer;
+
+public class ServerConfigurationManager {
+ public static Logger logger = Logger.getLogger("Minecraft");
+ public List playerEntities = new ArrayList();
+ private MinecraftServer mcServer;
+ private PlayerManager[] playerManagerObj = new PlayerManager[2];
+ private int maxPlayers;
+ private Set bannedPlayers = new HashSet();
+ private Set bannedIPs = new HashSet();
+ private Set ops = new HashSet();
+ private Set whiteListedIPs = new HashSet();
+ private File bannedPlayersFile;
+ private File ipBanFile;
+ private File opFile;
+ private File whitelistPlayersFile;
+ private IPlayerFileData playerNBTManagerObj;
+ private boolean whiteListEnforced;
+
+ public ServerConfigurationManager(MinecraftServer var1) {
+ this.mcServer = var1;
+ this.bannedPlayersFile = var1.getFile("banned-players.txt");
+ this.ipBanFile = var1.getFile("banned-ips.txt");
+ this.opFile = var1.getFile("ops.txt");
+ this.whitelistPlayersFile = var1.getFile("white-list.txt");
+ int var2 = var1.propertyManagerObj.getIntProperty("view-distance", 10);
+ this.playerManagerObj[0] = new PlayerManager(var1, 0, var2);
+ this.playerManagerObj[1] = new PlayerManager(var1, -1, var2);
+ this.maxPlayers = var1.propertyManagerObj.getIntProperty("max-players", 20);
+ this.whiteListEnforced = var1.propertyManagerObj.getBooleanProperty("white-list", false);
+ this.readBannedPlayers();
+ this.loadBannedList();
+ this.loadOps();
+ this.loadWhiteList();
+ this.writeBannedPlayers();
+ this.saveBannedList();
+ this.saveOps();
+ this.saveWhiteList();
+ }
+
+ public void setPlayerManager(WorldServer[] var1) {
+ this.playerNBTManagerObj = var1[0].getWorldFile().func_22090_d();
+ }
+
+ public void func_28172_a(EntityPlayerMP var1) {
+ this.playerManagerObj[0].removePlayer(var1);
+ this.playerManagerObj[1].removePlayer(var1);
+ this.getPlayerManager(var1.dimension).addPlayer(var1);
+ WorldServer var2 = this.mcServer.getWorldManager(var1.dimension);
+ var2.chunkProviderServer.loadChunk((int)var1.posX >> 4, (int)var1.posZ >> 4);
+ }
+
+ public int getMaxTrackingDistance() {
+ return this.playerManagerObj[0].getMaxTrackingDistance();
+ }
+
+ private PlayerManager getPlayerManager(int var1) {
+ return var1 == -1 ? this.playerManagerObj[1] : this.playerManagerObj[0];
+ }
+
+ public void readPlayerDataFromFile(EntityPlayerMP var1) {
+ this.playerNBTManagerObj.readPlayerData(var1);
+ }
+
+ public void playerLoggedIn(EntityPlayerMP var1) {
+ this.playerEntities.add(var1);
+ WorldServer var2 = this.mcServer.getWorldManager(var1.dimension);
+ var2.chunkProviderServer.loadChunk((int)var1.posX >> 4, (int)var1.posZ >> 4);
+
+ while(var2.getCollidingBoundingBoxes(var1, var1.boundingBox).size() != 0) {
+ var1.setPosition(var1.posX, var1.posY + 1.0D, var1.posZ);
+ }
+
+ var2.entityJoinedWorld(var1);
+ this.getPlayerManager(var1.dimension).addPlayer(var1);
+ }
+
+ public void func_613_b(EntityPlayerMP var1) {
+ this.getPlayerManager(var1.dimension).func_543_c(var1);
+ }
+
+ public void playerLoggedOut(EntityPlayerMP var1) {
+ this.playerNBTManagerObj.writePlayerData(var1);
+ this.mcServer.getWorldManager(var1.dimension).removePlayerForLogoff(var1);
+ this.playerEntities.remove(var1);
+ this.getPlayerManager(var1.dimension).removePlayer(var1);
+ }
+
+ public EntityPlayerMP login(NetLoginHandler var1, String var2) {
+ if(this.bannedPlayers.contains(var2.trim().toLowerCase())) {
+ var1.kickUser("You are banned from this server!");
+ return null;
+ } else if(!this.isAllowedToLogin(var2)) {
+ var1.kickUser("You are not white-listed on this server!");
+ return null;
+ } else {
+ String var3 = var1.netManager.getRemoteAddress().toString();
+ var3 = var3.substring(var3.indexOf("/") + 1);
+ var3 = var3.substring(0, var3.indexOf(":"));
+ if(this.bannedIPs.contains(var3)) {
+ var1.kickUser("Your IP address is banned from this server!");
+ return null;
+ } else if(this.playerEntities.size() >= this.maxPlayers) {
+ var1.kickUser("The server is full!");
+ return null;
+ } else {
+ for(int var4 = 0; var4 < this.playerEntities.size(); ++var4) {
+ EntityPlayerMP var5 = (EntityPlayerMP)this.playerEntities.get(var4);
+ if(var5.username.equalsIgnoreCase(var2)) {
+ var5.playerNetServerHandler.kickPlayer("You logged in from another location");
+ }
+ }
+
+ return new EntityPlayerMP(this.mcServer, this.mcServer.getWorldManager(0), var2, new ItemInWorldManager(this.mcServer.getWorldManager(0)));
+ }
+ }
+ }
+
+ public EntityPlayerMP recreatePlayerEntity(EntityPlayerMP var1, int var2) {
+ this.mcServer.getEntityTracker(var1.dimension).removeTrackedPlayerSymmetric(var1);
+ this.mcServer.getEntityTracker(var1.dimension).untrackEntity(var1);
+ this.getPlayerManager(var1.dimension).removePlayer(var1);
+ this.playerEntities.remove(var1);
+ this.mcServer.getWorldManager(var1.dimension).removePlayer(var1);
+ ChunkCoordinates var3 = var1.getSpawnChunk();
+ var1.dimension = var2;
+ EntityPlayerMP var4 = new EntityPlayerMP(this.mcServer, this.mcServer.getWorldManager(var1.dimension), var1.username, new ItemInWorldManager(this.mcServer.getWorldManager(var1.dimension)));
+ var4.entityId = var1.entityId;
+ var4.playerNetServerHandler = var1.playerNetServerHandler;
+ WorldServer var5 = this.mcServer.getWorldManager(var1.dimension);
+ if(var3 != null) {
+ ChunkCoordinates var6 = EntityPlayer.func_25051_a(this.mcServer.getWorldManager(var1.dimension), var3);
+ if(var6 != null) {
+ var4.setLocationAndAngles((double)((float)var6.posX + 0.5F), (double)((float)var6.posY + 0.1F), (double)((float)var6.posZ + 0.5F), 0.0F, 0.0F);
+ var4.setSpawnChunk(var3);
+ } else {
+ var4.playerNetServerHandler.sendPacket(new Packet70Bed(0));
+ }
+ }
+
+ var5.chunkProviderServer.loadChunk((int)var4.posX >> 4, (int)var4.posZ >> 4);
+
+ while(var5.getCollidingBoundingBoxes(var4, var4.boundingBox).size() != 0) {
+ var4.setPosition(var4.posX, var4.posY + 1.0D, var4.posZ);
+ }
+
+ var4.playerNetServerHandler.sendPacket(new Packet9Respawn((byte)var4.dimension));
+ var4.playerNetServerHandler.teleportTo(var4.posX, var4.posY, var4.posZ, var4.rotationYaw, var4.rotationPitch);
+ this.func_28170_a(var4, var5);
+ this.getPlayerManager(var4.dimension).addPlayer(var4);
+ var5.entityJoinedWorld(var4);
+ this.playerEntities.add(var4);
+ var4.func_20057_k();
+ var4.func_22068_s();
+ return var4;
+ }
+
+ public void sendPlayerToOtherDimension(EntityPlayerMP var1) {
+ WorldServer var2 = this.mcServer.getWorldManager(var1.dimension);
+ boolean var3 = false;
+ byte var11;
+ if(var1.dimension == -1) {
+ var11 = 0;
+ } else {
+ var11 = -1;
+ }
+
+ var1.dimension = var11;
+ WorldServer var4 = this.mcServer.getWorldManager(var1.dimension);
+ var1.playerNetServerHandler.sendPacket(new Packet9Respawn((byte)var1.dimension));
+ var2.removePlayer(var1);
+ var1.isDead = false;
+ double var5 = var1.posX;
+ double var7 = var1.posZ;
+ double var9 = 8.0D;
+ if(var1.dimension == -1) {
+ var5 /= var9;
+ var7 /= var9;
+ var1.setLocationAndAngles(var5, var1.posY, var7, var1.rotationYaw, var1.rotationPitch);
+ if(var1.isEntityAlive()) {
+ var2.updateEntityWithOptionalForce(var1, false);
+ }
+ } else {
+ var5 *= var9;
+ var7 *= var9;
+ var1.setLocationAndAngles(var5, var1.posY, var7, var1.rotationYaw, var1.rotationPitch);
+ if(var1.isEntityAlive()) {
+ var2.updateEntityWithOptionalForce(var1, false);
+ }
+ }
+
+ if(var1.isEntityAlive()) {
+ var4.entityJoinedWorld(var1);
+ var1.setLocationAndAngles(var5, var1.posY, var7, var1.rotationYaw, var1.rotationPitch);
+ var4.updateEntityWithOptionalForce(var1, false);
+ var4.chunkProviderServer.chunkLoadOverride = true;
+ (new Teleporter()).setExitLocation(var4, var1);
+ var4.chunkProviderServer.chunkLoadOverride = false;
+ }
+
+ this.func_28172_a(var1);
+ var1.playerNetServerHandler.teleportTo(var1.posX, var1.posY, var1.posZ, var1.rotationYaw, var1.rotationPitch);
+ var1.setWorldHandler(var4);
+ this.func_28170_a(var1, var4);
+ this.func_30008_g(var1);
+ }
+
+ public void onTick() {
+ for(int var1 = 0; var1 < this.playerManagerObj.length; ++var1) {
+ this.playerManagerObj[var1].updatePlayerInstances();
+ }
+
+ }
+
+ public void markBlockNeedsUpdate(int var1, int var2, int var3, int var4) {
+ this.getPlayerManager(var4).markBlockNeedsUpdate(var1, var2, var3);
+ }
+
+ public void sendPacketToAllPlayers(Packet var1) {
+ for(int var2 = 0; var2 < this.playerEntities.size(); ++var2) {
+ EntityPlayerMP var3 = (EntityPlayerMP)this.playerEntities.get(var2);
+ var3.playerNetServerHandler.sendPacket(var1);
+ }
+
+ }
+
+ public void sendPacketToAllPlayersInDimension(Packet var1, int var2) {
+ for(int var3 = 0; var3 < this.playerEntities.size(); ++var3) {
+ EntityPlayerMP var4 = (EntityPlayerMP)this.playerEntities.get(var3);
+ if(var4.dimension == var2) {
+ var4.playerNetServerHandler.sendPacket(var1);
+ }
+ }
+
+ }
+
+ public String getPlayerList() {
+ String var1 = "";
+
+ for(int var2 = 0; var2 < this.playerEntities.size(); ++var2) {
+ if(var2 > 0) {
+ var1 = var1 + ", ";
+ }
+
+ var1 = var1 + ((EntityPlayerMP)this.playerEntities.get(var2)).username;
+ }
+
+ return var1;
+ }
+
+ public void banPlayer(String var1) {
+ this.bannedPlayers.add(var1.toLowerCase());
+ this.writeBannedPlayers();
+ }
+
+ public void pardonPlayer(String var1) {
+ this.bannedPlayers.remove(var1.toLowerCase());
+ this.writeBannedPlayers();
+ }
+
+ private void readBannedPlayers() {
+ try {
+ this.bannedPlayers.clear();
+ BufferedReader var1 = new BufferedReader(new FileReader(this.bannedPlayersFile));
+ String var2 = "";
+
+ while(true) {
+ var2 = var1.readLine();
+ if(var2 == null) {
+ var1.close();
+ break;
+ }
+
+ this.bannedPlayers.add(var2.trim().toLowerCase());
+ }
+ } catch (Exception var3) {
+ logger.warning("Failed to load ban list: " + var3);
+ }
+
+ }
+
+ private void writeBannedPlayers() {
+ try {
+ PrintWriter var1 = new PrintWriter(new FileWriter(this.bannedPlayersFile, false));
+ Iterator var2 = this.bannedPlayers.iterator();
+
+ while(var2.hasNext()) {
+ String var3 = (String)var2.next();
+ var1.println(var3);
+ }
+
+ var1.close();
+ } catch (Exception var4) {
+ logger.warning("Failed to save ban list: " + var4);
+ }
+
+ }
+
+ public void banIP(String var1) {
+ this.bannedIPs.add(var1.toLowerCase());
+ this.saveBannedList();
+ }
+
+ public void pardonIP(String var1) {
+ this.bannedIPs.remove(var1.toLowerCase());
+ this.saveBannedList();
+ }
+
+ private void loadBannedList() {
+ try {
+ this.bannedIPs.clear();
+ BufferedReader var1 = new BufferedReader(new FileReader(this.ipBanFile));
+ String var2 = "";
+
+ while(true) {
+ var2 = var1.readLine();
+ if(var2 == null) {
+ var1.close();
+ break;
+ }
+
+ this.bannedIPs.add(var2.trim().toLowerCase());
+ }
+ } catch (Exception var3) {
+ logger.warning("Failed to load ip ban list: " + var3);
+ }
+
+ }
+
+ private void saveBannedList() {
+ try {
+ PrintWriter var1 = new PrintWriter(new FileWriter(this.ipBanFile, false));
+ Iterator var2 = this.bannedIPs.iterator();
+
+ while(var2.hasNext()) {
+ String var3 = (String)var2.next();
+ var1.println(var3);
+ }
+
+ var1.close();
+ } catch (Exception var4) {
+ logger.warning("Failed to save ip ban list: " + var4);
+ }
+
+ }
+
+ public void opPlayer(String var1) {
+ this.ops.add(var1.toLowerCase());
+ this.saveOps();
+ }
+
+ public void deopPlayer(String var1) {
+ this.ops.remove(var1.toLowerCase());
+ this.saveOps();
+ }
+
+ private void loadOps() {
+ try {
+ this.ops.clear();
+ BufferedReader var1 = new BufferedReader(new FileReader(this.opFile));
+ String var2 = "";
+
+ while(true) {
+ var2 = var1.readLine();
+ if(var2 == null) {
+ var1.close();
+ break;
+ }
+
+ this.ops.add(var2.trim().toLowerCase());
+ }
+ } catch (Exception var3) {
+ logger.warning("Failed to load ip ban list: " + var3);
+ }
+
+ }
+
+ private void saveOps() {
+ try {
+ PrintWriter var1 = new PrintWriter(new FileWriter(this.opFile, false));
+ Iterator var2 = this.ops.iterator();
+
+ while(var2.hasNext()) {
+ String var3 = (String)var2.next();
+ var1.println(var3);
+ }
+
+ var1.close();
+ } catch (Exception var4) {
+ logger.warning("Failed to save ip ban list: " + var4);
+ }
+
+ }
+
+ private void loadWhiteList() {
+ try {
+ this.whiteListedIPs.clear();
+ BufferedReader var1 = new BufferedReader(new FileReader(this.whitelistPlayersFile));
+ String var2 = "";
+
+ while(true) {
+ var2 = var1.readLine();
+ if(var2 == null) {
+ var1.close();
+ break;
+ }
+
+ this.whiteListedIPs.add(var2.trim().toLowerCase());
+ }
+ } catch (Exception var3) {
+ logger.warning("Failed to load white-list: " + var3);
+ }
+
+ }
+
+ private void saveWhiteList() {
+ try {
+ PrintWriter var1 = new PrintWriter(new FileWriter(this.whitelistPlayersFile, false));
+ Iterator var2 = this.whiteListedIPs.iterator();
+
+ while(var2.hasNext()) {
+ String var3 = (String)var2.next();
+ var1.println(var3);
+ }
+
+ var1.close();
+ } catch (Exception var4) {
+ logger.warning("Failed to save white-list: " + var4);
+ }
+
+ }
+
+ public boolean isAllowedToLogin(String var1) {
+ var1 = var1.trim().toLowerCase();
+ return !this.whiteListEnforced || this.ops.contains(var1) || this.whiteListedIPs.contains(var1);
+ }
+
+ public boolean isOp(String var1) {
+ return this.ops.contains(var1.trim().toLowerCase());
+ }
+
+ public EntityPlayerMP getPlayerEntity(String var1) {
+ for(int var2 = 0; var2 < this.playerEntities.size(); ++var2) {
+ EntityPlayerMP var3 = (EntityPlayerMP)this.playerEntities.get(var2);
+ if(var3.username.equalsIgnoreCase(var1)) {
+ return var3;
+ }
+ }
+
+ return null;
+ }
+
+ public void sendChatMessageToPlayer(String var1, String var2) {
+ EntityPlayerMP var3 = this.getPlayerEntity(var1);
+ if(var3 != null) {
+ var3.playerNetServerHandler.sendPacket(new Packet3Chat(var2));
+ }
+
+ }
+
+ public void sendPacketToPlayersAroundPoint(double var1, double var3, double var5, double var7, int var9, Packet var10) {
+ this.func_28171_a((EntityPlayer)null, var1, var3, var5, var7, var9, var10);
+ }
+
+ public void func_28171_a(EntityPlayer var1, double var2, double var4, double var6, double var8, int var10, Packet var11) {
+ for(int var12 = 0; var12 < this.playerEntities.size(); ++var12) {
+ EntityPlayerMP var13 = (EntityPlayerMP)this.playerEntities.get(var12);
+ if(var13 != var1 && var13.dimension == var10) {
+ double var14 = var2 - var13.posX;
+ double var16 = var4 - var13.posY;
+ double var18 = var6 - var13.posZ;
+ if(var14 * var14 + var16 * var16 + var18 * var18 < var8 * var8) {
+ var13.playerNetServerHandler.sendPacket(var11);
+ }
+ }
+ }
+
+ }
+
+ public void sendChatMessageToAllOps(String var1) {
+ Packet3Chat var2 = new Packet3Chat(var1);
+
+ for(int var3 = 0; var3 < this.playerEntities.size(); ++var3) {
+ EntityPlayerMP var4 = (EntityPlayerMP)this.playerEntities.get(var3);
+ if(this.isOp(var4.username)) {
+ var4.playerNetServerHandler.sendPacket(var2);
+ }
+ }
+
+ }
+
+ public boolean sendPacketToPlayer(String var1, Packet var2) {
+ EntityPlayerMP var3 = this.getPlayerEntity(var1);
+ if(var3 != null) {
+ var3.playerNetServerHandler.sendPacket(var2);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void savePlayerStates() {
+ for(int var1 = 0; var1 < this.playerEntities.size(); ++var1) {
+ this.playerNBTManagerObj.writePlayerData((EntityPlayer)this.playerEntities.get(var1));
+ }
+
+ }
+
+ public void sentTileEntityToPlayer(int var1, int var2, int var3, TileEntity var4) {
+ }
+
+ public void addToWhiteList(String var1) {
+ this.whiteListedIPs.add(var1);
+ this.saveWhiteList();
+ }
+
+ public void removeFromWhiteList(String var1) {
+ this.whiteListedIPs.remove(var1);
+ this.saveWhiteList();
+ }
+
+ public Set getWhiteListedIPs() {
+ return this.whiteListedIPs;
+ }
+
+ public void reloadWhiteList() {
+ this.loadWhiteList();
+ }
+
+ public void func_28170_a(EntityPlayerMP var1, WorldServer var2) {
+ var1.playerNetServerHandler.sendPacket(new Packet4UpdateTime(var2.getWorldTime()));
+ if(var2.func_27068_v()) {
+ var1.playerNetServerHandler.sendPacket(new Packet70Bed(1));
+ }
+
+ }
+
+ public void func_30008_g(EntityPlayerMP var1) {
+ var1.func_28017_a(var1.personalCraftingInventory);
+ var1.func_30001_B();
+ }
+}
diff --git a/src/net/minecraft/src/ServerGUI.java b/src/net/minecraft/src/ServerGUI.java
new file mode 100644
index 0000000..f779cbe
--- /dev/null
+++ b/src/net/minecraft/src/ServerGUI.java
@@ -0,0 +1,92 @@
+package net.minecraft.src;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.util.logging.Logger;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.UIManager;
+import javax.swing.border.EtchedBorder;
+import javax.swing.border.TitledBorder;
+import net.minecraft.server.MinecraftServer;
+
+public class ServerGUI extends JComponent implements ICommandListener {
+ public static Logger logger = Logger.getLogger("Minecraft");
+ private MinecraftServer mcServer;
+
+ public static void initGui(MinecraftServer var0) {
+ try {
+ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ } catch (Exception var3) {
+ }
+
+ ServerGUI var1 = new ServerGUI(var0);
+ JFrame var2 = new JFrame("Minecraft server");
+ var2.add(var1);
+ var2.pack();
+ var2.setLocationRelativeTo((Component)null);
+ var2.setVisible(true);
+ var2.addWindowListener(new ServerWindowAdapter(var0));
+ }
+
+ public ServerGUI(MinecraftServer var1) {
+ this.mcServer = var1;
+ this.setPreferredSize(new Dimension(854, 480));
+ this.setLayout(new BorderLayout());
+
+ try {
+ this.add(this.getLogComponent(), "Center");
+ this.add(this.getStatsComponent(), "West");
+ } catch (Exception var3) {
+ var3.printStackTrace();
+ }
+
+ }
+
+ private JComponent getStatsComponent() {
+ JPanel var1 = new JPanel(new BorderLayout());
+ var1.add(new GuiStatsComponent(), "North");
+ var1.add(this.getPlayerListComponent(), "Center");
+ var1.setBorder(new TitledBorder(new EtchedBorder(), "Stats"));
+ return var1;
+ }
+
+ private JComponent getPlayerListComponent() {
+ PlayerListBox var1 = new PlayerListBox(this.mcServer);
+ JScrollPane var2 = new JScrollPane(var1, 22, 30);
+ var2.setBorder(new TitledBorder(new EtchedBorder(), "Players"));
+ return var2;
+ }
+
+ private JComponent getLogComponent() {
+ JPanel var1 = new JPanel(new BorderLayout());
+ JTextArea var2 = new JTextArea();
+ logger.addHandler(new GuiLogOutputHandler(var2));
+ JScrollPane var3 = new JScrollPane(var2, 22, 30);
+ var2.setEditable(false);
+ JTextField var4 = new JTextField();
+ var4.addActionListener(new ServerGuiCommandListener(this, var4));
+ var2.addFocusListener(new ServerGuiFocusAdapter(this));
+ var1.add(var3, "Center");
+ var1.add(var4, "South");
+ var1.setBorder(new TitledBorder(new EtchedBorder(), "Log and chat"));
+ return var1;
+ }
+
+ public void log(String var1) {
+ logger.info(var1);
+ }
+
+ public String getUsername() {
+ return "CONSOLE";
+ }
+
+ static MinecraftServer getMinecraftServer(ServerGUI var0) {
+ return var0.mcServer;
+ }
+}
diff --git a/src/net/minecraft/src/ServerGuiCommandListener.java b/src/net/minecraft/src/ServerGuiCommandListener.java
new file mode 100644
index 0000000..a3cf06e
--- /dev/null
+++ b/src/net/minecraft/src/ServerGuiCommandListener.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.JTextField;
+
+class ServerGuiCommandListener implements ActionListener {
+ final JTextField textField;
+ final ServerGUI mcServerGui;
+
+ ServerGuiCommandListener(ServerGUI var1, JTextField var2) {
+ this.mcServerGui = var1;
+ this.textField = var2;
+ }
+
+ public void actionPerformed(ActionEvent var1) {
+ String var2 = this.textField.getText().trim();
+ if(var2.length() > 0) {
+ ServerGUI.getMinecraftServer(this.mcServerGui).addCommand(var2, this.mcServerGui);
+ }
+
+ this.textField.setText("");
+ }
+}
diff --git a/src/net/minecraft/src/ServerGuiFocusAdapter.java b/src/net/minecraft/src/ServerGuiFocusAdapter.java
new file mode 100644
index 0000000..c9d9b1a
--- /dev/null
+++ b/src/net/minecraft/src/ServerGuiFocusAdapter.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+
+class ServerGuiFocusAdapter extends FocusAdapter {
+ final ServerGUI mcServerGui;
+
+ ServerGuiFocusAdapter(ServerGUI var1) {
+ this.mcServerGui = var1;
+ }
+
+ public void focusGained(FocusEvent var1) {
+ }
+}
diff --git a/src/net/minecraft/src/ServerWindowAdapter.java b/src/net/minecraft/src/ServerWindowAdapter.java
new file mode 100644
index 0000000..a4210c8
--- /dev/null
+++ b/src/net/minecraft/src/ServerWindowAdapter.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import net.minecraft.server.MinecraftServer;
+
+final class ServerWindowAdapter extends WindowAdapter {
+ final MinecraftServer mcServer;
+
+ ServerWindowAdapter(MinecraftServer var1) {
+ this.mcServer = var1;
+ }
+
+ public void windowClosing(WindowEvent var1) {
+ this.mcServer.initiateShutdown();
+
+ while(!this.mcServer.serverStopped) {
+ try {
+ Thread.sleep(100L);
+ } catch (InterruptedException var3) {
+ var3.printStackTrace();
+ }
+ }
+
+ System.exit(0);
+ }
+}
diff --git a/src/net/minecraft/src/ShapedRecipes.java b/src/net/minecraft/src/ShapedRecipes.java
new file mode 100644
index 0000000..c397fdf
--- /dev/null
+++ b/src/net/minecraft/src/ShapedRecipes.java
@@ -0,0 +1,79 @@
+package net.minecraft.src;
+
+public class ShapedRecipes implements IRecipe {
+ private int field_21140_b;
+ private int field_21144_c;
+ private ItemStack[] field_21143_d;
+ private ItemStack field_21142_e;
+ public final int field_21141_a;
+
+ public ShapedRecipes(int var1, int var2, ItemStack[] var3, ItemStack var4) {
+ this.field_21141_a = var4.itemID;
+ this.field_21140_b = var1;
+ this.field_21144_c = var2;
+ this.field_21143_d = var3;
+ this.field_21142_e = var4;
+ }
+
+ public ItemStack func_25077_b() {
+ return this.field_21142_e;
+ }
+
+ public boolean func_21134_a(InventoryCrafting var1) {
+ for(int var2 = 0; var2 <= 3 - this.field_21140_b; ++var2) {
+ for(int var3 = 0; var3 <= 3 - this.field_21144_c; ++var3) {
+ if(this.func_21139_a(var1, var2, var3, true)) {
+ return true;
+ }
+
+ if(this.func_21139_a(var1, var2, var3, false)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private boolean func_21139_a(InventoryCrafting var1, int var2, int var3, boolean var4) {
+ for(int var5 = 0; var5 < 3; ++var5) {
+ for(int var6 = 0; var6 < 3; ++var6) {
+ int var7 = var5 - var2;
+ int var8 = var6 - var3;
+ ItemStack var9 = null;
+ if(var7 >= 0 && var8 >= 0 && var7 < this.field_21140_b && var8 < this.field_21144_c) {
+ if(var4) {
+ var9 = this.field_21143_d[this.field_21140_b - var7 - 1 + var8 * this.field_21140_b];
+ } else {
+ var9 = this.field_21143_d[var7 + var8 * this.field_21140_b];
+ }
+ }
+
+ ItemStack var10 = var1.func_21084_a(var5, var6);
+ if(var10 != null || var9 != null) {
+ if(var10 == null && var9 != null || var10 != null && var9 == null) {
+ return false;
+ }
+
+ if(var9.itemID != var10.itemID) {
+ return false;
+ }
+
+ if(var9.getItemDamage() != -1 && var9.getItemDamage() != var10.getItemDamage()) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+
+ public ItemStack func_21136_b(InventoryCrafting var1) {
+ return new ItemStack(this.field_21142_e.itemID, this.field_21142_e.stackSize, this.field_21142_e.getItemDamage());
+ }
+
+ public int getRecipeSize() {
+ return this.field_21140_b * this.field_21144_c;
+ }
+}
diff --git a/src/net/minecraft/src/ShapelessRecipes.java b/src/net/minecraft/src/ShapelessRecipes.java
new file mode 100644
index 0000000..4ac8e30
--- /dev/null
+++ b/src/net/minecraft/src/ShapelessRecipes.java
@@ -0,0 +1,56 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class ShapelessRecipes implements IRecipe {
+ private final ItemStack field_21138_a;
+ private final List field_21137_b;
+
+ public ShapelessRecipes(ItemStack var1, List var2) {
+ this.field_21138_a = var1;
+ this.field_21137_b = var2;
+ }
+
+ public ItemStack func_25077_b() {
+ return this.field_21138_a;
+ }
+
+ public boolean func_21134_a(InventoryCrafting var1) {
+ ArrayList var2 = new ArrayList(this.field_21137_b);
+
+ for(int var3 = 0; var3 < 3; ++var3) {
+ for(int var4 = 0; var4 < 3; ++var4) {
+ ItemStack var5 = var1.func_21084_a(var4, var3);
+ if(var5 != null) {
+ boolean var6 = false;
+ Iterator var7 = var2.iterator();
+
+ while(var7.hasNext()) {
+ ItemStack var8 = (ItemStack)var7.next();
+ if(var5.itemID == var8.itemID && (var8.getItemDamage() == -1 || var5.getItemDamage() == var8.getItemDamage())) {
+ var6 = true;
+ var2.remove(var8);
+ break;
+ }
+ }
+
+ if(!var6) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return var2.isEmpty();
+ }
+
+ public ItemStack func_21136_b(InventoryCrafting var1) {
+ return this.field_21138_a.copy();
+ }
+
+ public int getRecipeSize() {
+ return this.field_21137_b.size();
+ }
+}
diff --git a/src/net/minecraft/src/Slot.java b/src/net/minecraft/src/Slot.java
new file mode 100644
index 0000000..0bc077b
--- /dev/null
+++ b/src/net/minecraft/src/Slot.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+public class Slot {
+ private final int slotIndex;
+ private final IInventory inventory;
+ public int id;
+ public int xDisplayPosition;
+ public int yDisplayPosition;
+
+ public Slot(IInventory var1, int var2, int var3, int var4) {
+ this.inventory = var1;
+ this.slotIndex = var2;
+ this.xDisplayPosition = var3;
+ this.yDisplayPosition = var4;
+ }
+
+ public void onPickupFromSlot(ItemStack var1) {
+ this.onSlotChanged();
+ }
+
+ public boolean isItemValid(ItemStack var1) {
+ return true;
+ }
+
+ public ItemStack getStack() {
+ return this.inventory.getStackInSlot(this.slotIndex);
+ }
+
+ public boolean func_27006_b() {
+ return this.getStack() != null;
+ }
+
+ public void putStack(ItemStack var1) {
+ this.inventory.setInventorySlotContents(this.slotIndex, var1);
+ this.onSlotChanged();
+ }
+
+ public void onSlotChanged() {
+ this.inventory.onInventoryChanged();
+ }
+
+ public int getSlotStackLimit() {
+ return this.inventory.getInventoryStackLimit();
+ }
+
+ public ItemStack decrStackSize(int var1) {
+ return this.inventory.decrStackSize(this.slotIndex, var1);
+ }
+
+ public boolean isHere(IInventory var1, int var2) {
+ return var1 == this.inventory && var2 == this.slotIndex;
+ }
+}
diff --git a/src/net/minecraft/src/SlotArmor.java b/src/net/minecraft/src/SlotArmor.java
new file mode 100644
index 0000000..09ff198
--- /dev/null
+++ b/src/net/minecraft/src/SlotArmor.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+class SlotArmor extends Slot {
+ final int field_20102_a;
+ final ContainerPlayer field_20101_b;
+
+ SlotArmor(ContainerPlayer var1, IInventory var2, int var3, int var4, int var5, int var6) {
+ super(var2, var3, var4, var5);
+ this.field_20101_b = var1;
+ this.field_20102_a = var6;
+ }
+
+ public int getSlotStackLimit() {
+ return 1;
+ }
+
+ public boolean isItemValid(ItemStack var1) {
+ return var1.getItem() instanceof ItemArmor ? ((ItemArmor)var1.getItem()).armorType == this.field_20102_a : (var1.getItem().shiftedIndex == Block.pumpkin.blockID ? this.field_20102_a == 0 : false);
+ }
+}
diff --git a/src/net/minecraft/src/SlotCrafting.java b/src/net/minecraft/src/SlotCrafting.java
new file mode 100644
index 0000000..9ca3646
--- /dev/null
+++ b/src/net/minecraft/src/SlotCrafting.java
@@ -0,0 +1,48 @@
+package net.minecraft.src;
+
+public class SlotCrafting extends Slot {
+ private final IInventory craftMatrix;
+ private EntityPlayer field_25004_e;
+
+ public SlotCrafting(EntityPlayer var1, IInventory var2, IInventory var3, int var4, int var5, int var6) {
+ super(var3, var4, var5, var6);
+ this.field_25004_e = var1;
+ this.craftMatrix = var2;
+ }
+
+ public boolean isItemValid(ItemStack var1) {
+ return false;
+ }
+
+ public void onPickupFromSlot(ItemStack var1) {
+ var1.func_28142_b(this.field_25004_e.worldObj, this.field_25004_e);
+ if(var1.itemID == Block.workbench.blockID) {
+ this.field_25004_e.addStat(AchievementList.field_25130_d, 1);
+ } else if(var1.itemID == Item.pickaxeWood.shiftedIndex) {
+ this.field_25004_e.addStat(AchievementList.field_27110_i, 1);
+ } else if(var1.itemID == Block.stoneOvenIdle.blockID) {
+ this.field_25004_e.addStat(AchievementList.field_27109_j, 1);
+ } else if(var1.itemID == Item.hoeWood.shiftedIndex) {
+ this.field_25004_e.addStat(AchievementList.field_27107_l, 1);
+ } else if(var1.itemID == Item.bread.shiftedIndex) {
+ this.field_25004_e.addStat(AchievementList.field_27106_m, 1);
+ } else if(var1.itemID == Item.cake.shiftedIndex) {
+ this.field_25004_e.addStat(AchievementList.field_27105_n, 1);
+ } else if(var1.itemID == Item.pickaxeStone.shiftedIndex) {
+ this.field_25004_e.addStat(AchievementList.field_27104_o, 1);
+ } else if(var1.itemID == Item.swordWood.shiftedIndex) {
+ this.field_25004_e.addStat(AchievementList.field_27101_r, 1);
+ }
+
+ for(int var2 = 0; var2 < this.craftMatrix.getSizeInventory(); ++var2) {
+ ItemStack var3 = this.craftMatrix.getStackInSlot(var2);
+ if(var3 != null) {
+ this.craftMatrix.decrStackSize(var2, 1);
+ if(var3.getItem().hasContainerItem()) {
+ this.craftMatrix.setInventorySlotContents(var2, new ItemStack(var3.getItem().getContainerItem()));
+ }
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/SlotFurnace.java b/src/net/minecraft/src/SlotFurnace.java
new file mode 100644
index 0000000..0220106
--- /dev/null
+++ b/src/net/minecraft/src/SlotFurnace.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+public class SlotFurnace extends Slot {
+ private EntityPlayer field_27007_d;
+
+ public SlotFurnace(EntityPlayer var1, IInventory var2, int var3, int var4, int var5) {
+ super(var2, var3, var4, var5);
+ this.field_27007_d = var1;
+ }
+
+ public boolean isItemValid(ItemStack var1) {
+ return false;
+ }
+
+ public void onPickupFromSlot(ItemStack var1) {
+ var1.func_28142_b(this.field_27007_d.worldObj, this.field_27007_d);
+ if(var1.itemID == Item.ingotIron.shiftedIndex) {
+ this.field_27007_d.addStat(AchievementList.field_27108_k, 1);
+ }
+
+ if(var1.itemID == Item.fishCooked.shiftedIndex) {
+ this.field_27007_d.addStat(AchievementList.field_27103_p, 1);
+ }
+
+ super.onPickupFromSlot(var1);
+ }
+}
diff --git a/src/net/minecraft/src/SpawnListEntry.java b/src/net/minecraft/src/SpawnListEntry.java
new file mode 100644
index 0000000..94c662f
--- /dev/null
+++ b/src/net/minecraft/src/SpawnListEntry.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public class SpawnListEntry {
+ public Class entityClass;
+ public int spawnRarityRate;
+
+ public SpawnListEntry(Class var1, int var2) {
+ this.entityClass = var1;
+ this.spawnRarityRate = var2;
+ }
+}
diff --git a/src/net/minecraft/src/SpawnerAnimals.java b/src/net/minecraft/src/SpawnerAnimals.java
new file mode 100644
index 0000000..6f21055
--- /dev/null
+++ b/src/net/minecraft/src/SpawnerAnimals.java
@@ -0,0 +1,248 @@
+package net.minecraft.src;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+public final class SpawnerAnimals {
+ private static Set eligibleChunksForSpawning = new HashSet();
+ protected static final Class[] field_22213_a = new Class[]{EntitySpider.class, EntityZombie.class, EntitySkeleton.class};
+
+ protected static ChunkPosition getRandomSpawningPointInChunk(World var0, int var1, int var2) {
+ int var3 = var1 + var0.rand.nextInt(16);
+ int var4 = var0.rand.nextInt(128);
+ int var5 = var2 + var0.rand.nextInt(16);
+ return new ChunkPosition(var3, var4, var5);
+ }
+
+ public static final int performSpawning(World var0, boolean var1, boolean var2) {
+ if(!var1 && !var2) {
+ return 0;
+ } else {
+ eligibleChunksForSpawning.clear();
+
+ int var3;
+ int var6;
+ for(var3 = 0; var3 < var0.playerEntities.size(); ++var3) {
+ EntityPlayer var4 = (EntityPlayer)var0.playerEntities.get(var3);
+ int var5 = MathHelper.floor_double(var4.posX / 16.0D);
+ var6 = MathHelper.floor_double(var4.posZ / 16.0D);
+ byte var7 = 8;
+
+ for(int var8 = -var7; var8 <= var7; ++var8) {
+ for(int var9 = -var7; var9 <= var7; ++var9) {
+ eligibleChunksForSpawning.add(new ChunkCoordIntPair(var8 + var5, var9 + var6));
+ }
+ }
+ }
+
+ var3 = 0;
+ ChunkCoordinates var35 = var0.getSpawnPoint();
+ EnumCreatureType[] var36 = EnumCreatureType.values();
+ var6 = var36.length;
+
+ label133:
+ for(int var37 = 0; var37 < var6; ++var37) {
+ EnumCreatureType var38 = var36[var37];
+ if((!var38.func_21103_d() || var2) && (var38.func_21103_d() || var1) && var0.countEntities(var38.getCreatureClass()) <= var38.getMaxNumberOfCreature() * eligibleChunksForSpawning.size() / 256) {
+ Iterator var39 = eligibleChunksForSpawning.iterator();
+
+ label130:
+ while(true) {
+ SpawnListEntry var15;
+ int var18;
+ int var19;
+ int var42;
+ do {
+ do {
+ ChunkCoordIntPair var10;
+ List var12;
+ do {
+ do {
+ if(!var39.hasNext()) {
+ continue label133;
+ }
+
+ var10 = (ChunkCoordIntPair)var39.next();
+ BiomeGenBase var11 = var0.getWorldChunkManager().func_4066_a(var10);
+ var12 = var11.getSpawnableList(var38);
+ } while(var12 == null);
+ } while(var12.isEmpty());
+
+ int var13 = 0;
+
+ for(Iterator var14 = var12.iterator(); var14.hasNext(); var13 += var15.spawnRarityRate) {
+ var15 = (SpawnListEntry)var14.next();
+ }
+
+ int var40 = var0.rand.nextInt(var13);
+ var15 = (SpawnListEntry)var12.get(0);
+ Iterator var16 = var12.iterator();
+
+ while(var16.hasNext()) {
+ SpawnListEntry var17 = (SpawnListEntry)var16.next();
+ var40 -= var17.spawnRarityRate;
+ if(var40 < 0) {
+ var15 = var17;
+ break;
+ }
+ }
+
+ ChunkPosition var41 = getRandomSpawningPointInChunk(var0, var10.chunkXPos * 16, var10.chunkZPos * 16);
+ var42 = var41.x;
+ var18 = var41.y;
+ var19 = var41.z;
+ } while(var0.isBlockNormalCube(var42, var18, var19));
+ } while(var0.getBlockMaterial(var42, var18, var19) != var38.getCreatureMaterial());
+
+ int var20 = 0;
+
+ for(int var21 = 0; var21 < 3; ++var21) {
+ int var22 = var42;
+ int var23 = var18;
+ int var24 = var19;
+ byte var25 = 6;
+
+ for(int var26 = 0; var26 < 4; ++var26) {
+ var22 += var0.rand.nextInt(var25) - var0.rand.nextInt(var25);
+ var23 += var0.rand.nextInt(1) - var0.rand.nextInt(1);
+ var24 += var0.rand.nextInt(var25) - var0.rand.nextInt(var25);
+ if(func_21167_a(var38, var0, var22, var23, var24)) {
+ float var27 = (float)var22 + 0.5F;
+ float var28 = (float)var23;
+ float var29 = (float)var24 + 0.5F;
+ if(var0.getClosestPlayer((double)var27, (double)var28, (double)var29, 24.0D) == null) {
+ float var30 = var27 - (float)var35.posX;
+ float var31 = var28 - (float)var35.posY;
+ float var32 = var29 - (float)var35.posZ;
+ float var33 = var30 * var30 + var31 * var31 + var32 * var32;
+ if(var33 >= 576.0F) {
+ EntityLiving var43;
+ try {
+ var43 = (EntityLiving)var15.entityClass.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var0});
+ } catch (Exception var34) {
+ var34.printStackTrace();
+ return var3;
+ }
+
+ var43.setLocationAndAngles((double)var27, (double)var28, (double)var29, var0.rand.nextFloat() * 360.0F, 0.0F);
+ if(var43.getCanSpawnHere()) {
+ ++var20;
+ var0.entityJoinedWorld(var43);
+ func_21166_a(var43, var0, var27, var28, var29);
+ if(var20 >= var43.getMaxSpawnedInChunk()) {
+ continue label130;
+ }
+ }
+
+ var3 += var20;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return var3;
+ }
+ }
+
+ private static boolean func_21167_a(EnumCreatureType var0, World var1, int var2, int var3, int var4) {
+ return var0.getCreatureMaterial() == Material.water ? var1.getBlockMaterial(var2, var3, var4).getIsLiquid() && !var1.isBlockNormalCube(var2, var3 + 1, var4) : var1.isBlockNormalCube(var2, var3 - 1, var4) && !var1.isBlockNormalCube(var2, var3, var4) && !var1.getBlockMaterial(var2, var3, var4).getIsLiquid() && !var1.isBlockNormalCube(var2, var3 + 1, var4);
+ }
+
+ private static void func_21166_a(EntityLiving var0, World var1, float var2, float var3, float var4) {
+ if(var0 instanceof EntitySpider && var1.rand.nextInt(100) == 0) {
+ EntitySkeleton var5 = new EntitySkeleton(var1);
+ var5.setLocationAndAngles((double)var2, (double)var3, (double)var4, var0.rotationYaw, 0.0F);
+ var1.entityJoinedWorld(var5);
+ var5.mountEntity(var0);
+ } else if(var0 instanceof EntitySheep) {
+ ((EntitySheep)var0).setFleeceColor(EntitySheep.func_21066_a(var1.rand));
+ }
+
+ }
+
+ public static boolean performSleepSpawning(World var0, List var1) {
+ boolean var2 = false;
+ Pathfinder var3 = new Pathfinder(var0);
+ Iterator var4 = var1.iterator();
+
+ while(true) {
+ EntityPlayer var5;
+ Class[] var6;
+ do {
+ do {
+ if(!var4.hasNext()) {
+ return var2;
+ }
+
+ var5 = (EntityPlayer)var4.next();
+ var6 = field_22213_a;
+ } while(var6 == null);
+ } while(var6.length == 0);
+
+ boolean var7 = false;
+
+ for(int var8 = 0; var8 < 20 && !var7; ++var8) {
+ int var9 = MathHelper.floor_double(var5.posX) + var0.rand.nextInt(32) - var0.rand.nextInt(32);
+ int var10 = MathHelper.floor_double(var5.posZ) + var0.rand.nextInt(32) - var0.rand.nextInt(32);
+ int var11 = MathHelper.floor_double(var5.posY) + var0.rand.nextInt(16) - var0.rand.nextInt(16);
+ if(var11 < 1) {
+ var11 = 1;
+ } else if(var11 > 128) {
+ var11 = 128;
+ }
+
+ int var12 = var0.rand.nextInt(var6.length);
+
+ int var13;
+ for(var13 = var11; var13 > 2 && !var0.isBlockNormalCube(var9, var13 - 1, var10); --var13) {
+ }
+
+ while(!func_21167_a(EnumCreatureType.monster, var0, var9, var13, var10) && var13 < var11 + 16 && var13 < 128) {
+ ++var13;
+ }
+
+ if(var13 < var11 + 16 && var13 < 128) {
+ float var14 = (float)var9 + 0.5F;
+ float var15 = (float)var13;
+ float var16 = (float)var10 + 0.5F;
+
+ EntityLiving var17;
+ try {
+ var17 = (EntityLiving)var6[var12].getConstructor(new Class[]{World.class}).newInstance(new Object[]{var0});
+ } catch (Exception var21) {
+ var21.printStackTrace();
+ return var2;
+ }
+
+ var17.setLocationAndAngles((double)var14, (double)var15, (double)var16, var0.rand.nextFloat() * 360.0F, 0.0F);
+ if(var17.getCanSpawnHere()) {
+ PathEntity var18 = var3.createEntityPathTo(var17, var5, 32.0F);
+ if(var18 != null && var18.pathLength > 1) {
+ PathPoint var19 = var18.func_22211_c();
+ if(Math.abs((double)var19.xCoord - var5.posX) < 1.5D && Math.abs((double)var19.zCoord - var5.posZ) < 1.5D && Math.abs((double)var19.yCoord - var5.posY) < 1.5D) {
+ ChunkCoordinates var20 = BlockBed.func_22021_g(var0, MathHelper.floor_double(var5.posX), MathHelper.floor_double(var5.posY), MathHelper.floor_double(var5.posZ), 1);
+ if(var20 == null) {
+ var20 = new ChunkCoordinates(var9, var13 + 1, var10);
+ }
+
+ var17.setLocationAndAngles((double)((float)var20.posX + 0.5F), (double)var20.posY, (double)((float)var20.posZ + 0.5F), 0.0F, 0.0F);
+ var0.entityJoinedWorld(var17);
+ func_21166_a(var17, var0, (float)var20.posX + 0.5F, (float)var20.posY, (float)var20.posZ + 0.5F);
+ var5.wakeUpPlayer(true, false, false);
+ var17.playLivingSound();
+ var2 = true;
+ var7 = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/net/minecraft/src/StatBase.java b/src/net/minecraft/src/StatBase.java
new file mode 100644
index 0000000..699b97f
--- /dev/null
+++ b/src/net/minecraft/src/StatBase.java
@@ -0,0 +1,49 @@
+package net.minecraft.src;
+
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.Locale;
+
+public class StatBase {
+ public final int statId;
+ public final String statName;
+ public boolean field_27058_g;
+ public String field_27057_h;
+ private final IStatType field_25065_a;
+ private static NumberFormat field_25066_b = NumberFormat.getIntegerInstance(Locale.US);
+ public static IStatType field_27056_i = new StatTypeSimple();
+ private static DecimalFormat field_25068_c = new DecimalFormat("########0.00");
+ public static IStatType field_27055_j = new StatTypeTime();
+ public static IStatType field_27054_k = new StatTypeDistance();
+
+ public StatBase(int var1, String var2, IStatType var3) {
+ this.field_27058_g = false;
+ this.statId = var1;
+ this.statName = var2;
+ this.field_25065_a = var3;
+ }
+
+ public StatBase(int var1, String var2) {
+ this(var1, var2, field_27056_i);
+ }
+
+ public StatBase func_27052_e() {
+ this.field_27058_g = true;
+ return this;
+ }
+
+ public StatBase func_27053_d() {
+ if(StatList.field_25104_C.containsKey(Integer.valueOf(this.statId))) {
+ throw new RuntimeException("Duplicate stat id: \"" + ((StatBase)StatList.field_25104_C.get(Integer.valueOf(this.statId))).statName + "\" and \"" + this.statName + "\" at id " + this.statId);
+ } else {
+ StatList.field_25123_a.add(this);
+ StatList.field_25104_C.put(Integer.valueOf(this.statId), this);
+ this.field_27057_h = AchievementMap.func_25132_a(this.statId);
+ return this;
+ }
+ }
+
+ public String toString() {
+ return this.statName;
+ }
+}
diff --git a/src/net/minecraft/src/StatBasic.java b/src/net/minecraft/src/StatBasic.java
new file mode 100644
index 0000000..043862b
--- /dev/null
+++ b/src/net/minecraft/src/StatBasic.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class StatBasic extends StatBase {
+ public StatBasic(int var1, String var2, IStatType var3) {
+ super(var1, var2, var3);
+ }
+
+ public StatBasic(int var1, String var2) {
+ super(var1, var2);
+ }
+
+ public StatBase func_27053_d() {
+ super.func_27053_d();
+ StatList.field_25122_b.add(this);
+ return this;
+ }
+}
diff --git a/src/net/minecraft/src/StatCollector.java b/src/net/minecraft/src/StatCollector.java
new file mode 100644
index 0000000..21d20a7
--- /dev/null
+++ b/src/net/minecraft/src/StatCollector.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class StatCollector {
+ private static StringTranslate localizedName = StringTranslate.getInstance();
+
+ public static String translateToLocal(String var0) {
+ return localizedName.translateKey(var0);
+ }
+
+ public static String translateToLocalFormatted(String var0, Object... var1) {
+ return localizedName.translateKeyFormat(var0, var1);
+ }
+}
diff --git a/src/net/minecraft/src/StatCrafting.java b/src/net/minecraft/src/StatCrafting.java
new file mode 100644
index 0000000..8b2f4f8
--- /dev/null
+++ b/src/net/minecraft/src/StatCrafting.java
@@ -0,0 +1,10 @@
+package net.minecraft.src;
+
+public class StatCrafting extends StatBase {
+ private final int field_27990_a;
+
+ public StatCrafting(int var1, String var2, int var3) {
+ super(var1, var2);
+ this.field_27990_a = var3;
+ }
+}
diff --git a/src/net/minecraft/src/StatList.java b/src/net/minecraft/src/StatList.java
new file mode 100644
index 0000000..cae94bb
--- /dev/null
+++ b/src/net/minecraft/src/StatList.java
@@ -0,0 +1,175 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class StatList {
+ protected static Map field_25104_C = new HashMap();
+ public static List field_25123_a = new ArrayList();
+ public static List field_25122_b = new ArrayList();
+ public static List field_25121_c = new ArrayList();
+ public static List field_25120_d = new ArrayList();
+ public static StatBase field_25119_e = (new StatBasic(1000, StatCollector.translateToLocal("stat.startGame"))).func_27052_e().func_27053_d();
+ public static StatBase field_25118_f = (new StatBasic(1001, StatCollector.translateToLocal("stat.createWorld"))).func_27052_e().func_27053_d();
+ public static StatBase field_25117_g = (new StatBasic(1002, StatCollector.translateToLocal("stat.loadWorld"))).func_27052_e().func_27053_d();
+ public static StatBase field_25116_h = (new StatBasic(1003, StatCollector.translateToLocal("stat.joinMultiplayer"))).func_27052_e().func_27053_d();
+ public static StatBase field_25115_i = (new StatBasic(1004, StatCollector.translateToLocal("stat.leaveGame"))).func_27052_e().func_27053_d();
+ public static StatBase field_25114_j = (new StatBasic(1100, StatCollector.translateToLocal("stat.playOneMinute"), StatBase.field_27055_j)).func_27052_e().func_27053_d();
+ public static StatBase field_25113_k = (new StatBasic(2000, StatCollector.translateToLocal("stat.walkOneCm"), StatBase.field_27054_k)).func_27052_e().func_27053_d();
+ public static StatBase field_25112_l = (new StatBasic(2001, StatCollector.translateToLocal("stat.swimOneCm"), StatBase.field_27054_k)).func_27052_e().func_27053_d();
+ public static StatBase field_25111_m = (new StatBasic(2002, StatCollector.translateToLocal("stat.fallOneCm"), StatBase.field_27054_k)).func_27052_e().func_27053_d();
+ public static StatBase field_25110_n = (new StatBasic(2003, StatCollector.translateToLocal("stat.climbOneCm"), StatBase.field_27054_k)).func_27052_e().func_27053_d();
+ public static StatBase field_25109_o = (new StatBasic(2004, StatCollector.translateToLocal("stat.flyOneCm"), StatBase.field_27054_k)).func_27052_e().func_27053_d();
+ public static StatBase field_25108_p = (new StatBasic(2005, StatCollector.translateToLocal("stat.diveOneCm"), StatBase.field_27054_k)).func_27052_e().func_27053_d();
+ public static StatBase field_27095_r = (new StatBasic(2006, StatCollector.translateToLocal("stat.minecartOneCm"), StatBase.field_27054_k)).func_27052_e().func_27053_d();
+ public static StatBase field_27094_s = (new StatBasic(2007, StatCollector.translateToLocal("stat.boatOneCm"), StatBase.field_27054_k)).func_27052_e().func_27053_d();
+ public static StatBase field_27093_t = (new StatBasic(2008, StatCollector.translateToLocal("stat.pigOneCm"), StatBase.field_27054_k)).func_27052_e().func_27053_d();
+ public static StatBase field_25106_q = (new StatBasic(2010, StatCollector.translateToLocal("stat.jump"))).func_27052_e().func_27053_d();
+ public static StatBase field_25103_r = (new StatBasic(2011, StatCollector.translateToLocal("stat.drop"))).func_27052_e().func_27053_d();
+ public static StatBase field_25102_s = (new StatBasic(2020, StatCollector.translateToLocal("stat.damageDealt"))).func_27053_d();
+ public static StatBase field_25100_t = (new StatBasic(2021, StatCollector.translateToLocal("stat.damageTaken"))).func_27053_d();
+ public static StatBase field_25098_u = (new StatBasic(2022, StatCollector.translateToLocal("stat.deaths"))).func_27053_d();
+ public static StatBase field_25097_v = (new StatBasic(2023, StatCollector.translateToLocal("stat.mobKills"))).func_27053_d();
+ public static StatBase field_25096_w = (new StatBasic(2024, StatCollector.translateToLocal("stat.playerKills"))).func_27053_d();
+ public static StatBase fishCaughtStat = (new StatBasic(2025, StatCollector.translateToLocal("stat.fishCaught"))).func_27053_d();
+ public static StatBase[] mineBlockStatArray = func_25089_a("stat.mineBlock", 16777216);
+ public static StatBase[] field_25093_z;
+ public static StatBase[] field_25107_A;
+ public static StatBase[] field_25105_B;
+ private static boolean field_25101_D;
+ private static boolean field_25099_E;
+
+ public static void func_27092_a() {
+ }
+
+ public static void func_25088_a() {
+ field_25107_A = func_25090_a(field_25107_A, "stat.useItem", 16908288, 0, Block.blocksList.length);
+ field_25105_B = func_25087_b(field_25105_B, "stat.breakItem", 16973824, 0, Block.blocksList.length);
+ field_25101_D = true;
+ func_25091_c();
+ }
+
+ public static void func_25086_b() {
+ field_25107_A = func_25090_a(field_25107_A, "stat.useItem", 16908288, Block.blocksList.length, 32000);
+ field_25105_B = func_25087_b(field_25105_B, "stat.breakItem", 16973824, Block.blocksList.length, 32000);
+ field_25099_E = true;
+ func_25091_c();
+ }
+
+ public static void func_25091_c() {
+ if(field_25101_D && field_25099_E) {
+ HashSet var0 = new HashSet();
+ Iterator var1 = CraftingManager.getInstance().getRecipeList().iterator();
+
+ while(var1.hasNext()) {
+ IRecipe var2 = (IRecipe)var1.next();
+ var0.add(Integer.valueOf(var2.func_25077_b().itemID));
+ }
+
+ var1 = FurnaceRecipes.smelting().getSmeltingList().values().iterator();
+
+ while(var1.hasNext()) {
+ ItemStack var4 = (ItemStack)var1.next();
+ var0.add(Integer.valueOf(var4.itemID));
+ }
+
+ field_25093_z = new StatBase[32000];
+ var1 = var0.iterator();
+
+ while(var1.hasNext()) {
+ Integer var5 = (Integer)var1.next();
+ if(Item.itemsList[var5.intValue()] != null) {
+ String var3 = StatCollector.translateToLocalFormatted("stat.craftItem", new Object[]{Item.itemsList[var5.intValue()].func_25006_i()});
+ field_25093_z[var5.intValue()] = (new StatCrafting(16842752 + var5.intValue(), var3, var5.intValue())).func_27053_d();
+ }
+ }
+
+ replaceAllSimilarBlocks(field_25093_z);
+ }
+ }
+
+ private static StatBase[] func_25089_a(String var0, int var1) {
+ StatBase[] var2 = new StatBase[256];
+
+ for(int var3 = 0; var3 < 256; ++var3) {
+ if(Block.blocksList[var3] != null && Block.blocksList[var3].getEnableStats()) {
+ String var4 = StatCollector.translateToLocalFormatted(var0, new Object[]{Block.blocksList[var3].getNameLocalizedForStats()});
+ var2[var3] = (new StatCrafting(var1 + var3, var4, var3)).func_27053_d();
+ field_25120_d.add((StatCrafting)var2[var3]);
+ }
+ }
+
+ replaceAllSimilarBlocks(var2);
+ return var2;
+ }
+
+ private static StatBase[] func_25090_a(StatBase[] var0, String var1, int var2, int var3, int var4) {
+ if(var0 == null) {
+ var0 = new StatBase[32000];
+ }
+
+ for(int var5 = var3; var5 < var4; ++var5) {
+ if(Item.itemsList[var5] != null) {
+ String var6 = StatCollector.translateToLocalFormatted(var1, new Object[]{Item.itemsList[var5].func_25006_i()});
+ var0[var5] = (new StatCrafting(var2 + var5, var6, var5)).func_27053_d();
+ if(var5 >= Block.blocksList.length) {
+ field_25121_c.add((StatCrafting)var0[var5]);
+ }
+ }
+ }
+
+ replaceAllSimilarBlocks(var0);
+ return var0;
+ }
+
+ private static StatBase[] func_25087_b(StatBase[] var0, String var1, int var2, int var3, int var4) {
+ if(var0 == null) {
+ var0 = new StatBase[32000];
+ }
+
+ for(int var5 = var3; var5 < var4; ++var5) {
+ if(Item.itemsList[var5] != null && Item.itemsList[var5].func_25005_e()) {
+ String var6 = StatCollector.translateToLocalFormatted(var1, new Object[]{Item.itemsList[var5].func_25006_i()});
+ var0[var5] = (new StatCrafting(var2 + var5, var6, var5)).func_27053_d();
+ }
+ }
+
+ replaceAllSimilarBlocks(var0);
+ return var0;
+ }
+
+ private static void replaceAllSimilarBlocks(StatBase[] var0) {
+ replaceSimilarBlocks(var0, Block.waterStill.blockID, Block.waterMoving.blockID);
+ replaceSimilarBlocks(var0, Block.lavaStill.blockID, Block.lavaStill.blockID);
+ replaceSimilarBlocks(var0, Block.pumpkinLantern.blockID, Block.pumpkin.blockID);
+ replaceSimilarBlocks(var0, Block.stoneOvenActive.blockID, Block.stoneOvenIdle.blockID);
+ replaceSimilarBlocks(var0, Block.oreRedstoneGlowing.blockID, Block.oreRedstone.blockID);
+ replaceSimilarBlocks(var0, Block.redstoneRepeaterActive.blockID, Block.redstoneRepeaterIdle.blockID);
+ replaceSimilarBlocks(var0, Block.torchRedstoneActive.blockID, Block.torchRedstoneIdle.blockID);
+ replaceSimilarBlocks(var0, Block.mushroomRed.blockID, Block.mushroomBrown.blockID);
+ replaceSimilarBlocks(var0, Block.stairDouble.blockID, Block.stairSingle.blockID);
+ replaceSimilarBlocks(var0, Block.grass.blockID, Block.dirt.blockID);
+ replaceSimilarBlocks(var0, Block.tilledField.blockID, Block.dirt.blockID);
+ }
+
+ private static void replaceSimilarBlocks(StatBase[] var0, int var1, int var2) {
+ if(var0[var1] != null && var0[var2] == null) {
+ var0[var2] = var0[var1];
+ } else {
+ field_25123_a.remove(var0[var1]);
+ field_25120_d.remove(var0[var1]);
+ field_25122_b.remove(var0[var1]);
+ var0[var1] = var0[var2];
+ }
+ }
+
+ static {
+ AchievementList.func_27097_a();
+ field_25101_D = false;
+ field_25099_E = false;
+ }
+}
diff --git a/src/net/minecraft/src/StatTypeDistance.java b/src/net/minecraft/src/StatTypeDistance.java
new file mode 100644
index 0000000..358662f
--- /dev/null
+++ b/src/net/minecraft/src/StatTypeDistance.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+final class StatTypeDistance implements IStatType {
+}
diff --git a/src/net/minecraft/src/StatTypeSimple.java b/src/net/minecraft/src/StatTypeSimple.java
new file mode 100644
index 0000000..af05cbe
--- /dev/null
+++ b/src/net/minecraft/src/StatTypeSimple.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+final class StatTypeSimple implements IStatType {
+}
diff --git a/src/net/minecraft/src/StatTypeTime.java b/src/net/minecraft/src/StatTypeTime.java
new file mode 100644
index 0000000..7d3c315
--- /dev/null
+++ b/src/net/minecraft/src/StatTypeTime.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+final class StatTypeTime implements IStatType {
+}
diff --git a/src/net/minecraft/src/StepSound.java b/src/net/minecraft/src/StepSound.java
new file mode 100644
index 0000000..b44aec4
--- /dev/null
+++ b/src/net/minecraft/src/StepSound.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+public class StepSound {
+ public final String field_1029_a;
+ public final float field_1028_b;
+ public final float field_1030_c;
+
+ public StepSound(String var1, float var2, float var3) {
+ this.field_1029_a = var1;
+ this.field_1028_b = var2;
+ this.field_1030_c = var3;
+ }
+
+ public float getVolume() {
+ return this.field_1028_b;
+ }
+
+ public float getPitch() {
+ return this.field_1030_c;
+ }
+
+ public String func_737_c() {
+ return "step." + this.field_1029_a;
+ }
+}
diff --git a/src/net/minecraft/src/StepSoundSand.java b/src/net/minecraft/src/StepSoundSand.java
new file mode 100644
index 0000000..0db0510
--- /dev/null
+++ b/src/net/minecraft/src/StepSoundSand.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+final class StepSoundSand extends StepSound {
+ StepSoundSand(String var1, float var2, float var3) {
+ super(var1, var2, var3);
+ }
+}
diff --git a/src/net/minecraft/src/StepSoundStone.java b/src/net/minecraft/src/StepSoundStone.java
new file mode 100644
index 0000000..6dbdf6c
--- /dev/null
+++ b/src/net/minecraft/src/StepSoundStone.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+final class StepSoundStone extends StepSound {
+ StepSoundStone(String var1, float var2, float var3) {
+ super(var1, var2, var3);
+ }
+}
diff --git a/src/net/minecraft/src/StringTranslate.java b/src/net/minecraft/src/StringTranslate.java
new file mode 100644
index 0000000..ca361c5
--- /dev/null
+++ b/src/net/minecraft/src/StringTranslate.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+import java.util.Properties;
+
+public class StringTranslate {
+ private static StringTranslate instance = new StringTranslate();
+ private Properties translateTable = new Properties();
+
+ private StringTranslate() {
+ try {
+ this.translateTable.load(StringTranslate.class.getResourceAsStream("/lang/en_US.lang"));
+ this.translateTable.load(StringTranslate.class.getResourceAsStream("/lang/stats_US.lang"));
+ } catch (IOException var2) {
+ var2.printStackTrace();
+ }
+
+ }
+
+ public static StringTranslate getInstance() {
+ return instance;
+ }
+
+ public String translateKey(String var1) {
+ return this.translateTable.getProperty(var1, var1);
+ }
+
+ public String translateKeyFormat(String var1, Object... var2) {
+ String var3 = this.translateTable.getProperty(var1, var1);
+ return String.format(var3, var2);
+ }
+}
diff --git a/src/net/minecraft/src/Teleporter.java b/src/net/minecraft/src/Teleporter.java
new file mode 100644
index 0000000..e69b3d3
--- /dev/null
+++ b/src/net/minecraft/src/Teleporter.java
@@ -0,0 +1,261 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class Teleporter {
+ private Random field_28117_a = new Random();
+
+ public void setExitLocation(World var1, Entity var2) {
+ if(!this.findExitLocation(var1, var2)) {
+ this.createExitLocation(var1, var2);
+ this.findExitLocation(var1, var2);
+ }
+ }
+
+ public boolean findExitLocation(World var1, Entity var2) {
+ short var3 = 128;
+ double var4 = -1.0D;
+ int var6 = 0;
+ int var7 = 0;
+ int var8 = 0;
+ int var9 = MathHelper.floor_double(var2.posX);
+ int var10 = MathHelper.floor_double(var2.posZ);
+
+ double var18;
+ for(int var11 = var9 - var3; var11 <= var9 + var3; ++var11) {
+ double var12 = (double)var11 + 0.5D - var2.posX;
+
+ for(int var14 = var10 - var3; var14 <= var10 + var3; ++var14) {
+ double var15 = (double)var14 + 0.5D - var2.posZ;
+
+ for(int var17 = 127; var17 >= 0; --var17) {
+ if(var1.getBlockId(var11, var17, var14) == Block.portal.blockID) {
+ while(var1.getBlockId(var11, var17 - 1, var14) == Block.portal.blockID) {
+ --var17;
+ }
+
+ var18 = (double)var17 + 0.5D - var2.posY;
+ double var20 = var12 * var12 + var18 * var18 + var15 * var15;
+ if(var4 < 0.0D || var20 < var4) {
+ var4 = var20;
+ var6 = var11;
+ var7 = var17;
+ var8 = var14;
+ }
+ }
+ }
+ }
+ }
+
+ if(var4 >= 0.0D) {
+ double var22 = (double)var6 + 0.5D;
+ double var16 = (double)var7 + 0.5D;
+ var18 = (double)var8 + 0.5D;
+ if(var1.getBlockId(var6 - 1, var7, var8) == Block.portal.blockID) {
+ var22 -= 0.5D;
+ }
+
+ if(var1.getBlockId(var6 + 1, var7, var8) == Block.portal.blockID) {
+ var22 += 0.5D;
+ }
+
+ if(var1.getBlockId(var6, var7, var8 - 1) == Block.portal.blockID) {
+ var18 -= 0.5D;
+ }
+
+ if(var1.getBlockId(var6, var7, var8 + 1) == Block.portal.blockID) {
+ var18 += 0.5D;
+ }
+
+ var2.setLocationAndAngles(var22, var16, var18, var2.rotationYaw, 0.0F);
+ var2.motionX = var2.motionY = var2.motionZ = 0.0D;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean createExitLocation(World var1, Entity var2) {
+ byte var3 = 16;
+ double var4 = -1.0D;
+ int var6 = MathHelper.floor_double(var2.posX);
+ int var7 = MathHelper.floor_double(var2.posY);
+ int var8 = MathHelper.floor_double(var2.posZ);
+ int var9 = var6;
+ int var10 = var7;
+ int var11 = var8;
+ int var12 = 0;
+ int var13 = this.field_28117_a.nextInt(4);
+
+ int var14;
+ double var15;
+ int var17;
+ double var18;
+ int var20;
+ int var21;
+ int var22;
+ int var23;
+ int var24;
+ int var25;
+ int var26;
+ int var27;
+ int var28;
+ double var32;
+ double var33;
+ for(var14 = var6 - var3; var14 <= var6 + var3; ++var14) {
+ var15 = (double)var14 + 0.5D - var2.posX;
+
+ for(var17 = var8 - var3; var17 <= var8 + var3; ++var17) {
+ var18 = (double)var17 + 0.5D - var2.posZ;
+
+ label293:
+ for(var20 = 127; var20 >= 0; --var20) {
+ if(var1.isAirBlock(var14, var20, var17)) {
+ while(var20 > 0 && var1.isAirBlock(var14, var20 - 1, var17)) {
+ --var20;
+ }
+
+ for(var21 = var13; var21 < var13 + 4; ++var21) {
+ var22 = var21 % 2;
+ var23 = 1 - var22;
+ if(var21 % 4 >= 2) {
+ var22 = -var22;
+ var23 = -var23;
+ }
+
+ for(var24 = 0; var24 < 3; ++var24) {
+ for(var25 = 0; var25 < 4; ++var25) {
+ for(var26 = -1; var26 < 4; ++var26) {
+ var27 = var14 + (var25 - 1) * var22 + var24 * var23;
+ var28 = var20 + var26;
+ int var29 = var17 + (var25 - 1) * var23 - var24 * var22;
+ if(var26 < 0 && !var1.getBlockMaterial(var27, var28, var29).isSolid() || var26 >= 0 && !var1.isAirBlock(var27, var28, var29)) {
+ continue label293;
+ }
+ }
+ }
+ }
+
+ var32 = (double)var20 + 0.5D - var2.posY;
+ var33 = var15 * var15 + var32 * var32 + var18 * var18;
+ if(var4 < 0.0D || var33 < var4) {
+ var4 = var33;
+ var9 = var14;
+ var10 = var20;
+ var11 = var17;
+ var12 = var21 % 4;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(var4 < 0.0D) {
+ for(var14 = var6 - var3; var14 <= var6 + var3; ++var14) {
+ var15 = (double)var14 + 0.5D - var2.posX;
+
+ for(var17 = var8 - var3; var17 <= var8 + var3; ++var17) {
+ var18 = (double)var17 + 0.5D - var2.posZ;
+
+ label231:
+ for(var20 = 127; var20 >= 0; --var20) {
+ if(var1.isAirBlock(var14, var20, var17)) {
+ while(var1.isAirBlock(var14, var20 - 1, var17)) {
+ --var20;
+ }
+
+ for(var21 = var13; var21 < var13 + 2; ++var21) {
+ var22 = var21 % 2;
+ var23 = 1 - var22;
+
+ for(var24 = 0; var24 < 4; ++var24) {
+ for(var25 = -1; var25 < 4; ++var25) {
+ var26 = var14 + (var24 - 1) * var22;
+ var27 = var20 + var25;
+ var28 = var17 + (var24 - 1) * var23;
+ if(var25 < 0 && !var1.getBlockMaterial(var26, var27, var28).isSolid() || var25 >= 0 && !var1.isAirBlock(var26, var27, var28)) {
+ continue label231;
+ }
+ }
+ }
+
+ var32 = (double)var20 + 0.5D - var2.posY;
+ var33 = var15 * var15 + var32 * var32 + var18 * var18;
+ if(var4 < 0.0D || var33 < var4) {
+ var4 = var33;
+ var9 = var14;
+ var10 = var20;
+ var11 = var17;
+ var12 = var21 % 2;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ int var30 = var9;
+ int var16 = var10;
+ var17 = var11;
+ int var31 = var12 % 2;
+ int var19 = 1 - var31;
+ if(var12 % 4 >= 2) {
+ var31 = -var31;
+ var19 = -var19;
+ }
+
+ boolean var34;
+ if(var4 < 0.0D) {
+ if(var10 < 70) {
+ var10 = 70;
+ }
+
+ if(var10 > 118) {
+ var10 = 118;
+ }
+
+ var16 = var10;
+
+ for(var20 = -1; var20 <= 1; ++var20) {
+ for(var21 = 1; var21 < 3; ++var21) {
+ for(var22 = -1; var22 < 3; ++var22) {
+ var23 = var30 + (var21 - 1) * var31 + var20 * var19;
+ var24 = var16 + var22;
+ var25 = var17 + (var21 - 1) * var19 - var20 * var31;
+ var34 = var22 < 0;
+ var1.setBlockWithNotify(var23, var24, var25, var34 ? Block.obsidian.blockID : 0);
+ }
+ }
+ }
+ }
+
+ for(var20 = 0; var20 < 4; ++var20) {
+ var1.editingBlocks = true;
+
+ for(var21 = 0; var21 < 4; ++var21) {
+ for(var22 = -1; var22 < 4; ++var22) {
+ var23 = var30 + (var21 - 1) * var31;
+ var24 = var16 + var22;
+ var25 = var17 + (var21 - 1) * var19;
+ var34 = var21 == 0 || var21 == 3 || var22 == -1 || var22 == 3;
+ var1.setBlockWithNotify(var23, var24, var25, var34 ? Block.obsidian.blockID : Block.portal.blockID);
+ }
+ }
+
+ var1.editingBlocks = false;
+
+ for(var21 = 0; var21 < 4; ++var21) {
+ for(var22 = -1; var22 < 4; ++var22) {
+ var23 = var30 + (var21 - 1) * var31;
+ var24 = var16 + var22;
+ var25 = var17 + (var21 - 1) * var19;
+ var1.notifyBlocksOfNeighborChange(var23, var24, var25, var1.getBlockId(var23, var24, var25));
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/ThreadCommandReader.java b/src/net/minecraft/src/ThreadCommandReader.java
new file mode 100644
index 0000000..2d58ef2
--- /dev/null
+++ b/src/net/minecraft/src/ThreadCommandReader.java
@@ -0,0 +1,33 @@
+package net.minecraft.src;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import net.minecraft.server.MinecraftServer;
+
+public class ThreadCommandReader extends Thread {
+ final MinecraftServer mcServer;
+
+ public ThreadCommandReader(MinecraftServer var1) {
+ this.mcServer = var1;
+ }
+
+ public void run() {
+ BufferedReader var1 = new BufferedReader(new InputStreamReader(System.in));
+ String var2 = null;
+
+ try {
+ while(!this.mcServer.serverStopped && MinecraftServer.isServerRunning(this.mcServer)) {
+ var2 = var1.readLine();
+ if(var2 == null) {
+ break;
+ }
+
+ this.mcServer.addCommand(var2, this.mcServer);
+ }
+ } catch (IOException var4) {
+ var4.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/ThreadLoginVerifier.java b/src/net/minecraft/src/ThreadLoginVerifier.java
new file mode 100644
index 0000000..e11ebeb
--- /dev/null
+++ b/src/net/minecraft/src/ThreadLoginVerifier.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLEncoder;
+
+class ThreadLoginVerifier extends Thread {
+ final Packet1Login loginPacket;
+ final NetLoginHandler loginHandler;
+
+ ThreadLoginVerifier(NetLoginHandler var1, Packet1Login var2) {
+ this.loginHandler = var1;
+ this.loginPacket = var2;
+ }
+
+ public void run() {
+ try {
+ String var1 = NetLoginHandler.getServerId(this.loginHandler);
+ URL var2 = new URL("http://www.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(this.loginPacket.username, "UTF-8") + "&serverId=" + URLEncoder.encode(var1, "UTF-8"));
+ BufferedReader var3 = new BufferedReader(new InputStreamReader(var2.openStream()));
+ String var4 = var3.readLine();
+ var3.close();
+ if(var4.equals("YES")) {
+ NetLoginHandler.setLoginPacket(this.loginHandler, this.loginPacket);
+ } else {
+ this.loginHandler.kickUser("Failed to verify username!");
+ }
+ } catch (Exception var5) {
+ this.loginHandler.kickUser("Failed to verify username! [internal error " + var5 + "]");
+ var5.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/ThreadMonitorConnection.java b/src/net/minecraft/src/ThreadMonitorConnection.java
new file mode 100644
index 0000000..769a274
--- /dev/null
+++ b/src/net/minecraft/src/ThreadMonitorConnection.java
@@ -0,0 +1,22 @@
+package net.minecraft.src;
+
+class ThreadMonitorConnection extends Thread {
+ final NetworkManager netManager;
+
+ ThreadMonitorConnection(NetworkManager var1) {
+ this.netManager = var1;
+ }
+
+ public void run() {
+ try {
+ Thread.sleep(2000L);
+ if(NetworkManager.isRunning(this.netManager)) {
+ NetworkManager.getWriteThread(this.netManager).interrupt();
+ this.netManager.networkShutdown("disconnect.closed", new Object[0]);
+ }
+ } catch (Exception var2) {
+ var2.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/ThreadServerApplication.java b/src/net/minecraft/src/ThreadServerApplication.java
new file mode 100644
index 0000000..70d4d9c
--- /dev/null
+++ b/src/net/minecraft/src/ThreadServerApplication.java
@@ -0,0 +1,16 @@
+package net.minecraft.src;
+
+import net.minecraft.server.MinecraftServer;
+
+public final class ThreadServerApplication extends Thread {
+ final MinecraftServer mcServer;
+
+ public ThreadServerApplication(String var1, MinecraftServer var2) {
+ super(var1);
+ this.mcServer = var2;
+ }
+
+ public void run() {
+ this.mcServer.run();
+ }
+}
diff --git a/src/net/minecraft/src/ThreadSleepForever.java b/src/net/minecraft/src/ThreadSleepForever.java
new file mode 100644
index 0000000..4c5b288
--- /dev/null
+++ b/src/net/minecraft/src/ThreadSleepForever.java
@@ -0,0 +1,22 @@
+package net.minecraft.src;
+
+import net.minecraft.server.MinecraftServer;
+
+public class ThreadSleepForever extends Thread {
+ final MinecraftServer mc;
+
+ public ThreadSleepForever(MinecraftServer var1) {
+ this.mc = var1;
+ this.setDaemon(true);
+ this.start();
+ }
+
+ public void run() {
+ while(true) {
+ try {
+ Thread.sleep(2147483647L);
+ } catch (InterruptedException var2) {
+ }
+ }
+ }
+}
diff --git a/src/net/minecraft/src/TileEntity.java b/src/net/minecraft/src/TileEntity.java
new file mode 100644
index 0000000..bb6625c
--- /dev/null
+++ b/src/net/minecraft/src/TileEntity.java
@@ -0,0 +1,103 @@
+package net.minecraft.src;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TileEntity {
+ private static Map nameToClassMap = new HashMap();
+ private static Map classToNameMap = new HashMap();
+ public World worldObj;
+ public int xCoord;
+ public int yCoord;
+ public int zCoord;
+ protected boolean tileEntityInvalid;
+
+ private static void addMapping(Class var0, String var1) {
+ if(classToNameMap.containsKey(var1)) {
+ throw new IllegalArgumentException("Duplicate id: " + var1);
+ } else {
+ nameToClassMap.put(var1, var0);
+ classToNameMap.put(var0, var1);
+ }
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ this.xCoord = var1.getInteger("x");
+ this.yCoord = var1.getInteger("y");
+ this.zCoord = var1.getInteger("z");
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ String var2 = (String)classToNameMap.get(this.getClass());
+ if(var2 == null) {
+ throw new RuntimeException(this.getClass() + " is missing a mapping! This is a bug!");
+ } else {
+ var1.setString("id", var2);
+ var1.setInteger("x", this.xCoord);
+ var1.setInteger("y", this.yCoord);
+ var1.setInteger("z", this.zCoord);
+ }
+ }
+
+ public void updateEntity() {
+ }
+
+ public static TileEntity createAndLoadEntity(NBTTagCompound var0) {
+ TileEntity var1 = null;
+
+ try {
+ Class var2 = (Class)nameToClassMap.get(var0.getString("id"));
+ if(var2 != null) {
+ var1 = (TileEntity)var2.newInstance();
+ }
+ } catch (Exception var3) {
+ var3.printStackTrace();
+ }
+
+ if(var1 != null) {
+ var1.readFromNBT(var0);
+ } else {
+ System.out.println("Skipping TileEntity with id " + var0.getString("id"));
+ }
+
+ return var1;
+ }
+
+ public int func_31005_e() {
+ return this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord);
+ }
+
+ public void onInventoryChanged() {
+ if(this.worldObj != null) {
+ this.worldObj.updateTileEntityChunkAndDoNothing(this.xCoord, this.yCoord, this.zCoord, this);
+ }
+
+ }
+
+ public Packet getDescriptionPacket() {
+ return null;
+ }
+
+ public boolean isInvalid() {
+ return this.tileEntityInvalid;
+ }
+
+ public void invalidate() {
+ this.tileEntityInvalid = true;
+ }
+
+ public void validate() {
+ this.tileEntityInvalid = false;
+ }
+
+ static {
+ addMapping(TileEntityFurnace.class, "Furnace");
+ addMapping(TileEntityChest.class, "Chest");
+ addMapping(TileEntityRecordPlayer.class, "RecordPlayer");
+ addMapping(TileEntityDispenser.class, "Trap");
+ addMapping(TileEntitySign.class, "Sign");
+ addMapping(TileEntityMobSpawner.class, "MobSpawner");
+ addMapping(TileEntityNote.class, "Music");
+ addMapping(TileEntityPiston.class, "Piston");
+ }
+}
diff --git a/src/net/minecraft/src/TileEntityChest.java b/src/net/minecraft/src/TileEntityChest.java
new file mode 100644
index 0000000..a3d16a5
--- /dev/null
+++ b/src/net/minecraft/src/TileEntityChest.java
@@ -0,0 +1,87 @@
+package net.minecraft.src;
+
+public class TileEntityChest extends TileEntity implements IInventory {
+ private ItemStack[] chestContents = new ItemStack[36];
+
+ public int getSizeInventory() {
+ return 27;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.chestContents[var1];
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.chestContents[var1] != null) {
+ ItemStack var3;
+ if(this.chestContents[var1].stackSize <= var2) {
+ var3 = this.chestContents[var1];
+ this.chestContents[var1] = null;
+ this.onInventoryChanged();
+ return var3;
+ } else {
+ var3 = this.chestContents[var1].splitStack(var2);
+ if(this.chestContents[var1].stackSize == 0) {
+ this.chestContents[var1] = null;
+ }
+
+ this.onInventoryChanged();
+ return var3;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.chestContents[var1] = var2;
+ if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) {
+ var2.stackSize = this.getInventoryStackLimit();
+ }
+
+ this.onInventoryChanged();
+ }
+
+ public String getInvName() {
+ return "Chest";
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ NBTTagList var2 = var1.getTagList("Items");
+ this.chestContents = new ItemStack[this.getSizeInventory()];
+
+ for(int var3 = 0; var3 < var2.tagCount(); ++var3) {
+ NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+ int var5 = var4.getByte("Slot") & 255;
+ if(var5 >= 0 && var5 < this.chestContents.length) {
+ this.chestContents[var5] = new ItemStack(var4);
+ }
+ }
+
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ NBTTagList var2 = new NBTTagList();
+
+ for(int var3 = 0; var3 < this.chestContents.length; ++var3) {
+ if(this.chestContents[var3] != null) {
+ NBTTagCompound var4 = new NBTTagCompound();
+ var4.setByte("Slot", (byte)var3);
+ this.chestContents[var3].writeToNBT(var4);
+ var2.setTag(var4);
+ }
+ }
+
+ var1.setTag("Items", var2);
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : var1.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
+ }
+}
diff --git a/src/net/minecraft/src/TileEntityDispenser.java b/src/net/minecraft/src/TileEntityDispenser.java
new file mode 100644
index 0000000..b2cba91
--- /dev/null
+++ b/src/net/minecraft/src/TileEntityDispenser.java
@@ -0,0 +1,107 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class TileEntityDispenser extends TileEntity implements IInventory {
+ private ItemStack[] dispenserContents = new ItemStack[9];
+ private Random dispenserRandom = new Random();
+
+ public int getSizeInventory() {
+ return 9;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.dispenserContents[var1];
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.dispenserContents[var1] != null) {
+ ItemStack var3;
+ if(this.dispenserContents[var1].stackSize <= var2) {
+ var3 = this.dispenserContents[var1];
+ this.dispenserContents[var1] = null;
+ this.onInventoryChanged();
+ return var3;
+ } else {
+ var3 = this.dispenserContents[var1].splitStack(var2);
+ if(this.dispenserContents[var1].stackSize == 0) {
+ this.dispenserContents[var1] = null;
+ }
+
+ this.onInventoryChanged();
+ return var3;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public ItemStack getRandomStackFromInventory() {
+ int var1 = -1;
+ int var2 = 1;
+
+ for(int var3 = 0; var3 < this.dispenserContents.length; ++var3) {
+ if(this.dispenserContents[var3] != null && this.dispenserRandom.nextInt(var2++) == 0) {
+ var1 = var3;
+ }
+ }
+
+ if(var1 >= 0) {
+ return this.decrStackSize(var1, 1);
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.dispenserContents[var1] = var2;
+ if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) {
+ var2.stackSize = this.getInventoryStackLimit();
+ }
+
+ this.onInventoryChanged();
+ }
+
+ public String getInvName() {
+ return "Trap";
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ NBTTagList var2 = var1.getTagList("Items");
+ this.dispenserContents = new ItemStack[this.getSizeInventory()];
+
+ for(int var3 = 0; var3 < var2.tagCount(); ++var3) {
+ NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+ int var5 = var4.getByte("Slot") & 255;
+ if(var5 >= 0 && var5 < this.dispenserContents.length) {
+ this.dispenserContents[var5] = new ItemStack(var4);
+ }
+ }
+
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ NBTTagList var2 = new NBTTagList();
+
+ for(int var3 = 0; var3 < this.dispenserContents.length; ++var3) {
+ if(this.dispenserContents[var3] != null) {
+ NBTTagCompound var4 = new NBTTagCompound();
+ var4.setByte("Slot", (byte)var3);
+ this.dispenserContents[var3].writeToNBT(var4);
+ var2.setTag(var4);
+ }
+ }
+
+ var1.setTag("Items", var2);
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : var1.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
+ }
+}
diff --git a/src/net/minecraft/src/TileEntityFurnace.java b/src/net/minecraft/src/TileEntityFurnace.java
new file mode 100644
index 0000000..916bd04
--- /dev/null
+++ b/src/net/minecraft/src/TileEntityFurnace.java
@@ -0,0 +1,175 @@
+package net.minecraft.src;
+
+public class TileEntityFurnace extends TileEntity implements IInventory {
+ private ItemStack[] furnaceItemStacks = new ItemStack[3];
+ public int furnaceBurnTime = 0;
+ public int currentItemBurnTime = 0;
+ public int furnaceCookTime = 0;
+
+ public int getSizeInventory() {
+ return this.furnaceItemStacks.length;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.furnaceItemStacks[var1];
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.furnaceItemStacks[var1] != null) {
+ ItemStack var3;
+ if(this.furnaceItemStacks[var1].stackSize <= var2) {
+ var3 = this.furnaceItemStacks[var1];
+ this.furnaceItemStacks[var1] = null;
+ return var3;
+ } else {
+ var3 = this.furnaceItemStacks[var1].splitStack(var2);
+ if(this.furnaceItemStacks[var1].stackSize == 0) {
+ this.furnaceItemStacks[var1] = null;
+ }
+
+ return var3;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.furnaceItemStacks[var1] = var2;
+ if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) {
+ var2.stackSize = this.getInventoryStackLimit();
+ }
+
+ }
+
+ public String getInvName() {
+ return "Furnace";
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ NBTTagList var2 = var1.getTagList("Items");
+ this.furnaceItemStacks = new ItemStack[this.getSizeInventory()];
+
+ for(int var3 = 0; var3 < var2.tagCount(); ++var3) {
+ NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+ byte var5 = var4.getByte("Slot");
+ if(var5 >= 0 && var5 < this.furnaceItemStacks.length) {
+ this.furnaceItemStacks[var5] = new ItemStack(var4);
+ }
+ }
+
+ this.furnaceBurnTime = var1.getShort("BurnTime");
+ this.furnaceCookTime = var1.getShort("CookTime");
+ this.currentItemBurnTime = this.getItemBurnTime(this.furnaceItemStacks[1]);
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ var1.setShort("BurnTime", (short)this.furnaceBurnTime);
+ var1.setShort("CookTime", (short)this.furnaceCookTime);
+ NBTTagList var2 = new NBTTagList();
+
+ for(int var3 = 0; var3 < this.furnaceItemStacks.length; ++var3) {
+ if(this.furnaceItemStacks[var3] != null) {
+ NBTTagCompound var4 = new NBTTagCompound();
+ var4.setByte("Slot", (byte)var3);
+ this.furnaceItemStacks[var3].writeToNBT(var4);
+ var2.setTag(var4);
+ }
+ }
+
+ var1.setTag("Items", var2);
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public boolean isBurning() {
+ return this.furnaceBurnTime > 0;
+ }
+
+ public void updateEntity() {
+ boolean var1 = this.furnaceBurnTime > 0;
+ boolean var2 = false;
+ if(this.furnaceBurnTime > 0) {
+ --this.furnaceBurnTime;
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ if(this.furnaceBurnTime == 0 && this.canSmelt()) {
+ this.currentItemBurnTime = this.furnaceBurnTime = this.getItemBurnTime(this.furnaceItemStacks[1]);
+ if(this.furnaceBurnTime > 0) {
+ var2 = true;
+ if(this.furnaceItemStacks[1] != null) {
+ --this.furnaceItemStacks[1].stackSize;
+ if(this.furnaceItemStacks[1].stackSize == 0) {
+ this.furnaceItemStacks[1] = null;
+ }
+ }
+ }
+ }
+
+ if(this.isBurning() && this.canSmelt()) {
+ ++this.furnaceCookTime;
+ if(this.furnaceCookTime == 200) {
+ this.furnaceCookTime = 0;
+ this.smeltItem();
+ var2 = true;
+ }
+ } else {
+ this.furnaceCookTime = 0;
+ }
+
+ if(var1 != this.furnaceBurnTime > 0) {
+ var2 = true;
+ BlockFurnace.updateFurnaceBlockState(this.furnaceBurnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord);
+ }
+ }
+
+ if(var2) {
+ this.onInventoryChanged();
+ }
+
+ }
+
+ private boolean canSmelt() {
+ if(this.furnaceItemStacks[0] == null) {
+ return false;
+ } else {
+ ItemStack var1 = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0].getItem().shiftedIndex);
+ return var1 == null ? false : (this.furnaceItemStacks[2] == null ? true : (!this.furnaceItemStacks[2].isItemEqual(var1) ? false : (this.furnaceItemStacks[2].stackSize < this.getInventoryStackLimit() && this.furnaceItemStacks[2].stackSize < this.furnaceItemStacks[2].getMaxStackSize() ? true : this.furnaceItemStacks[2].stackSize < var1.getMaxStackSize())));
+ }
+ }
+
+ public void smeltItem() {
+ if(this.canSmelt()) {
+ ItemStack var1 = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0].getItem().shiftedIndex);
+ if(this.furnaceItemStacks[2] == null) {
+ this.furnaceItemStacks[2] = var1.copy();
+ } else if(this.furnaceItemStacks[2].itemID == var1.itemID) {
+ ++this.furnaceItemStacks[2].stackSize;
+ }
+
+ --this.furnaceItemStacks[0].stackSize;
+ if(this.furnaceItemStacks[0].stackSize <= 0) {
+ this.furnaceItemStacks[0] = null;
+ }
+
+ }
+ }
+
+ private int getItemBurnTime(ItemStack var1) {
+ if(var1 == null) {
+ return 0;
+ } else {
+ int var2 = var1.getItem().shiftedIndex;
+ return var2 < 256 && Block.blocksList[var2].blockMaterial == Material.wood ? 300 : (var2 == Item.stick.shiftedIndex ? 100 : (var2 == Item.coal.shiftedIndex ? 1600 : (var2 == Item.bucketLava.shiftedIndex ? 20000 : (var2 == Block.sapling.blockID ? 100 : 0))));
+ }
+ }
+
+ public boolean canInteractWith(EntityPlayer var1) {
+ return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : var1.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
+ }
+}
diff --git a/src/net/minecraft/src/TileEntityMobSpawner.java b/src/net/minecraft/src/TileEntityMobSpawner.java
new file mode 100644
index 0000000..b7af306
--- /dev/null
+++ b/src/net/minecraft/src/TileEntityMobSpawner.java
@@ -0,0 +1,100 @@
+package net.minecraft.src;
+
+public class TileEntityMobSpawner extends TileEntity {
+ public int delay = -1;
+ private String mobID = "Pig";
+ public double yaw;
+ public double yaw2 = 0.0D;
+
+ public TileEntityMobSpawner() {
+ this.delay = 20;
+ }
+
+ public void setMobID(String var1) {
+ this.mobID = var1;
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D, 16.0D) != null;
+ }
+
+ public void updateEntity() {
+ this.yaw2 = this.yaw;
+ if(this.anyPlayerInRange()) {
+ double var1 = (double)((float)this.xCoord + this.worldObj.rand.nextFloat());
+ double var3 = (double)((float)this.yCoord + this.worldObj.rand.nextFloat());
+ double var5 = (double)((float)this.zCoord + this.worldObj.rand.nextFloat());
+ this.worldObj.spawnParticle("smoke", var1, var3, var5, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle("flame", var1, var3, var5, 0.0D, 0.0D, 0.0D);
+
+ for(this.yaw += (double)(1000.0F / ((float)this.delay + 200.0F)); this.yaw > 360.0D; this.yaw2 -= 360.0D) {
+ this.yaw -= 360.0D;
+ }
+
+ if(!this.worldObj.singleplayerWorld) {
+ if(this.delay == -1) {
+ this.updateDelay();
+ }
+
+ if(this.delay > 0) {
+ --this.delay;
+ return;
+ }
+
+ byte var7 = 4;
+
+ for(int var8 = 0; var8 < var7; ++var8) {
+ EntityLiving var9 = (EntityLiving)((EntityLiving)EntityList.createEntityInWorld(this.mobID, this.worldObj));
+ if(var9 == null) {
+ return;
+ }
+
+ int var10 = this.worldObj.getEntitiesWithinAABB(var9.getClass(), AxisAlignedBB.getBoundingBoxFromPool((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 1), (double)(this.zCoord + 1)).expand(8.0D, 4.0D, 8.0D)).size();
+ if(var10 >= 6) {
+ this.updateDelay();
+ return;
+ }
+
+ if(var9 != null) {
+ double var11 = (double)this.xCoord + (this.worldObj.rand.nextDouble() - this.worldObj.rand.nextDouble()) * 4.0D;
+ double var13 = (double)(this.yCoord + this.worldObj.rand.nextInt(3) - 1);
+ double var15 = (double)this.zCoord + (this.worldObj.rand.nextDouble() - this.worldObj.rand.nextDouble()) * 4.0D;
+ var9.setLocationAndAngles(var11, var13, var15, this.worldObj.rand.nextFloat() * 360.0F, 0.0F);
+ if(var9.getCanSpawnHere()) {
+ this.worldObj.entityJoinedWorld(var9);
+
+ for(int var17 = 0; var17 < 20; ++var17) {
+ var1 = (double)this.xCoord + 0.5D + ((double)this.worldObj.rand.nextFloat() - 0.5D) * 2.0D;
+ var3 = (double)this.yCoord + 0.5D + ((double)this.worldObj.rand.nextFloat() - 0.5D) * 2.0D;
+ var5 = (double)this.zCoord + 0.5D + ((double)this.worldObj.rand.nextFloat() - 0.5D) * 2.0D;
+ this.worldObj.spawnParticle("smoke", var1, var3, var5, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle("flame", var1, var3, var5, 0.0D, 0.0D, 0.0D);
+ }
+
+ var9.spawnExplosionParticle();
+ this.updateDelay();
+ }
+ }
+ }
+ }
+
+ super.updateEntity();
+ }
+ }
+
+ private void updateDelay() {
+ this.delay = 200 + this.worldObj.rand.nextInt(600);
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ this.mobID = var1.getString("EntityId");
+ this.delay = var1.getShort("Delay");
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ var1.setString("EntityId", this.mobID);
+ var1.setShort("Delay", (short)this.delay);
+ }
+}
diff --git a/src/net/minecraft/src/TileEntityNote.java b/src/net/minecraft/src/TileEntityNote.java
new file mode 100644
index 0000000..d284604
--- /dev/null
+++ b/src/net/minecraft/src/TileEntityNote.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+public class TileEntityNote extends TileEntity {
+ public byte note = 0;
+ public boolean previousRedstoneState = false;
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ var1.setByte("note", this.note);
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ this.note = var1.getByte("note");
+ if(this.note < 0) {
+ this.note = 0;
+ }
+
+ if(this.note > 24) {
+ this.note = 24;
+ }
+
+ }
+
+ public void changePitch() {
+ this.note = (byte)((this.note + 1) % 25);
+ this.onInventoryChanged();
+ }
+
+ public void triggerNote(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockMaterial(var2, var3 + 1, var4) == Material.air) {
+ Material var5 = var1.getBlockMaterial(var2, var3 - 1, var4);
+ byte var6 = 0;
+ if(var5 == Material.rock) {
+ var6 = 1;
+ }
+
+ if(var5 == Material.sand) {
+ var6 = 2;
+ }
+
+ if(var5 == Material.glass) {
+ var6 = 3;
+ }
+
+ if(var5 == Material.wood) {
+ var6 = 4;
+ }
+
+ var1.playNoteAt(var2, var3, var4, var6, this.note);
+ }
+ }
+}
diff --git a/src/net/minecraft/src/TileEntityPiston.java b/src/net/minecraft/src/TileEntityPiston.java
new file mode 100644
index 0000000..456ca19
--- /dev/null
+++ b/src/net/minecraft/src/TileEntityPiston.java
@@ -0,0 +1,129 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class TileEntityPiston extends TileEntity {
+ private int storedBlockID;
+ private int storedMetadata;
+ private int storedOrientation;
+ private boolean isExtending;
+ private boolean field_31018_j;
+ private float progress;
+ private float lastProgress;
+ private static List field_31013_m = new ArrayList();
+
+ public TileEntityPiston() {
+ }
+
+ public TileEntityPiston(int var1, int var2, int var3, boolean var4, boolean var5) {
+ this.storedBlockID = var1;
+ this.storedMetadata = var2;
+ this.storedOrientation = var3;
+ this.isExtending = var4;
+ this.field_31018_j = var5;
+ }
+
+ public int getStoredBlockID() {
+ return this.storedBlockID;
+ }
+
+ public int func_31005_e() {
+ return this.storedMetadata;
+ }
+
+ public boolean func_31010_c() {
+ return this.isExtending;
+ }
+
+ public int func_31008_d() {
+ return this.storedOrientation;
+ }
+
+ public float func_31007_a(float var1) {
+ if(var1 > 1.0F) {
+ var1 = 1.0F;
+ }
+
+ return this.lastProgress + (this.progress - this.lastProgress) * var1;
+ }
+
+ private void func_31009_a(float var1, float var2) {
+ if(!this.isExtending) {
+ --var1;
+ } else {
+ var1 = 1.0F - var1;
+ }
+
+ AxisAlignedBB var3 = Block.pistonMoving.func_31032_a(this.worldObj, this.xCoord, this.yCoord, this.zCoord, this.storedBlockID, var1, this.storedOrientation);
+ if(var3 != null) {
+ List var4 = this.worldObj.getEntitiesWithinAABBExcludingEntity((Entity)null, var3);
+ if(!var4.isEmpty()) {
+ field_31013_m.addAll(var4);
+ Iterator var5 = field_31013_m.iterator();
+
+ while(var5.hasNext()) {
+ Entity var6 = (Entity)var5.next();
+ var6.moveEntity((double)(var2 * (float)PistonBlockTextures.field_31051_b[this.storedOrientation]), (double)(var2 * (float)PistonBlockTextures.field_31054_c[this.storedOrientation]), (double)(var2 * (float)PistonBlockTextures.field_31053_d[this.storedOrientation]));
+ }
+
+ field_31013_m.clear();
+ }
+ }
+
+ }
+
+ public void clearPistonTileEntity() {
+ if(this.lastProgress < 1.0F) {
+ this.lastProgress = this.progress = 1.0F;
+ this.worldObj.removeBlockTileEntity(this.xCoord, this.yCoord, this.zCoord);
+ this.invalidate();
+ if(this.worldObj.getBlockId(this.xCoord, this.yCoord, this.zCoord) == Block.pistonMoving.blockID) {
+ this.worldObj.setBlockAndMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, this.storedBlockID, this.storedMetadata);
+ }
+ }
+
+ }
+
+ public void updateEntity() {
+ this.lastProgress = this.progress;
+ if(this.lastProgress >= 1.0F) {
+ this.func_31009_a(1.0F, 0.25F);
+ this.worldObj.removeBlockTileEntity(this.xCoord, this.yCoord, this.zCoord);
+ this.invalidate();
+ if(this.worldObj.getBlockId(this.xCoord, this.yCoord, this.zCoord) == Block.pistonMoving.blockID) {
+ this.worldObj.setBlockAndMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, this.storedBlockID, this.storedMetadata);
+ }
+
+ } else {
+ this.progress += 0.5F;
+ if(this.progress >= 1.0F) {
+ this.progress = 1.0F;
+ }
+
+ if(this.isExtending) {
+ this.func_31009_a(this.progress, this.progress - this.lastProgress + 1.0F / 16.0F);
+ }
+
+ }
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ this.storedBlockID = var1.getInteger("blockId");
+ this.storedMetadata = var1.getInteger("blockData");
+ this.storedOrientation = var1.getInteger("facing");
+ this.lastProgress = this.progress = var1.getFloat("progress");
+ this.isExtending = var1.getBoolean("extending");
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ var1.setInteger("blockId", this.storedBlockID);
+ var1.setInteger("blockData", this.storedMetadata);
+ var1.setInteger("facing", this.storedOrientation);
+ var1.setFloat("progress", this.lastProgress);
+ var1.setBoolean("extending", this.isExtending);
+ }
+}
diff --git a/src/net/minecraft/src/TileEntityRecordPlayer.java b/src/net/minecraft/src/TileEntityRecordPlayer.java
new file mode 100644
index 0000000..ea3da06
--- /dev/null
+++ b/src/net/minecraft/src/TileEntityRecordPlayer.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+public class TileEntityRecordPlayer extends TileEntity {
+ public int field_28009_a;
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ this.field_28009_a = var1.getInteger("Record");
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ if(this.field_28009_a > 0) {
+ var1.setInteger("Record", this.field_28009_a);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/TileEntitySign.java b/src/net/minecraft/src/TileEntitySign.java
new file mode 100644
index 0000000..dd5385b
--- /dev/null
+++ b/src/net/minecraft/src/TileEntitySign.java
@@ -0,0 +1,46 @@
+package net.minecraft.src;
+
+public class TileEntitySign extends TileEntity {
+ public String[] signText = new String[]{"", "", "", ""};
+ public int lineBeingEdited = -1;
+ private boolean isEditAble = true;
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ var1.setString("Text1", this.signText[0]);
+ var1.setString("Text2", this.signText[1]);
+ var1.setString("Text3", this.signText[2]);
+ var1.setString("Text4", this.signText[3]);
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ this.isEditAble = false;
+ super.readFromNBT(var1);
+
+ for(int var2 = 0; var2 < 4; ++var2) {
+ this.signText[var2] = var1.getString("Text" + (var2 + 1));
+ if(this.signText[var2].length() > 15) {
+ this.signText[var2] = this.signText[var2].substring(0, 15);
+ }
+ }
+
+ }
+
+ public Packet getDescriptionPacket() {
+ String[] var1 = new String[4];
+
+ for(int var2 = 0; var2 < 4; ++var2) {
+ var1[var2] = this.signText[var2];
+ }
+
+ return new Packet130UpdateSign(this.xCoord, this.yCoord, this.zCoord, var1);
+ }
+
+ public boolean getIsEditAble() {
+ return this.isEditAble;
+ }
+
+ public void func_32001_a(boolean var1) {
+ this.isEditAble = var1;
+ }
+}
diff --git a/src/net/minecraft/src/Vec3D.java b/src/net/minecraft/src/Vec3D.java
new file mode 100644
index 0000000..8ded9a0
--- /dev/null
+++ b/src/net/minecraft/src/Vec3D.java
@@ -0,0 +1,127 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Vec3D {
+ private static List vectorList = new ArrayList();
+ private static int nextVector = 0;
+ public double xCoord;
+ public double yCoord;
+ public double zCoord;
+
+ public static Vec3D createVectorHelper(double var0, double var2, double var4) {
+ return new Vec3D(var0, var2, var4);
+ }
+
+ public static void initialize() {
+ nextVector = 0;
+ }
+
+ public static Vec3D createVector(double var0, double var2, double var4) {
+ if(nextVector >= vectorList.size()) {
+ vectorList.add(createVectorHelper(0.0D, 0.0D, 0.0D));
+ }
+
+ return ((Vec3D)vectorList.get(nextVector++)).setComponents(var0, var2, var4);
+ }
+
+ private Vec3D(double var1, double var3, double var5) {
+ if(var1 == -0.0D) {
+ var1 = 0.0D;
+ }
+
+ if(var3 == -0.0D) {
+ var3 = 0.0D;
+ }
+
+ if(var5 == -0.0D) {
+ var5 = 0.0D;
+ }
+
+ this.xCoord = var1;
+ this.yCoord = var3;
+ this.zCoord = var5;
+ }
+
+ private Vec3D setComponents(double var1, double var3, double var5) {
+ this.xCoord = var1;
+ this.yCoord = var3;
+ this.zCoord = var5;
+ return this;
+ }
+
+ public Vec3D normalize() {
+ double var1 = (double)MathHelper.sqrt_double(this.xCoord * this.xCoord + this.yCoord * this.yCoord + this.zCoord * this.zCoord);
+ return var1 < 1.0E-4D ? createVector(0.0D, 0.0D, 0.0D) : createVector(this.xCoord / var1, this.yCoord / var1, this.zCoord / var1);
+ }
+
+ public Vec3D addVector(double var1, double var3, double var5) {
+ return createVector(this.xCoord + var1, this.yCoord + var3, this.zCoord + var5);
+ }
+
+ public double distanceTo(Vec3D var1) {
+ double var2 = var1.xCoord - this.xCoord;
+ double var4 = var1.yCoord - this.yCoord;
+ double var6 = var1.zCoord - this.zCoord;
+ return (double)MathHelper.sqrt_double(var2 * var2 + var4 * var4 + var6 * var6);
+ }
+
+ public double squareDistanceTo(Vec3D var1) {
+ double var2 = var1.xCoord - this.xCoord;
+ double var4 = var1.yCoord - this.yCoord;
+ double var6 = var1.zCoord - this.zCoord;
+ return var2 * var2 + var4 * var4 + var6 * var6;
+ }
+
+ public double squareDistanceTo(double var1, double var3, double var5) {
+ double var7 = var1 - this.xCoord;
+ double var9 = var3 - this.yCoord;
+ double var11 = var5 - this.zCoord;
+ return var7 * var7 + var9 * var9 + var11 * var11;
+ }
+
+ public double lengthVector() {
+ return (double)MathHelper.sqrt_double(this.xCoord * this.xCoord + this.yCoord * this.yCoord + this.zCoord * this.zCoord);
+ }
+
+ public Vec3D getIntermediateWithXValue(Vec3D var1, double var2) {
+ double var4 = var1.xCoord - this.xCoord;
+ double var6 = var1.yCoord - this.yCoord;
+ double var8 = var1.zCoord - this.zCoord;
+ if(var4 * var4 < (double)1.0E-7F) {
+ return null;
+ } else {
+ double var10 = (var2 - this.xCoord) / var4;
+ return var10 >= 0.0D && var10 <= 1.0D ? createVector(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null;
+ }
+ }
+
+ public Vec3D getIntermediateWithYValue(Vec3D var1, double var2) {
+ double var4 = var1.xCoord - this.xCoord;
+ double var6 = var1.yCoord - this.yCoord;
+ double var8 = var1.zCoord - this.zCoord;
+ if(var6 * var6 < (double)1.0E-7F) {
+ return null;
+ } else {
+ double var10 = (var2 - this.yCoord) / var6;
+ return var10 >= 0.0D && var10 <= 1.0D ? createVector(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null;
+ }
+ }
+
+ public Vec3D getIntermediateWithZValue(Vec3D var1, double var2) {
+ double var4 = var1.xCoord - this.xCoord;
+ double var6 = var1.yCoord - this.yCoord;
+ double var8 = var1.zCoord - this.zCoord;
+ if(var8 * var8 < (double)1.0E-7F) {
+ return null;
+ } else {
+ double var10 = (var2 - this.zCoord) / var8;
+ return var10 >= 0.0D && var10 <= 1.0D ? createVector(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null;
+ }
+ }
+
+ public String toString() {
+ return "(" + this.xCoord + ", " + this.yCoord + ", " + this.zCoord + ")";
+ }
+}
diff --git a/src/net/minecraft/src/WatchableObject.java b/src/net/minecraft/src/WatchableObject.java
new file mode 100644
index 0000000..ae1ca87
--- /dev/null
+++ b/src/net/minecraft/src/WatchableObject.java
@@ -0,0 +1,39 @@
+package net.minecraft.src;
+
+public class WatchableObject {
+ private final int objectType;
+ private final int dataValueId;
+ private Object watchedObject;
+ private boolean isWatching;
+
+ public WatchableObject(int var1, int var2, Object var3) {
+ this.dataValueId = var2;
+ this.watchedObject = var3;
+ this.objectType = var1;
+ this.isWatching = true;
+ }
+
+ public int getDataValueId() {
+ return this.dataValueId;
+ }
+
+ public void setObject(Object var1) {
+ this.watchedObject = var1;
+ }
+
+ public Object getObject() {
+ return this.watchedObject;
+ }
+
+ public int getObjectType() {
+ return this.objectType;
+ }
+
+ public boolean getWatching() {
+ return this.isWatching;
+ }
+
+ public void setWatching(boolean var1) {
+ this.isWatching = var1;
+ }
+}
diff --git a/src/net/minecraft/src/World.java b/src/net/minecraft/src/World.java
new file mode 100644
index 0000000..ebd4d57
--- /dev/null
+++ b/src/net/minecraft/src/World.java
@@ -0,0 +1,2118 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.TreeSet;
+
+public class World implements IBlockAccess {
+ public boolean scheduledUpdatesAreImmediate = false;
+ private List field_821_y = new ArrayList();
+ public List loadedEntityList = new ArrayList();
+ private List unloadedEntityList = new ArrayList();
+ private TreeSet scheduledTickTreeSet = new TreeSet();
+ private Set scheduledTickSet = new HashSet();
+ public List loadedTileEntityList = new ArrayList();
+ private List field_20912_E = new ArrayList();
+ public List playerEntities = new ArrayList();
+ public List lightningEntities = new ArrayList();
+ private long field_6159_E = 16777215L;
+ public int skylightSubtracted = 0;
+ protected int distHashCounter = (new Random()).nextInt();
+ protected final int DIST_HASH_MAGIC = 1013904223;
+ protected float field_27079_B;
+ protected float field_27078_C;
+ protected float field_27077_D;
+ protected float field_27076_E;
+ protected int field_27075_F = 0;
+ public int field_27080_i = 0;
+ public boolean editingBlocks = false;
+ private long lockTimestamp = System.currentTimeMillis();
+ protected int autosavePeriod = 40;
+ public int difficultySetting;
+ public Random rand = new Random();
+ public boolean isNewWorld = false;
+ public final WorldProvider worldProvider;
+ protected List worldAccesses = new ArrayList();
+ protected IChunkProvider chunkProvider;
+ protected final ISaveHandler worldFile;
+ protected WorldInfo worldInfo;
+ public boolean worldChunkLoadOverride;
+ private boolean allPlayersSleeping;
+ public MapStorage field_28105_z;
+ private ArrayList field_9207_I = new ArrayList();
+ private boolean field_31048_L;
+ private int field_4265_J = 0;
+ private boolean spawnHostileMobs = true;
+ private boolean spawnPeacefulMobs = true;
+ static int field_4268_y = 0;
+ private Set activeChunkSet = new HashSet();
+ private int ambientTickCountdown = this.rand.nextInt(12000);
+ private List field_778_L = new ArrayList();
+ public boolean singleplayerWorld = false;
+
+ public WorldChunkManager getWorldChunkManager() {
+ return this.worldProvider.worldChunkMgr;
+ }
+
+ public World(ISaveHandler var1, String var2, long var3, WorldProvider var5) {
+ this.worldFile = var1;
+ this.field_28105_z = new MapStorage(var1);
+ this.worldInfo = var1.func_22096_c();
+ this.isNewWorld = this.worldInfo == null;
+ if(var5 != null) {
+ this.worldProvider = var5;
+ } else if(this.worldInfo != null && this.worldInfo.getDimension() == -1) {
+ this.worldProvider = WorldProvider.func_4091_a(-1);
+ } else {
+ this.worldProvider = WorldProvider.func_4091_a(0);
+ }
+
+ boolean var6 = false;
+ if(this.worldInfo == null) {
+ this.worldInfo = new WorldInfo(var3, var2);
+ var6 = true;
+ } else {
+ this.worldInfo.setLevelName(var2);
+ }
+
+ this.worldProvider.registerWorld(this);
+ this.chunkProvider = this.getChunkProvider();
+ if(var6) {
+ this.generateSpawnPoint();
+ }
+
+ this.calculateInitialSkylight();
+ this.func_27070_x();
+ }
+
+ protected IChunkProvider getChunkProvider() {
+ IChunkLoader var1 = this.worldFile.func_22092_a(this.worldProvider);
+ return new ChunkProvider(this, var1, this.worldProvider.getChunkProvider());
+ }
+
+ protected void generateSpawnPoint() {
+ this.worldChunkLoadOverride = true;
+ int var1 = 0;
+ byte var2 = 64;
+
+ int var3;
+ for(var3 = 0; !this.worldProvider.canCoordinateBeSpawn(var1, var3); var3 += this.rand.nextInt(64) - this.rand.nextInt(64)) {
+ var1 += this.rand.nextInt(64) - this.rand.nextInt(64);
+ }
+
+ this.worldInfo.setSpawnPosition(var1, var2, var3);
+ this.worldChunkLoadOverride = false;
+ }
+
+ public int getFirstUncoveredBlock(int var1, int var2) {
+ int var3;
+ for(var3 = 63; !this.isAirBlock(var1, var3 + 1, var2); ++var3) {
+ }
+
+ return this.getBlockId(var1, var3, var2);
+ }
+
+ public void saveWorld(boolean var1, IProgressUpdate var2) {
+ if(this.chunkProvider.func_364_b()) {
+ if(var2 != null) {
+ var2.func_438_a("Saving level");
+ }
+
+ this.saveLevel();
+ if(var2 != null) {
+ var2.displayLoadingString("Saving chunks");
+ }
+
+ this.chunkProvider.saveChunks(var1, var2);
+ }
+ }
+
+ private void saveLevel() {
+ this.checkSessionLock();
+ this.worldFile.func_22095_a(this.worldInfo, this.playerEntities);
+ this.field_28105_z.func_28176_a();
+ }
+
+ public int getBlockId(int var1, int var2, int var3) {
+ return var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000 ? (var2 < 0 ? 0 : (var2 >= 128 ? 0 : this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4).getBlockID(var1 & 15, var2, var3 & 15))) : 0;
+ }
+
+ public boolean isAirBlock(int var1, int var2, int var3) {
+ return this.getBlockId(var1, var2, var3) == 0;
+ }
+
+ public boolean blockExists(int var1, int var2, int var3) {
+ return var2 >= 0 && var2 < 128 ? this.chunkExists(var1 >> 4, var3 >> 4) : false;
+ }
+
+ public boolean doChunksNearChunkExist(int var1, int var2, int var3, int var4) {
+ return this.checkChunksExist(var1 - var4, var2 - var4, var3 - var4, var1 + var4, var2 + var4, var3 + var4);
+ }
+
+ public boolean checkChunksExist(int var1, int var2, int var3, int var4, int var5, int var6) {
+ if(var5 >= 0 && var2 < 128) {
+ var1 >>= 4;
+ var2 >>= 4;
+ var3 >>= 4;
+ var4 >>= 4;
+ var5 >>= 4;
+ var6 >>= 4;
+
+ for(int var7 = var1; var7 <= var4; ++var7) {
+ for(int var8 = var3; var8 <= var6; ++var8) {
+ if(!this.chunkExists(var7, var8)) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private boolean chunkExists(int var1, int var2) {
+ return this.chunkProvider.chunkExists(var1, var2);
+ }
+
+ public Chunk getChunkFromBlockCoords(int var1, int var2) {
+ return this.getChunkFromChunkCoords(var1 >> 4, var2 >> 4);
+ }
+
+ public Chunk getChunkFromChunkCoords(int var1, int var2) {
+ return this.chunkProvider.provideChunk(var1, var2);
+ }
+
+ public boolean setBlockAndMetadata(int var1, int var2, int var3, int var4, int var5) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return false;
+ } else if(var2 >= 128) {
+ return false;
+ } else {
+ Chunk var6 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ return var6.setBlockIDWithMetadata(var1 & 15, var2, var3 & 15, var4, var5);
+ }
+ } else {
+ return false;
+ }
+ }
+
+ public boolean setBlock(int var1, int var2, int var3, int var4) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return false;
+ } else if(var2 >= 128) {
+ return false;
+ } else {
+ Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ return var5.setBlockID(var1 & 15, var2, var3 & 15, var4);
+ }
+ } else {
+ return false;
+ }
+ }
+
+ public Material getBlockMaterial(int var1, int var2, int var3) {
+ int var4 = this.getBlockId(var1, var2, var3);
+ return var4 == 0 ? Material.air : Block.blocksList[var4].blockMaterial;
+ }
+
+ public int getBlockMetadata(int var1, int var2, int var3) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return 0;
+ } else if(var2 >= 128) {
+ return 0;
+ } else {
+ Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ var1 &= 15;
+ var3 &= 15;
+ return var4.getBlockMetadata(var1, var2, var3);
+ }
+ } else {
+ return 0;
+ }
+ }
+
+ public void setBlockMetadataWithNotify(int var1, int var2, int var3, int var4) {
+ if(this.setBlockMetadata(var1, var2, var3, var4)) {
+ int var5 = this.getBlockId(var1, var2, var3);
+ if(Block.requiresSelfNotify[var5 & 255]) {
+ this.notifyBlockChange(var1, var2, var3, var5);
+ } else {
+ this.notifyBlocksOfNeighborChange(var1, var2, var3, var5);
+ }
+ }
+
+ }
+
+ public boolean setBlockMetadata(int var1, int var2, int var3, int var4) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return false;
+ } else if(var2 >= 128) {
+ return false;
+ } else {
+ Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ var1 &= 15;
+ var3 &= 15;
+ var5.setBlockMetadata(var1, var2, var3, var4);
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ public boolean setBlockWithNotify(int var1, int var2, int var3, int var4) {
+ if(this.setBlock(var1, var2, var3, var4)) {
+ this.notifyBlockChange(var1, var2, var3, var4);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean setBlockAndMetadataWithNotify(int var1, int var2, int var3, int var4, int var5) {
+ if(this.setBlockAndMetadata(var1, var2, var3, var4, var5)) {
+ this.notifyBlockChange(var1, var2, var3, var4);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void markBlockNeedsUpdate(int var1, int var2, int var3) {
+ for(int var4 = 0; var4 < this.worldAccesses.size(); ++var4) {
+ ((IWorldAccess)this.worldAccesses.get(var4)).markBlockNeedsUpdate(var1, var2, var3);
+ }
+
+ }
+
+ protected void notifyBlockChange(int var1, int var2, int var3, int var4) {
+ this.markBlockNeedsUpdate(var1, var2, var3);
+ this.notifyBlocksOfNeighborChange(var1, var2, var3, var4);
+ }
+
+ public void markBlocksDirtyVertical(int var1, int var2, int var3, int var4) {
+ if(var3 > var4) {
+ int var5 = var4;
+ var4 = var3;
+ var3 = var5;
+ }
+
+ this.markBlocksDirty(var1, var3, var2, var1, var4, var2);
+ }
+
+ public void markBlockAsNeedsUpdate(int var1, int var2, int var3) {
+ for(int var4 = 0; var4 < this.worldAccesses.size(); ++var4) {
+ ((IWorldAccess)this.worldAccesses.get(var4)).markBlockRangeNeedsUpdate(var1, var2, var3, var1, var2, var3);
+ }
+
+ }
+
+ public void markBlocksDirty(int var1, int var2, int var3, int var4, int var5, int var6) {
+ for(int var7 = 0; var7 < this.worldAccesses.size(); ++var7) {
+ ((IWorldAccess)this.worldAccesses.get(var7)).markBlockRangeNeedsUpdate(var1, var2, var3, var4, var5, var6);
+ }
+
+ }
+
+ public void notifyBlocksOfNeighborChange(int var1, int var2, int var3, int var4) {
+ this.notifyBlockOfNeighborChange(var1 - 1, var2, var3, var4);
+ this.notifyBlockOfNeighborChange(var1 + 1, var2, var3, var4);
+ this.notifyBlockOfNeighborChange(var1, var2 - 1, var3, var4);
+ this.notifyBlockOfNeighborChange(var1, var2 + 1, var3, var4);
+ this.notifyBlockOfNeighborChange(var1, var2, var3 - 1, var4);
+ this.notifyBlockOfNeighborChange(var1, var2, var3 + 1, var4);
+ }
+
+ private void notifyBlockOfNeighborChange(int var1, int var2, int var3, int var4) {
+ if(!this.editingBlocks && !this.singleplayerWorld) {
+ Block var5 = Block.blocksList[this.getBlockId(var1, var2, var3)];
+ if(var5 != null) {
+ var5.onNeighborBlockChange(this, var1, var2, var3, var4);
+ }
+
+ }
+ }
+
+ public boolean canBlockSeeTheSky(int var1, int var2, int var3) {
+ return this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4).canBlockSeeTheSky(var1 & 15, var2, var3 & 15);
+ }
+
+ public int getBlockLightValueNoChecks(int var1, int var2, int var3) {
+ if(var2 < 0) {
+ return 0;
+ } else {
+ if(var2 >= 128) {
+ var2 = 127;
+ }
+
+ return this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4).getBlockLightValue(var1 & 15, var2, var3 & 15, 0);
+ }
+ }
+
+ public int getBlockLightValue(int var1, int var2, int var3) {
+ return this.getBlockLightValue_do(var1, var2, var3, true);
+ }
+
+ public int getBlockLightValue_do(int var1, int var2, int var3, boolean var4) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var4) {
+ int var5 = this.getBlockId(var1, var2, var3);
+ if(var5 == Block.stairSingle.blockID || var5 == Block.tilledField.blockID || var5 == Block.stairCompactCobblestone.blockID || var5 == Block.stairCompactPlanks.blockID) {
+ int var6 = this.getBlockLightValue_do(var1, var2 + 1, var3, false);
+ int var7 = this.getBlockLightValue_do(var1 + 1, var2, var3, false);
+ int var8 = this.getBlockLightValue_do(var1 - 1, var2, var3, false);
+ int var9 = this.getBlockLightValue_do(var1, var2, var3 + 1, false);
+ int var10 = this.getBlockLightValue_do(var1, var2, var3 - 1, false);
+ if(var7 > var6) {
+ var6 = var7;
+ }
+
+ if(var8 > var6) {
+ var6 = var8;
+ }
+
+ if(var9 > var6) {
+ var6 = var9;
+ }
+
+ if(var10 > var6) {
+ var6 = var10;
+ }
+
+ return var6;
+ }
+ }
+
+ if(var2 < 0) {
+ return 0;
+ } else {
+ if(var2 >= 128) {
+ var2 = 127;
+ }
+
+ Chunk var11 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ var1 &= 15;
+ var3 &= 15;
+ return var11.getBlockLightValue(var1, var2, var3, this.skylightSubtracted);
+ }
+ } else {
+ return 15;
+ }
+ }
+
+ public boolean canExistingBlockSeeTheSky(int var1, int var2, int var3) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return false;
+ } else if(var2 >= 128) {
+ return true;
+ } else if(!this.chunkExists(var1 >> 4, var3 >> 4)) {
+ return false;
+ } else {
+ Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ var1 &= 15;
+ var3 &= 15;
+ return var4.canBlockSeeTheSky(var1, var2, var3);
+ }
+ } else {
+ return false;
+ }
+ }
+
+ public int getHeightValue(int var1, int var2) {
+ if(var1 >= -32000000 && var2 >= -32000000 && var1 < 32000000 && var2 <= 32000000) {
+ if(!this.chunkExists(var1 >> 4, var2 >> 4)) {
+ return 0;
+ } else {
+ Chunk var3 = this.getChunkFromChunkCoords(var1 >> 4, var2 >> 4);
+ return var3.getHeightValue(var1 & 15, var2 & 15);
+ }
+ } else {
+ return 0;
+ }
+ }
+
+ public void neighborLightPropagationChanged(EnumSkyBlock var1, int var2, int var3, int var4, int var5) {
+ if(!this.worldProvider.field_4306_c || var1 != EnumSkyBlock.Sky) {
+ if(this.blockExists(var2, var3, var4)) {
+ if(var1 == EnumSkyBlock.Sky) {
+ if(this.canExistingBlockSeeTheSky(var2, var3, var4)) {
+ var5 = 15;
+ }
+ } else if(var1 == EnumSkyBlock.Block) {
+ int var6 = this.getBlockId(var2, var3, var4);
+ if(Block.lightValue[var6] > var5) {
+ var5 = Block.lightValue[var6];
+ }
+ }
+
+ if(this.getSavedLightValue(var1, var2, var3, var4) != var5) {
+ this.scheduleLightingUpdate(var1, var2, var3, var4, var2, var3, var4);
+ }
+
+ }
+ }
+ }
+
+ public int getSavedLightValue(EnumSkyBlock var1, int var2, int var3, int var4) {
+ if(var3 < 0) {
+ var3 = 0;
+ }
+
+ if(var3 >= 128) {
+ var3 = 127;
+ }
+
+ if(var3 >= 0 && var3 < 128 && var2 >= -32000000 && var4 >= -32000000 && var2 < 32000000 && var4 <= 32000000) {
+ int var5 = var2 >> 4;
+ int var6 = var4 >> 4;
+ if(!this.chunkExists(var5, var6)) {
+ return 0;
+ } else {
+ Chunk var7 = this.getChunkFromChunkCoords(var5, var6);
+ return var7.getSavedLightValue(var1, var2 & 15, var3, var4 & 15);
+ }
+ } else {
+ return var1.field_984_c;
+ }
+ }
+
+ public void setLightValue(EnumSkyBlock var1, int var2, int var3, int var4, int var5) {
+ if(var2 >= -32000000 && var4 >= -32000000 && var2 < 32000000 && var4 <= 32000000) {
+ if(var3 >= 0) {
+ if(var3 < 128) {
+ if(this.chunkExists(var2 >> 4, var4 >> 4)) {
+ Chunk var6 = this.getChunkFromChunkCoords(var2 >> 4, var4 >> 4);
+ var6.setLightValue(var1, var2 & 15, var3, var4 & 15, var5);
+
+ for(int var7 = 0; var7 < this.worldAccesses.size(); ++var7) {
+ ((IWorldAccess)this.worldAccesses.get(var7)).markBlockNeedsUpdate(var2, var3, var4);
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+ public float getLightBrightness(int var1, int var2, int var3) {
+ return this.worldProvider.lightBrightnessTable[this.getBlockLightValue(var1, var2, var3)];
+ }
+
+ public boolean isDaytime() {
+ return this.skylightSubtracted < 4;
+ }
+
+ public MovingObjectPosition rayTraceBlocks(Vec3D var1, Vec3D var2) {
+ return this.func_28099_a(var1, var2, false, false);
+ }
+
+ public MovingObjectPosition rayTraceBlocks_do(Vec3D var1, Vec3D var2, boolean var3) {
+ return this.func_28099_a(var1, var2, var3, false);
+ }
+
+ public MovingObjectPosition func_28099_a(Vec3D var1, Vec3D var2, boolean var3, boolean var4) {
+ if(!Double.isNaN(var1.xCoord) && !Double.isNaN(var1.yCoord) && !Double.isNaN(var1.zCoord)) {
+ if(!Double.isNaN(var2.xCoord) && !Double.isNaN(var2.yCoord) && !Double.isNaN(var2.zCoord)) {
+ int var5 = MathHelper.floor_double(var2.xCoord);
+ int var6 = MathHelper.floor_double(var2.yCoord);
+ int var7 = MathHelper.floor_double(var2.zCoord);
+ int var8 = MathHelper.floor_double(var1.xCoord);
+ int var9 = MathHelper.floor_double(var1.yCoord);
+ int var10 = MathHelper.floor_double(var1.zCoord);
+ int var11 = this.getBlockId(var8, var9, var10);
+ int var12 = this.getBlockMetadata(var8, var9, var10);
+ Block var13 = Block.blocksList[var11];
+ if((!var4 || var13 == null || var13.getCollisionBoundingBoxFromPool(this, var8, var9, var10) != null) && var11 > 0 && var13.canCollideCheck(var12, var3)) {
+ MovingObjectPosition var14 = var13.collisionRayTrace(this, var8, var9, var10, var1, var2);
+ if(var14 != null) {
+ return var14;
+ }
+ }
+
+ var11 = 200;
+
+ while(var11-- >= 0) {
+ if(Double.isNaN(var1.xCoord) || Double.isNaN(var1.yCoord) || Double.isNaN(var1.zCoord)) {
+ return null;
+ }
+
+ if(var8 == var5 && var9 == var6 && var10 == var7) {
+ return null;
+ }
+
+ boolean var39 = true;
+ boolean var40 = true;
+ boolean var41 = true;
+ double var15 = 999.0D;
+ double var17 = 999.0D;
+ double var19 = 999.0D;
+ if(var5 > var8) {
+ var15 = (double)var8 + 1.0D;
+ } else if(var5 < var8) {
+ var15 = (double)var8 + 0.0D;
+ } else {
+ var39 = false;
+ }
+
+ if(var6 > var9) {
+ var17 = (double)var9 + 1.0D;
+ } else if(var6 < var9) {
+ var17 = (double)var9 + 0.0D;
+ } else {
+ var40 = false;
+ }
+
+ if(var7 > var10) {
+ var19 = (double)var10 + 1.0D;
+ } else if(var7 < var10) {
+ var19 = (double)var10 + 0.0D;
+ } else {
+ var41 = false;
+ }
+
+ double var21 = 999.0D;
+ double var23 = 999.0D;
+ double var25 = 999.0D;
+ double var27 = var2.xCoord - var1.xCoord;
+ double var29 = var2.yCoord - var1.yCoord;
+ double var31 = var2.zCoord - var1.zCoord;
+ if(var39) {
+ var21 = (var15 - var1.xCoord) / var27;
+ }
+
+ if(var40) {
+ var23 = (var17 - var1.yCoord) / var29;
+ }
+
+ if(var41) {
+ var25 = (var19 - var1.zCoord) / var31;
+ }
+
+ boolean var33 = false;
+ byte var42;
+ if(var21 < var23 && var21 < var25) {
+ if(var5 > var8) {
+ var42 = 4;
+ } else {
+ var42 = 5;
+ }
+
+ var1.xCoord = var15;
+ var1.yCoord += var29 * var21;
+ var1.zCoord += var31 * var21;
+ } else if(var23 < var25) {
+ if(var6 > var9) {
+ var42 = 0;
+ } else {
+ var42 = 1;
+ }
+
+ var1.xCoord += var27 * var23;
+ var1.yCoord = var17;
+ var1.zCoord += var31 * var23;
+ } else {
+ if(var7 > var10) {
+ var42 = 2;
+ } else {
+ var42 = 3;
+ }
+
+ var1.xCoord += var27 * var25;
+ var1.yCoord += var29 * var25;
+ var1.zCoord = var19;
+ }
+
+ Vec3D var34 = Vec3D.createVector(var1.xCoord, var1.yCoord, var1.zCoord);
+ var8 = (int)(var34.xCoord = (double)MathHelper.floor_double(var1.xCoord));
+ if(var42 == 5) {
+ --var8;
+ ++var34.xCoord;
+ }
+
+ var9 = (int)(var34.yCoord = (double)MathHelper.floor_double(var1.yCoord));
+ if(var42 == 1) {
+ --var9;
+ ++var34.yCoord;
+ }
+
+ var10 = (int)(var34.zCoord = (double)MathHelper.floor_double(var1.zCoord));
+ if(var42 == 3) {
+ --var10;
+ ++var34.zCoord;
+ }
+
+ int var35 = this.getBlockId(var8, var9, var10);
+ int var36 = this.getBlockMetadata(var8, var9, var10);
+ Block var37 = Block.blocksList[var35];
+ if((!var4 || var37 == null || var37.getCollisionBoundingBoxFromPool(this, var8, var9, var10) != null) && var35 > 0 && var37.canCollideCheck(var36, var3)) {
+ MovingObjectPosition var38 = var37.collisionRayTrace(this, var8, var9, var10, var1, var2);
+ if(var38 != null) {
+ return var38;
+ }
+ }
+ }
+
+ return null;
+ } else {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void playSoundAtEntity(Entity var1, String var2, float var3, float var4) {
+ for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) {
+ ((IWorldAccess)this.worldAccesses.get(var5)).playSound(var2, var1.posX, var1.posY - (double)var1.yOffset, var1.posZ, var3, var4);
+ }
+
+ }
+
+ public void playSoundEffect(double var1, double var3, double var5, String var7, float var8, float var9) {
+ for(int var10 = 0; var10 < this.worldAccesses.size(); ++var10) {
+ ((IWorldAccess)this.worldAccesses.get(var10)).playSound(var7, var1, var3, var5, var8, var9);
+ }
+
+ }
+
+ public void playRecord(String var1, int var2, int var3, int var4) {
+ for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) {
+ ((IWorldAccess)this.worldAccesses.get(var5)).playRecord(var1, var2, var3, var4);
+ }
+
+ }
+
+ public void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ for(int var14 = 0; var14 < this.worldAccesses.size(); ++var14) {
+ ((IWorldAccess)this.worldAccesses.get(var14)).spawnParticle(var1, var2, var4, var6, var8, var10, var12);
+ }
+
+ }
+
+ public boolean addLightningBolt(Entity var1) {
+ this.lightningEntities.add(var1);
+ return true;
+ }
+
+ public boolean entityJoinedWorld(Entity var1) {
+ int var2 = MathHelper.floor_double(var1.posX / 16.0D);
+ int var3 = MathHelper.floor_double(var1.posZ / 16.0D);
+ boolean var4 = false;
+ if(var1 instanceof EntityPlayer) {
+ var4 = true;
+ }
+
+ if(!var4 && !this.chunkExists(var2, var3)) {
+ return false;
+ } else {
+ if(var1 instanceof EntityPlayer) {
+ EntityPlayer var5 = (EntityPlayer)var1;
+ this.playerEntities.add(var5);
+ this.updateAllPlayersSleepingFlag();
+ }
+
+ this.getChunkFromChunkCoords(var2, var3).addEntity(var1);
+ this.loadedEntityList.add(var1);
+ this.obtainEntitySkin(var1);
+ return true;
+ }
+ }
+
+ protected void obtainEntitySkin(Entity var1) {
+ for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) {
+ ((IWorldAccess)this.worldAccesses.get(var2)).obtainEntitySkin(var1);
+ }
+
+ }
+
+ protected void releaseEntitySkin(Entity var1) {
+ for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) {
+ ((IWorldAccess)this.worldAccesses.get(var2)).releaseEntitySkin(var1);
+ }
+
+ }
+
+ public void removePlayerForLogoff(Entity var1) {
+ if(var1.riddenByEntity != null) {
+ var1.riddenByEntity.mountEntity((Entity)null);
+ }
+
+ if(var1.ridingEntity != null) {
+ var1.mountEntity((Entity)null);
+ }
+
+ var1.setEntityDead();
+ if(var1 instanceof EntityPlayer) {
+ this.playerEntities.remove((EntityPlayer)var1);
+ this.updateAllPlayersSleepingFlag();
+ }
+
+ }
+
+ public void removePlayer(Entity var1) {
+ var1.setEntityDead();
+ if(var1 instanceof EntityPlayer) {
+ this.playerEntities.remove((EntityPlayer)var1);
+ this.updateAllPlayersSleepingFlag();
+ }
+
+ int var2 = var1.chunkCoordX;
+ int var3 = var1.chunkCoordZ;
+ if(var1.addedToChunk && this.chunkExists(var2, var3)) {
+ this.getChunkFromChunkCoords(var2, var3).removeEntity(var1);
+ }
+
+ this.loadedEntityList.remove(var1);
+ this.releaseEntitySkin(var1);
+ }
+
+ public void addWorldAccess(IWorldAccess var1) {
+ this.worldAccesses.add(var1);
+ }
+
+ public List getCollidingBoundingBoxes(Entity var1, AxisAlignedBB var2) {
+ this.field_9207_I.clear();
+ int var3 = MathHelper.floor_double(var2.minX);
+ int var4 = MathHelper.floor_double(var2.maxX + 1.0D);
+ int var5 = MathHelper.floor_double(var2.minY);
+ int var6 = MathHelper.floor_double(var2.maxY + 1.0D);
+ int var7 = MathHelper.floor_double(var2.minZ);
+ int var8 = MathHelper.floor_double(var2.maxZ + 1.0D);
+
+ for(int var9 = var3; var9 < var4; ++var9) {
+ for(int var10 = var7; var10 < var8; ++var10) {
+ if(this.blockExists(var9, 64, var10)) {
+ for(int var11 = var5 - 1; var11 < var6; ++var11) {
+ Block var12 = Block.blocksList[this.getBlockId(var9, var11, var10)];
+ if(var12 != null) {
+ var12.getCollidingBoundingBoxes(this, var9, var11, var10, var2, this.field_9207_I);
+ }
+ }
+ }
+ }
+ }
+
+ double var14 = 0.25D;
+ List var15 = this.getEntitiesWithinAABBExcludingEntity(var1, var2.expand(var14, var14, var14));
+
+ for(int var16 = 0; var16 < var15.size(); ++var16) {
+ AxisAlignedBB var13 = ((Entity)var15.get(var16)).getBoundingBox();
+ if(var13 != null && var13.intersectsWith(var2)) {
+ this.field_9207_I.add(var13);
+ }
+
+ var13 = var1.func_89_d((Entity)var15.get(var16));
+ if(var13 != null && var13.intersectsWith(var2)) {
+ this.field_9207_I.add(var13);
+ }
+ }
+
+ return this.field_9207_I;
+ }
+
+ public int calculateSkylightSubtracted(float var1) {
+ float var2 = this.getCelestialAngle(var1);
+ float var3 = 1.0F - (MathHelper.cos(var2 * (float)Math.PI * 2.0F) * 2.0F + 0.5F);
+ if(var3 < 0.0F) {
+ var3 = 0.0F;
+ }
+
+ if(var3 > 1.0F) {
+ var3 = 1.0F;
+ }
+
+ var3 = 1.0F - var3;
+ var3 = (float)((double)var3 * (1.0D - (double)(this.func_27074_d(var1) * 5.0F) / 16.0D));
+ var3 = (float)((double)var3 * (1.0D - (double)(this.func_27065_c(var1) * 5.0F) / 16.0D));
+ var3 = 1.0F - var3;
+ return (int)(var3 * 11.0F);
+ }
+
+ public float getCelestialAngle(float var1) {
+ return this.worldProvider.calculateCelestialAngle(this.worldInfo.getWorldTime(), var1);
+ }
+
+ public int getTopSolidOrLiquidBlock(int var1, int var2) {
+ Chunk var3 = this.getChunkFromBlockCoords(var1, var2);
+ int var4 = 127;
+ var1 &= 15;
+
+ for(var2 &= 15; var4 > 0; --var4) {
+ int var5 = var3.getBlockID(var1, var4, var2);
+ Material var6 = var5 == 0 ? Material.air : Block.blocksList[var5].blockMaterial;
+ if(var6.getIsSolid() || var6.getIsLiquid()) {
+ return var4 + 1;
+ }
+ }
+
+ return -1;
+ }
+
+ public int findTopSolidBlock(int var1, int var2) {
+ Chunk var3 = this.getChunkFromBlockCoords(var1, var2);
+ int var4 = 127;
+ var1 &= 15;
+
+ for(var2 &= 15; var4 > 0; --var4) {
+ int var5 = var3.getBlockID(var1, var4, var2);
+ if(var5 != 0 && Block.blocksList[var5].blockMaterial.getIsSolid()) {
+ return var4 + 1;
+ }
+ }
+
+ return -1;
+ }
+
+ public void scheduleUpdateTick(int var1, int var2, int var3, int var4, int var5) {
+ NextTickListEntry var6 = new NextTickListEntry(var1, var2, var3, var4);
+ byte var7 = 8;
+ if(this.scheduledUpdatesAreImmediate) {
+ if(this.checkChunksExist(var6.xCoord - var7, var6.yCoord - var7, var6.zCoord - var7, var6.xCoord + var7, var6.yCoord + var7, var6.zCoord + var7)) {
+ int var8 = this.getBlockId(var6.xCoord, var6.yCoord, var6.zCoord);
+ if(var8 == var6.blockID && var8 > 0) {
+ Block.blocksList[var8].updateTick(this, var6.xCoord, var6.yCoord, var6.zCoord, this.rand);
+ }
+ }
+
+ } else {
+ if(this.checkChunksExist(var1 - var7, var2 - var7, var3 - var7, var1 + var7, var2 + var7, var3 + var7)) {
+ if(var4 > 0) {
+ var6.setScheduledTime((long)var5 + this.worldInfo.getWorldTime());
+ }
+
+ if(!this.scheduledTickSet.contains(var6)) {
+ this.scheduledTickSet.add(var6);
+ this.scheduledTickTreeSet.add(var6);
+ }
+ }
+
+ }
+ }
+
+ public void updateEntities() {
+ int var1;
+ Entity var2;
+ for(var1 = 0; var1 < this.lightningEntities.size(); ++var1) {
+ var2 = (Entity)this.lightningEntities.get(var1);
+ var2.onUpdate();
+ if(var2.isDead) {
+ this.lightningEntities.remove(var1--);
+ }
+ }
+
+ this.loadedEntityList.removeAll(this.unloadedEntityList);
+
+ int var3;
+ int var4;
+ for(var1 = 0; var1 < this.unloadedEntityList.size(); ++var1) {
+ var2 = (Entity)this.unloadedEntityList.get(var1);
+ var3 = var2.chunkCoordX;
+ var4 = var2.chunkCoordZ;
+ if(var2.addedToChunk && this.chunkExists(var3, var4)) {
+ this.getChunkFromChunkCoords(var3, var4).removeEntity(var2);
+ }
+ }
+
+ for(var1 = 0; var1 < this.unloadedEntityList.size(); ++var1) {
+ this.releaseEntitySkin((Entity)this.unloadedEntityList.get(var1));
+ }
+
+ this.unloadedEntityList.clear();
+
+ for(var1 = 0; var1 < this.loadedEntityList.size(); ++var1) {
+ var2 = (Entity)this.loadedEntityList.get(var1);
+ if(var2.ridingEntity != null) {
+ if(!var2.ridingEntity.isDead && var2.ridingEntity.riddenByEntity == var2) {
+ continue;
+ }
+
+ var2.ridingEntity.riddenByEntity = null;
+ var2.ridingEntity = null;
+ }
+
+ if(!var2.isDead) {
+ this.updateEntity(var2);
+ }
+
+ if(var2.isDead) {
+ var3 = var2.chunkCoordX;
+ var4 = var2.chunkCoordZ;
+ if(var2.addedToChunk && this.chunkExists(var3, var4)) {
+ this.getChunkFromChunkCoords(var3, var4).removeEntity(var2);
+ }
+
+ this.loadedEntityList.remove(var1--);
+ this.releaseEntitySkin(var2);
+ }
+ }
+
+ this.field_31048_L = true;
+ Iterator var10 = this.loadedTileEntityList.iterator();
+
+ while(var10.hasNext()) {
+ TileEntity var5 = (TileEntity)var10.next();
+ if(!var5.isInvalid()) {
+ var5.updateEntity();
+ }
+
+ if(var5.isInvalid()) {
+ var10.remove();
+ Chunk var7 = this.getChunkFromChunkCoords(var5.xCoord >> 4, var5.zCoord >> 4);
+ if(var7 != null) {
+ var7.removeChunkBlockTileEntity(var5.xCoord & 15, var5.yCoord, var5.zCoord & 15);
+ }
+ }
+ }
+
+ this.field_31048_L = false;
+ if(!this.field_20912_E.isEmpty()) {
+ Iterator var6 = this.field_20912_E.iterator();
+
+ while(var6.hasNext()) {
+ TileEntity var8 = (TileEntity)var6.next();
+ if(!var8.isInvalid()) {
+ if(!this.loadedTileEntityList.contains(var8)) {
+ this.loadedTileEntityList.add(var8);
+ }
+
+ Chunk var9 = this.getChunkFromChunkCoords(var8.xCoord >> 4, var8.zCoord >> 4);
+ if(var9 != null) {
+ var9.setChunkBlockTileEntity(var8.xCoord & 15, var8.yCoord, var8.zCoord & 15, var8);
+ }
+
+ this.markBlockNeedsUpdate(var8.xCoord, var8.yCoord, var8.zCoord);
+ }
+ }
+
+ this.field_20912_E.clear();
+ }
+
+ }
+
+ public void func_31047_a(Collection var1) {
+ if(this.field_31048_L) {
+ this.field_20912_E.addAll(var1);
+ } else {
+ this.loadedTileEntityList.addAll(var1);
+ }
+
+ }
+
+ public void updateEntity(Entity var1) {
+ this.updateEntityWithOptionalForce(var1, true);
+ }
+
+ public void updateEntityWithOptionalForce(Entity var1, boolean var2) {
+ int var3 = MathHelper.floor_double(var1.posX);
+ int var4 = MathHelper.floor_double(var1.posZ);
+ byte var5 = 32;
+ if(!var2 || this.checkChunksExist(var3 - var5, 0, var4 - var5, var3 + var5, 128, var4 + var5)) {
+ var1.lastTickPosX = var1.posX;
+ var1.lastTickPosY = var1.posY;
+ var1.lastTickPosZ = var1.posZ;
+ var1.prevRotationYaw = var1.rotationYaw;
+ var1.prevRotationPitch = var1.rotationPitch;
+ if(var2 && var1.addedToChunk) {
+ if(var1.ridingEntity != null) {
+ var1.updateRidden();
+ } else {
+ var1.onUpdate();
+ }
+ }
+
+ if(Double.isNaN(var1.posX) || Double.isInfinite(var1.posX)) {
+ var1.posX = var1.lastTickPosX;
+ }
+
+ if(Double.isNaN(var1.posY) || Double.isInfinite(var1.posY)) {
+ var1.posY = var1.lastTickPosY;
+ }
+
+ if(Double.isNaN(var1.posZ) || Double.isInfinite(var1.posZ)) {
+ var1.posZ = var1.lastTickPosZ;
+ }
+
+ if(Double.isNaN((double)var1.rotationPitch) || Double.isInfinite((double)var1.rotationPitch)) {
+ var1.rotationPitch = var1.prevRotationPitch;
+ }
+
+ if(Double.isNaN((double)var1.rotationYaw) || Double.isInfinite((double)var1.rotationYaw)) {
+ var1.rotationYaw = var1.prevRotationYaw;
+ }
+
+ int var6 = MathHelper.floor_double(var1.posX / 16.0D);
+ int var7 = MathHelper.floor_double(var1.posY / 16.0D);
+ int var8 = MathHelper.floor_double(var1.posZ / 16.0D);
+ if(!var1.addedToChunk || var1.chunkCoordX != var6 || var1.chunkCoordY != var7 || var1.chunkCoordZ != var8) {
+ if(var1.addedToChunk && this.chunkExists(var1.chunkCoordX, var1.chunkCoordZ)) {
+ this.getChunkFromChunkCoords(var1.chunkCoordX, var1.chunkCoordZ).removeEntityAtIndex(var1, var1.chunkCoordY);
+ }
+
+ if(this.chunkExists(var6, var8)) {
+ var1.addedToChunk = true;
+ this.getChunkFromChunkCoords(var6, var8).addEntity(var1);
+ } else {
+ var1.addedToChunk = false;
+ }
+ }
+
+ if(var2 && var1.addedToChunk && var1.riddenByEntity != null) {
+ if(!var1.riddenByEntity.isDead && var1.riddenByEntity.ridingEntity == var1) {
+ this.updateEntity(var1.riddenByEntity);
+ } else {
+ var1.riddenByEntity.ridingEntity = null;
+ var1.riddenByEntity = null;
+ }
+ }
+
+ }
+ }
+
+ public boolean checkIfAABBIsClear(AxisAlignedBB var1) {
+ List var2 = this.getEntitiesWithinAABBExcludingEntity((Entity)null, var1);
+
+ for(int var3 = 0; var3 < var2.size(); ++var3) {
+ Entity var4 = (Entity)var2.get(var3);
+ if(!var4.isDead && var4.preventEntitySpawning) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public boolean func_27069_b(AxisAlignedBB var1) {
+ int var2 = MathHelper.floor_double(var1.minX);
+ int var3 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var4 = MathHelper.floor_double(var1.minY);
+ int var5 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var6 = MathHelper.floor_double(var1.minZ);
+ int var7 = MathHelper.floor_double(var1.maxZ + 1.0D);
+ if(var1.minX < 0.0D) {
+ --var2;
+ }
+
+ if(var1.minY < 0.0D) {
+ --var4;
+ }
+
+ if(var1.minZ < 0.0D) {
+ --var6;
+ }
+
+ for(int var8 = var2; var8 < var3; ++var8) {
+ for(int var9 = var4; var9 < var5; ++var9) {
+ for(int var10 = var6; var10 < var7; ++var10) {
+ Block var11 = Block.blocksList[this.getBlockId(var8, var9, var10)];
+ if(var11 != null) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public boolean getIsAnyLiquid(AxisAlignedBB var1) {
+ int var2 = MathHelper.floor_double(var1.minX);
+ int var3 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var4 = MathHelper.floor_double(var1.minY);
+ int var5 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var6 = MathHelper.floor_double(var1.minZ);
+ int var7 = MathHelper.floor_double(var1.maxZ + 1.0D);
+ if(var1.minX < 0.0D) {
+ --var2;
+ }
+
+ if(var1.minY < 0.0D) {
+ --var4;
+ }
+
+ if(var1.minZ < 0.0D) {
+ --var6;
+ }
+
+ for(int var8 = var2; var8 < var3; ++var8) {
+ for(int var9 = var4; var9 < var5; ++var9) {
+ for(int var10 = var6; var10 < var7; ++var10) {
+ Block var11 = Block.blocksList[this.getBlockId(var8, var9, var10)];
+ if(var11 != null && var11.blockMaterial.getIsLiquid()) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public boolean isBoundingBoxBurning(AxisAlignedBB var1) {
+ int var2 = MathHelper.floor_double(var1.minX);
+ int var3 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var4 = MathHelper.floor_double(var1.minY);
+ int var5 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var6 = MathHelper.floor_double(var1.minZ);
+ int var7 = MathHelper.floor_double(var1.maxZ + 1.0D);
+ if(this.checkChunksExist(var2, var4, var6, var3, var5, var7)) {
+ for(int var8 = var2; var8 < var3; ++var8) {
+ for(int var9 = var4; var9 < var5; ++var9) {
+ for(int var10 = var6; var10 < var7; ++var10) {
+ int var11 = this.getBlockId(var8, var9, var10);
+ if(var11 == Block.fire.blockID || var11 == Block.lavaMoving.blockID || var11 == Block.lavaStill.blockID) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public boolean handleMaterialAcceleration(AxisAlignedBB var1, Material var2, Entity var3) {
+ int var4 = MathHelper.floor_double(var1.minX);
+ int var5 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var6 = MathHelper.floor_double(var1.minY);
+ int var7 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var8 = MathHelper.floor_double(var1.minZ);
+ int var9 = MathHelper.floor_double(var1.maxZ + 1.0D);
+ if(!this.checkChunksExist(var4, var6, var8, var5, var7, var9)) {
+ return false;
+ } else {
+ boolean var10 = false;
+ Vec3D var11 = Vec3D.createVector(0.0D, 0.0D, 0.0D);
+
+ for(int var12 = var4; var12 < var5; ++var12) {
+ for(int var13 = var6; var13 < var7; ++var13) {
+ for(int var14 = var8; var14 < var9; ++var14) {
+ Block var15 = Block.blocksList[this.getBlockId(var12, var13, var14)];
+ if(var15 != null && var15.blockMaterial == var2) {
+ double var16 = (double)((float)(var13 + 1) - BlockFluid.setFluidHeight(this.getBlockMetadata(var12, var13, var14)));
+ if((double)var7 >= var16) {
+ var10 = true;
+ var15.velocityToAddToEntity(this, var12, var13, var14, var3, var11);
+ }
+ }
+ }
+ }
+ }
+
+ if(var11.lengthVector() > 0.0D) {
+ var11 = var11.normalize();
+ double var18 = 0.014D;
+ var3.motionX += var11.xCoord * var18;
+ var3.motionY += var11.yCoord * var18;
+ var3.motionZ += var11.zCoord * var18;
+ }
+
+ return var10;
+ }
+ }
+
+ public boolean isMaterialInBB(AxisAlignedBB var1, Material var2) {
+ int var3 = MathHelper.floor_double(var1.minX);
+ int var4 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var5 = MathHelper.floor_double(var1.minY);
+ int var6 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var7 = MathHelper.floor_double(var1.minZ);
+ int var8 = MathHelper.floor_double(var1.maxZ + 1.0D);
+
+ for(int var9 = var3; var9 < var4; ++var9) {
+ for(int var10 = var5; var10 < var6; ++var10) {
+ for(int var11 = var7; var11 < var8; ++var11) {
+ Block var12 = Block.blocksList[this.getBlockId(var9, var10, var11)];
+ if(var12 != null && var12.blockMaterial == var2) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public boolean isAABBInMaterial(AxisAlignedBB var1, Material var2) {
+ int var3 = MathHelper.floor_double(var1.minX);
+ int var4 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var5 = MathHelper.floor_double(var1.minY);
+ int var6 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var7 = MathHelper.floor_double(var1.minZ);
+ int var8 = MathHelper.floor_double(var1.maxZ + 1.0D);
+
+ for(int var9 = var3; var9 < var4; ++var9) {
+ for(int var10 = var5; var10 < var6; ++var10) {
+ for(int var11 = var7; var11 < var8; ++var11) {
+ Block var12 = Block.blocksList[this.getBlockId(var9, var10, var11)];
+ if(var12 != null && var12.blockMaterial == var2) {
+ int var13 = this.getBlockMetadata(var9, var10, var11);
+ double var14 = (double)(var10 + 1);
+ if(var13 < 8) {
+ var14 = (double)(var10 + 1) - (double)var13 / 8.0D;
+ }
+
+ if(var14 >= var1.minY) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public Explosion createExplosion(Entity var1, double var2, double var4, double var6, float var8) {
+ return this.newExplosion(var1, var2, var4, var6, var8, false);
+ }
+
+ public Explosion newExplosion(Entity var1, double var2, double var4, double var6, float var8, boolean var9) {
+ Explosion var10 = new Explosion(this, var1, var2, var4, var6, var8);
+ var10.isFlaming = var9;
+ var10.doExplosion();
+ var10.doEffects(true);
+ return var10;
+ }
+
+ public float func_494_a(Vec3D var1, AxisAlignedBB var2) {
+ double var3 = 1.0D / ((var2.maxX - var2.minX) * 2.0D + 1.0D);
+ double var5 = 1.0D / ((var2.maxY - var2.minY) * 2.0D + 1.0D);
+ double var7 = 1.0D / ((var2.maxZ - var2.minZ) * 2.0D + 1.0D);
+ int var9 = 0;
+ int var10 = 0;
+
+ for(float var11 = 0.0F; var11 <= 1.0F; var11 = (float)((double)var11 + var3)) {
+ for(float var12 = 0.0F; var12 <= 1.0F; var12 = (float)((double)var12 + var5)) {
+ for(float var13 = 0.0F; var13 <= 1.0F; var13 = (float)((double)var13 + var7)) {
+ double var14 = var2.minX + (var2.maxX - var2.minX) * (double)var11;
+ double var16 = var2.minY + (var2.maxY - var2.minY) * (double)var12;
+ double var18 = var2.minZ + (var2.maxZ - var2.minZ) * (double)var13;
+ if(this.rayTraceBlocks(Vec3D.createVector(var14, var16, var18), var1) == null) {
+ ++var9;
+ }
+
+ ++var10;
+ }
+ }
+ }
+
+ return (float)var9 / (float)var10;
+ }
+
+ public void func_28096_a(EntityPlayer var1, int var2, int var3, int var4, int var5) {
+ if(var5 == 0) {
+ --var3;
+ }
+
+ if(var5 == 1) {
+ ++var3;
+ }
+
+ if(var5 == 2) {
+ --var4;
+ }
+
+ if(var5 == 3) {
+ ++var4;
+ }
+
+ if(var5 == 4) {
+ --var2;
+ }
+
+ if(var5 == 5) {
+ ++var2;
+ }
+
+ if(this.getBlockId(var2, var3, var4) == Block.fire.blockID) {
+ this.func_28101_a(var1, 1004, var2, var3, var4, 0);
+ this.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public TileEntity getBlockTileEntity(int var1, int var2, int var3) {
+ Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ return var4 != null ? var4.getChunkBlockTileEntity(var1 & 15, var2, var3 & 15) : null;
+ }
+
+ public void setBlockTileEntity(int var1, int var2, int var3, TileEntity var4) {
+ if(!var4.isInvalid()) {
+ if(this.field_31048_L) {
+ var4.xCoord = var1;
+ var4.yCoord = var2;
+ var4.zCoord = var3;
+ this.field_20912_E.add(var4);
+ } else {
+ this.loadedTileEntityList.add(var4);
+ Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ if(var5 != null) {
+ var5.setChunkBlockTileEntity(var1 & 15, var2, var3 & 15, var4);
+ }
+ }
+ }
+
+ }
+
+ public void removeBlockTileEntity(int var1, int var2, int var3) {
+ TileEntity var4 = this.getBlockTileEntity(var1, var2, var3);
+ if(var4 != null && this.field_31048_L) {
+ var4.invalidate();
+ } else {
+ if(var4 != null) {
+ this.loadedTileEntityList.remove(var4);
+ }
+
+ Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ if(var5 != null) {
+ var5.removeChunkBlockTileEntity(var1 & 15, var2, var3 & 15);
+ }
+ }
+
+ }
+
+ public boolean isBlockOpaqueCube(int var1, int var2, int var3) {
+ Block var4 = Block.blocksList[this.getBlockId(var1, var2, var3)];
+ return var4 == null ? false : var4.isOpaqueCube();
+ }
+
+ public boolean isBlockNormalCube(int var1, int var2, int var3) {
+ Block var4 = Block.blocksList[this.getBlockId(var1, var2, var3)];
+ return var4 == null ? false : var4.blockMaterial.getIsOpaque() && var4.isACube();
+ }
+
+ public boolean func_6156_d() {
+ if(this.field_4265_J >= 50) {
+ return false;
+ } else {
+ ++this.field_4265_J;
+
+ try {
+ int var1 = 500;
+
+ boolean var2;
+ while(this.field_821_y.size() > 0) {
+ --var1;
+ if(var1 <= 0) {
+ var2 = true;
+ return var2;
+ }
+
+ ((MetadataChunkBlock)this.field_821_y.remove(this.field_821_y.size() - 1)).func_4107_a(this);
+ }
+
+ var2 = false;
+ return var2;
+ } finally {
+ --this.field_4265_J;
+ }
+ }
+ }
+
+ public void scheduleLightingUpdate(EnumSkyBlock var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ this.func_484_a(var1, var2, var3, var4, var5, var6, var7, true);
+ }
+
+ public void func_484_a(EnumSkyBlock var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8) {
+ if(!this.worldProvider.field_4306_c || var1 != EnumSkyBlock.Sky) {
+ ++field_4268_y;
+
+ try {
+ if(field_4268_y == 50) {
+ return;
+ }
+
+ int var9 = (var5 + var2) / 2;
+ int var10 = (var7 + var4) / 2;
+ if(this.blockExists(var9, 64, var10)) {
+ if(this.getChunkFromBlockCoords(var9, var10).func_21101_g()) {
+ return;
+ }
+
+ int var11 = this.field_821_y.size();
+ int var12;
+ if(var8) {
+ var12 = 5;
+ if(var12 > var11) {
+ var12 = var11;
+ }
+
+ for(int var13 = 0; var13 < var12; ++var13) {
+ MetadataChunkBlock var14 = (MetadataChunkBlock)this.field_821_y.get(this.field_821_y.size() - var13 - 1);
+ if(var14.field_957_a == var1 && var14.func_692_a(var2, var3, var4, var5, var6, var7)) {
+ return;
+ }
+ }
+ }
+
+ this.field_821_y.add(new MetadataChunkBlock(var1, var2, var3, var4, var5, var6, var7));
+ var12 = 1000000;
+ if(this.field_821_y.size() > 1000000) {
+ System.out.println("More than " + var12 + " updates, aborting lighting updates");
+ this.field_821_y.clear();
+ }
+
+ return;
+ }
+ } finally {
+ --field_4268_y;
+ }
+
+ }
+ }
+
+ public void calculateInitialSkylight() {
+ int var1 = this.calculateSkylightSubtracted(1.0F);
+ if(var1 != this.skylightSubtracted) {
+ this.skylightSubtracted = var1;
+ }
+
+ }
+
+ public void setAllowedSpawnTypes(boolean var1, boolean var2) {
+ this.spawnHostileMobs = var1;
+ this.spawnPeacefulMobs = var2;
+ }
+
+ public void tick() {
+ this.updateWeather();
+ long var2;
+ if(this.isAllPlayersFullyAsleep()) {
+ boolean var1 = false;
+ if(this.spawnHostileMobs && this.difficultySetting >= 1) {
+ var1 = SpawnerAnimals.performSleepSpawning(this, this.playerEntities);
+ }
+
+ if(!var1) {
+ var2 = this.worldInfo.getWorldTime() + 24000L;
+ this.worldInfo.setWorldTime(var2 - var2 % 24000L);
+ this.wakeUpAllPlayers();
+ }
+ }
+
+ SpawnerAnimals.performSpawning(this, this.spawnHostileMobs, this.spawnPeacefulMobs);
+ this.chunkProvider.func_361_a();
+ int var4 = this.calculateSkylightSubtracted(1.0F);
+ if(var4 != this.skylightSubtracted) {
+ this.skylightSubtracted = var4;
+
+ for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) {
+ ((IWorldAccess)this.worldAccesses.get(var5)).updateAllRenderers();
+ }
+ }
+
+ var2 = this.worldInfo.getWorldTime() + 1L;
+ if(var2 % (long)this.autosavePeriod == 0L) {
+ this.saveWorld(false, (IProgressUpdate)null);
+ }
+
+ this.worldInfo.setWorldTime(var2);
+ this.TickUpdates(false);
+ this.doRandomUpdateTicks();
+ }
+
+ private void func_27070_x() {
+ if(this.worldInfo.getIsRaining()) {
+ this.field_27078_C = 1.0F;
+ if(this.worldInfo.getIsThundering()) {
+ this.field_27076_E = 1.0F;
+ }
+ }
+
+ }
+
+ protected void updateWeather() {
+ if(!this.worldProvider.field_4306_c) {
+ if(this.field_27075_F > 0) {
+ --this.field_27075_F;
+ }
+
+ int var1 = this.worldInfo.getThunderTime();
+ if(var1 <= 0) {
+ if(this.worldInfo.getIsThundering()) {
+ this.worldInfo.setThunderTime(this.rand.nextInt(12000) + 3600);
+ } else {
+ this.worldInfo.setThunderTime(this.rand.nextInt(168000) + 12000);
+ }
+ } else {
+ --var1;
+ this.worldInfo.setThunderTime(var1);
+ if(var1 <= 0) {
+ this.worldInfo.setIsThundering(!this.worldInfo.getIsThundering());
+ }
+ }
+
+ int var2 = this.worldInfo.getRainTime();
+ if(var2 <= 0) {
+ if(this.worldInfo.getIsRaining()) {
+ this.worldInfo.setRainTime(this.rand.nextInt(12000) + 12000);
+ } else {
+ this.worldInfo.setRainTime(this.rand.nextInt(168000) + 12000);
+ }
+ } else {
+ --var2;
+ this.worldInfo.setRainTime(var2);
+ if(var2 <= 0) {
+ this.worldInfo.setIsRaining(!this.worldInfo.getIsRaining());
+ }
+ }
+
+ this.field_27079_B = this.field_27078_C;
+ if(this.worldInfo.getIsRaining()) {
+ this.field_27078_C = (float)((double)this.field_27078_C + 0.01D);
+ } else {
+ this.field_27078_C = (float)((double)this.field_27078_C - 0.01D);
+ }
+
+ if(this.field_27078_C < 0.0F) {
+ this.field_27078_C = 0.0F;
+ }
+
+ if(this.field_27078_C > 1.0F) {
+ this.field_27078_C = 1.0F;
+ }
+
+ this.field_27077_D = this.field_27076_E;
+ if(this.worldInfo.getIsThundering()) {
+ this.field_27076_E = (float)((double)this.field_27076_E + 0.01D);
+ } else {
+ this.field_27076_E = (float)((double)this.field_27076_E - 0.01D);
+ }
+
+ if(this.field_27076_E < 0.0F) {
+ this.field_27076_E = 0.0F;
+ }
+
+ if(this.field_27076_E > 1.0F) {
+ this.field_27076_E = 1.0F;
+ }
+
+ }
+ }
+
+ private void clearWeather() {
+ this.worldInfo.setRainTime(0);
+ this.worldInfo.setIsRaining(false);
+ this.worldInfo.setThunderTime(0);
+ this.worldInfo.setIsThundering(false);
+ }
+
+ protected void doRandomUpdateTicks() {
+ this.activeChunkSet.clear();
+
+ int var3;
+ int var4;
+ int var6;
+ int var7;
+ for(int var1 = 0; var1 < this.playerEntities.size(); ++var1) {
+ EntityPlayer var2 = (EntityPlayer)this.playerEntities.get(var1);
+ var3 = MathHelper.floor_double(var2.posX / 16.0D);
+ var4 = MathHelper.floor_double(var2.posZ / 16.0D);
+ byte var5 = 9;
+
+ for(var6 = -var5; var6 <= var5; ++var6) {
+ for(var7 = -var5; var7 <= var5; ++var7) {
+ this.activeChunkSet.add(new ChunkCoordIntPair(var6 + var3, var7 + var4));
+ }
+ }
+ }
+
+ if(this.ambientTickCountdown > 0) {
+ --this.ambientTickCountdown;
+ }
+
+ Iterator var12 = this.activeChunkSet.iterator();
+
+ while(var12.hasNext()) {
+ ChunkCoordIntPair var13 = (ChunkCoordIntPair)var12.next();
+ var3 = var13.chunkXPos * 16;
+ var4 = var13.chunkZPos * 16;
+ Chunk var14 = this.getChunkFromChunkCoords(var13.chunkXPos, var13.chunkZPos);
+ int var8;
+ int var9;
+ int var10;
+ if(this.ambientTickCountdown == 0) {
+ this.distHashCounter = this.distHashCounter * 3 + 1013904223;
+ var6 = this.distHashCounter >> 2;
+ var7 = var6 & 15;
+ var8 = var6 >> 8 & 15;
+ var9 = var6 >> 16 & 127;
+ var10 = var14.getBlockID(var7, var9, var8);
+ var7 += var3;
+ var8 += var4;
+ if(var10 == 0 && this.getBlockLightValueNoChecks(var7, var9, var8) <= this.rand.nextInt(8) && this.getSavedLightValue(EnumSkyBlock.Sky, var7, var9, var8) <= 0) {
+ EntityPlayer var11 = this.getClosestPlayer((double)var7 + 0.5D, (double)var9 + 0.5D, (double)var8 + 0.5D, 8.0D);
+ if(var11 != null && var11.getDistanceSq((double)var7 + 0.5D, (double)var9 + 0.5D, (double)var8 + 0.5D) > 4.0D) {
+ this.playSoundEffect((double)var7 + 0.5D, (double)var9 + 0.5D, (double)var8 + 0.5D, "ambient.cave.cave", 0.7F, 0.8F + this.rand.nextFloat() * 0.2F);
+ this.ambientTickCountdown = this.rand.nextInt(12000) + 6000;
+ }
+ }
+ }
+
+ if(this.rand.nextInt(100000) == 0 && this.func_27068_v() && this.func_27067_u()) {
+ this.distHashCounter = this.distHashCounter * 3 + 1013904223;
+ var6 = this.distHashCounter >> 2;
+ var7 = var3 + (var6 & 15);
+ var8 = var4 + (var6 >> 8 & 15);
+ var9 = this.getTopSolidOrLiquidBlock(var7, var8);
+ if(this.canLightningStrikeAt(var7, var9, var8)) {
+ this.addLightningBolt(new EntityLightningBolt(this, (double)var7, (double)var9, (double)var8));
+ this.field_27075_F = 2;
+ }
+ }
+
+ int var15;
+ if(this.rand.nextInt(16) == 0) {
+ this.distHashCounter = this.distHashCounter * 3 + 1013904223;
+ var6 = this.distHashCounter >> 2;
+ var7 = var6 & 15;
+ var8 = var6 >> 8 & 15;
+ var9 = this.getTopSolidOrLiquidBlock(var7 + var3, var8 + var4);
+ if(this.getWorldChunkManager().getBiomeGenAt(var7 + var3, var8 + var4).getEnableSnow() && var9 >= 0 && var9 < 128 && var14.getSavedLightValue(EnumSkyBlock.Block, var7, var9, var8) < 10) {
+ var10 = var14.getBlockID(var7, var9 - 1, var8);
+ var15 = var14.getBlockID(var7, var9, var8);
+ if(this.func_27068_v() && var15 == 0 && Block.snow.canPlaceBlockAt(this, var7 + var3, var9, var8 + var4) && var10 != 0 && var10 != Block.ice.blockID && Block.blocksList[var10].blockMaterial.getIsSolid()) {
+ this.setBlockWithNotify(var7 + var3, var9, var8 + var4, Block.snow.blockID);
+ }
+
+ if(var10 == Block.waterStill.blockID && var14.getBlockMetadata(var7, var9 - 1, var8) == 0) {
+ this.setBlockWithNotify(var7 + var3, var9 - 1, var8 + var4, Block.ice.blockID);
+ }
+ }
+ }
+
+ for(var6 = 0; var6 < 80; ++var6) {
+ this.distHashCounter = this.distHashCounter * 3 + 1013904223;
+ var7 = this.distHashCounter >> 2;
+ var8 = var7 & 15;
+ var9 = var7 >> 8 & 15;
+ var10 = var7 >> 16 & 127;
+ var15 = var14.blocks[var8 << 11 | var9 << 7 | var10] & 255;
+ if(Block.tickOnLoad[var15]) {
+ Block.blocksList[var15].updateTick(this, var8 + var3, var10, var9 + var4, this.rand);
+ }
+ }
+ }
+
+ }
+
+ public boolean TickUpdates(boolean var1) {
+ int var2 = this.scheduledTickTreeSet.size();
+ if(var2 != this.scheduledTickSet.size()) {
+ throw new IllegalStateException("TickNextTick list out of synch");
+ } else {
+ if(var2 > 1000) {
+ var2 = 1000;
+ }
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ NextTickListEntry var4 = (NextTickListEntry)this.scheduledTickTreeSet.first();
+ if(!var1 && var4.scheduledTime > this.worldInfo.getWorldTime()) {
+ break;
+ }
+
+ this.scheduledTickTreeSet.remove(var4);
+ this.scheduledTickSet.remove(var4);
+ byte var5 = 8;
+ if(this.checkChunksExist(var4.xCoord - var5, var4.yCoord - var5, var4.zCoord - var5, var4.xCoord + var5, var4.yCoord + var5, var4.zCoord + var5)) {
+ int var6 = this.getBlockId(var4.xCoord, var4.yCoord, var4.zCoord);
+ if(var6 == var4.blockID && var6 > 0) {
+ Block.blocksList[var6].updateTick(this, var4.xCoord, var4.yCoord, var4.zCoord, this.rand);
+ }
+ }
+ }
+
+ return this.scheduledTickTreeSet.size() != 0;
+ }
+ }
+
+ public List getEntitiesWithinAABBExcludingEntity(Entity var1, AxisAlignedBB var2) {
+ this.field_778_L.clear();
+ int var3 = MathHelper.floor_double((var2.minX - 2.0D) / 16.0D);
+ int var4 = MathHelper.floor_double((var2.maxX + 2.0D) / 16.0D);
+ int var5 = MathHelper.floor_double((var2.minZ - 2.0D) / 16.0D);
+ int var6 = MathHelper.floor_double((var2.maxZ + 2.0D) / 16.0D);
+
+ for(int var7 = var3; var7 <= var4; ++var7) {
+ for(int var8 = var5; var8 <= var6; ++var8) {
+ if(this.chunkExists(var7, var8)) {
+ this.getChunkFromChunkCoords(var7, var8).getEntitiesWithinAABBForEntity(var1, var2, this.field_778_L);
+ }
+ }
+ }
+
+ return this.field_778_L;
+ }
+
+ public List getEntitiesWithinAABB(Class var1, AxisAlignedBB var2) {
+ int var3 = MathHelper.floor_double((var2.minX - 2.0D) / 16.0D);
+ int var4 = MathHelper.floor_double((var2.maxX + 2.0D) / 16.0D);
+ int var5 = MathHelper.floor_double((var2.minZ - 2.0D) / 16.0D);
+ int var6 = MathHelper.floor_double((var2.maxZ + 2.0D) / 16.0D);
+ ArrayList var7 = new ArrayList();
+
+ for(int var8 = var3; var8 <= var4; ++var8) {
+ for(int var9 = var5; var9 <= var6; ++var9) {
+ if(this.chunkExists(var8, var9)) {
+ this.getChunkFromChunkCoords(var8, var9).getEntitiesOfTypeWithinAAAB(var1, var2, var7);
+ }
+ }
+ }
+
+ return var7;
+ }
+
+ public void updateTileEntityChunkAndDoNothing(int var1, int var2, int var3, TileEntity var4) {
+ if(this.blockExists(var1, var2, var3)) {
+ this.getChunkFromBlockCoords(var1, var3).setChunkModified();
+ }
+
+ for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) {
+ ((IWorldAccess)this.worldAccesses.get(var5)).doNothingWithTileEntity(var1, var2, var3, var4);
+ }
+
+ }
+
+ public int countEntities(Class var1) {
+ int var2 = 0;
+
+ for(int var3 = 0; var3 < this.loadedEntityList.size(); ++var3) {
+ Entity var4 = (Entity)this.loadedEntityList.get(var3);
+ if(var1.isAssignableFrom(var4.getClass())) {
+ ++var2;
+ }
+ }
+
+ return var2;
+ }
+
+ public void addLoadedEntities(List var1) {
+ this.loadedEntityList.addAll(var1);
+
+ for(int var2 = 0; var2 < var1.size(); ++var2) {
+ this.obtainEntitySkin((Entity)var1.get(var2));
+ }
+
+ }
+
+ public void addUnloadedEntities(List var1) {
+ this.unloadedEntityList.addAll(var1);
+ }
+
+ public boolean canBlockBePlacedAt(int var1, int var2, int var3, int var4, boolean var5, int var6) {
+ int var7 = this.getBlockId(var2, var3, var4);
+ Block var8 = Block.blocksList[var7];
+ Block var9 = Block.blocksList[var1];
+ AxisAlignedBB var10 = var9.getCollisionBoundingBoxFromPool(this, var2, var3, var4);
+ if(var5) {
+ var10 = null;
+ }
+
+ if(var10 != null && !this.checkIfAABBIsClear(var10)) {
+ return false;
+ } else {
+ if(var8 == Block.waterMoving || var8 == Block.waterStill || var8 == Block.lavaMoving || var8 == Block.lavaStill || var8 == Block.fire || var8 == Block.snow) {
+ var8 = null;
+ }
+
+ return var1 > 0 && var8 == null && var9.canPlaceBlockOnSide(this, var2, var3, var4, var6);
+ }
+ }
+
+ public PathEntity getPathToEntity(Entity var1, Entity var2, float var3) {
+ int var4 = MathHelper.floor_double(var1.posX);
+ int var5 = MathHelper.floor_double(var1.posY);
+ int var6 = MathHelper.floor_double(var1.posZ);
+ int var7 = (int)(var3 + 16.0F);
+ int var8 = var4 - var7;
+ int var9 = var5 - var7;
+ int var10 = var6 - var7;
+ int var11 = var4 + var7;
+ int var12 = var5 + var7;
+ int var13 = var6 + var7;
+ ChunkCache var14 = new ChunkCache(this, var8, var9, var10, var11, var12, var13);
+ return (new Pathfinder(var14)).createEntityPathTo(var1, var2, var3);
+ }
+
+ public PathEntity getEntityPathToXYZ(Entity var1, int var2, int var3, int var4, float var5) {
+ int var6 = MathHelper.floor_double(var1.posX);
+ int var7 = MathHelper.floor_double(var1.posY);
+ int var8 = MathHelper.floor_double(var1.posZ);
+ int var9 = (int)(var5 + 8.0F);
+ int var10 = var6 - var9;
+ int var11 = var7 - var9;
+ int var12 = var8 - var9;
+ int var13 = var6 + var9;
+ int var14 = var7 + var9;
+ int var15 = var8 + var9;
+ ChunkCache var16 = new ChunkCache(this, var10, var11, var12, var13, var14, var15);
+ return (new Pathfinder(var16)).createEntityPathTo(var1, var2, var3, var4, var5);
+ }
+
+ public boolean isBlockProvidingPowerTo(int var1, int var2, int var3, int var4) {
+ int var5 = this.getBlockId(var1, var2, var3);
+ return var5 == 0 ? false : Block.blocksList[var5].isIndirectlyPoweringTo(this, var1, var2, var3, var4);
+ }
+
+ public boolean isBlockGettingPowered(int var1, int var2, int var3) {
+ return this.isBlockProvidingPowerTo(var1, var2 - 1, var3, 0) ? true : (this.isBlockProvidingPowerTo(var1, var2 + 1, var3, 1) ? true : (this.isBlockProvidingPowerTo(var1, var2, var3 - 1, 2) ? true : (this.isBlockProvidingPowerTo(var1, var2, var3 + 1, 3) ? true : (this.isBlockProvidingPowerTo(var1 - 1, var2, var3, 4) ? true : this.isBlockProvidingPowerTo(var1 + 1, var2, var3, 5)))));
+ }
+
+ public boolean isBlockIndirectlyProvidingPowerTo(int var1, int var2, int var3, int var4) {
+ if(this.isBlockNormalCube(var1, var2, var3)) {
+ return this.isBlockGettingPowered(var1, var2, var3);
+ } else {
+ int var5 = this.getBlockId(var1, var2, var3);
+ return var5 == 0 ? false : Block.blocksList[var5].isPoweringTo(this, var1, var2, var3, var4);
+ }
+ }
+
+ public boolean isBlockIndirectlyGettingPowered(int var1, int var2, int var3) {
+ return this.isBlockIndirectlyProvidingPowerTo(var1, var2 - 1, var3, 0) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1, var2 + 1, var3, 1) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1, var2, var3 - 1, 2) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1, var2, var3 + 1, 3) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1 - 1, var2, var3, 4) ? true : this.isBlockIndirectlyProvidingPowerTo(var1 + 1, var2, var3, 5)))));
+ }
+
+ public EntityPlayer getClosestPlayerToEntity(Entity var1, double var2) {
+ return this.getClosestPlayer(var1.posX, var1.posY, var1.posZ, var2);
+ }
+
+ public EntityPlayer getClosestPlayer(double var1, double var3, double var5, double var7) {
+ double var9 = -1.0D;
+ EntityPlayer var11 = null;
+
+ for(int var12 = 0; var12 < this.playerEntities.size(); ++var12) {
+ EntityPlayer var13 = (EntityPlayer)this.playerEntities.get(var12);
+ double var14 = var13.getDistanceSq(var1, var3, var5);
+ if((var7 < 0.0D || var14 < var7 * var7) && (var9 == -1.0D || var14 < var9)) {
+ var9 = var14;
+ var11 = var13;
+ }
+ }
+
+ return var11;
+ }
+
+ public EntityPlayer getPlayerEntityByName(String var1) {
+ for(int var2 = 0; var2 < this.playerEntities.size(); ++var2) {
+ if(var1.equals(((EntityPlayer)this.playerEntities.get(var2)).username)) {
+ return (EntityPlayer)this.playerEntities.get(var2);
+ }
+ }
+
+ return null;
+ }
+
+ public byte[] getChunkData(int var1, int var2, int var3, int var4, int var5, int var6) {
+ byte[] var7 = new byte[var4 * var5 * var6 * 5 / 2];
+ int var8 = var1 >> 4;
+ int var9 = var3 >> 4;
+ int var10 = var1 + var4 - 1 >> 4;
+ int var11 = var3 + var6 - 1 >> 4;
+ int var12 = 0;
+ int var13 = var2;
+ int var14 = var2 + var5;
+ if(var2 < 0) {
+ var13 = 0;
+ }
+
+ if(var14 > 128) {
+ var14 = 128;
+ }
+
+ for(int var15 = var8; var15 <= var10; ++var15) {
+ int var16 = var1 - var15 * 16;
+ int var17 = var1 + var4 - var15 * 16;
+ if(var16 < 0) {
+ var16 = 0;
+ }
+
+ if(var17 > 16) {
+ var17 = 16;
+ }
+
+ for(int var18 = var9; var18 <= var11; ++var18) {
+ int var19 = var3 - var18 * 16;
+ int var20 = var3 + var6 - var18 * 16;
+ if(var19 < 0) {
+ var19 = 0;
+ }
+
+ if(var20 > 16) {
+ var20 = 16;
+ }
+
+ var12 = this.getChunkFromChunkCoords(var15, var18).getChunkData(var7, var16, var13, var19, var17, var14, var20, var12);
+ }
+ }
+
+ return var7;
+ }
+
+ public void checkSessionLock() {
+ this.worldFile.func_22091_b();
+ }
+
+ public void setWorldTime(long var1) {
+ this.worldInfo.setWorldTime(var1);
+ }
+
+ public void func_32005_b(long var1) {
+ long var3 = var1 - this.worldInfo.getWorldTime();
+
+ NextTickListEntry var6;
+ for(Iterator var5 = this.scheduledTickSet.iterator(); var5.hasNext(); var6.scheduledTime += var3) {
+ var6 = (NextTickListEntry)var5.next();
+ }
+
+ this.setWorldTime(var1);
+ }
+
+ public long getRandomSeed() {
+ return this.worldInfo.getRandomSeed();
+ }
+
+ public long getWorldTime() {
+ return this.worldInfo.getWorldTime();
+ }
+
+ public ChunkCoordinates getSpawnPoint() {
+ return new ChunkCoordinates(this.worldInfo.getSpawnX(), this.worldInfo.getSpawnY(), this.worldInfo.getSpawnZ());
+ }
+
+ public boolean canMineBlock(EntityPlayer var1, int var2, int var3, int var4) {
+ return true;
+ }
+
+ public void sendTrackedEntityStatusUpdatePacket(Entity var1, byte var2) {
+ }
+
+ public IChunkProvider o() {
+ return this.chunkProvider;
+ }
+
+ public void playNoteAt(int var1, int var2, int var3, int var4, int var5) {
+ int var6 = this.getBlockId(var1, var2, var3);
+ if(var6 > 0) {
+ Block.blocksList[var6].playBlock(this, var1, var2, var3, var4, var5);
+ }
+
+ }
+
+ public ISaveHandler getWorldFile() {
+ return this.worldFile;
+ }
+
+ public WorldInfo getWorldInfo() {
+ return this.worldInfo;
+ }
+
+ public void updateAllPlayersSleepingFlag() {
+ this.allPlayersSleeping = !this.playerEntities.isEmpty();
+ Iterator var1 = this.playerEntities.iterator();
+
+ while(var1.hasNext()) {
+ EntityPlayer var2 = (EntityPlayer)var1.next();
+ if(!var2.func_22057_E()) {
+ this.allPlayersSleeping = false;
+ break;
+ }
+ }
+
+ }
+
+ protected void wakeUpAllPlayers() {
+ this.allPlayersSleeping = false;
+ Iterator var1 = this.playerEntities.iterator();
+
+ while(var1.hasNext()) {
+ EntityPlayer var2 = (EntityPlayer)var1.next();
+ if(var2.func_22057_E()) {
+ var2.wakeUpPlayer(false, false, true);
+ }
+ }
+
+ this.clearWeather();
+ }
+
+ public boolean isAllPlayersFullyAsleep() {
+ if(this.allPlayersSleeping && !this.singleplayerWorld) {
+ Iterator var1 = this.playerEntities.iterator();
+
+ EntityPlayer var2;
+ do {
+ if(!var1.hasNext()) {
+ return true;
+ }
+
+ var2 = (EntityPlayer)var1.next();
+ } while(var2.isPlayerFullyAsleep());
+
+ return false;
+ } else {
+ return false;
+ }
+ }
+
+ public float func_27065_c(float var1) {
+ return (this.field_27077_D + (this.field_27076_E - this.field_27077_D) * var1) * this.func_27074_d(var1);
+ }
+
+ public float func_27074_d(float var1) {
+ return this.field_27079_B + (this.field_27078_C - this.field_27079_B) * var1;
+ }
+
+ public boolean func_27067_u() {
+ return (double)this.func_27065_c(1.0F) > 0.9D;
+ }
+
+ public boolean func_27068_v() {
+ return (double)this.func_27074_d(1.0F) > 0.2D;
+ }
+
+ public boolean canLightningStrikeAt(int var1, int var2, int var3) {
+ if(!this.func_27068_v()) {
+ return false;
+ } else if(!this.canBlockSeeTheSky(var1, var2, var3)) {
+ return false;
+ } else if(this.getTopSolidOrLiquidBlock(var1, var3) > var2) {
+ return false;
+ } else {
+ BiomeGenBase var4 = this.getWorldChunkManager().getBiomeGenAt(var1, var3);
+ return var4.getEnableSnow() ? false : var4.canSpawnLightningBolt();
+ }
+ }
+
+ public void func_28102_a(String var1, MapDataBase var2) {
+ this.field_28105_z.func_28177_a(var1, var2);
+ }
+
+ public MapDataBase func_28103_a(Class var1, String var2) {
+ return this.field_28105_z.func_28178_a(var1, var2);
+ }
+
+ public int func_28104_b(String var1) {
+ return this.field_28105_z.func_28173_a(var1);
+ }
+
+ public void func_28097_e(int var1, int var2, int var3, int var4, int var5) {
+ this.func_28101_a((EntityPlayer)null, var1, var2, var3, var4, var5);
+ }
+
+ public void func_28101_a(EntityPlayer var1, int var2, int var3, int var4, int var5, int var6) {
+ for(int var7 = 0; var7 < this.worldAccesses.size(); ++var7) {
+ ((IWorldAccess)this.worldAccesses.get(var7)).func_28133_a(var1, var2, var3, var4, var5, var6);
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/WorldChunkManager.java b/src/net/minecraft/src/WorldChunkManager.java
new file mode 100644
index 0000000..7560939
--- /dev/null
+++ b/src/net/minecraft/src/WorldChunkManager.java
@@ -0,0 +1,112 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldChunkManager {
+ private NoiseGeneratorOctaves2 field_4255_e;
+ private NoiseGeneratorOctaves2 field_4254_f;
+ private NoiseGeneratorOctaves2 field_4253_g;
+ public double[] temperature;
+ public double[] humidity;
+ public double[] field_4257_c;
+ public BiomeGenBase[] field_4256_d;
+
+ protected WorldChunkManager() {
+ }
+
+ public WorldChunkManager(World var1) {
+ this.field_4255_e = new NoiseGeneratorOctaves2(new Random(var1.getRandomSeed() * 9871L), 4);
+ this.field_4254_f = new NoiseGeneratorOctaves2(new Random(var1.getRandomSeed() * 39811L), 4);
+ this.field_4253_g = new NoiseGeneratorOctaves2(new Random(var1.getRandomSeed() * 543321L), 2);
+ }
+
+ public BiomeGenBase func_4066_a(ChunkCoordIntPair var1) {
+ return this.getBiomeGenAt(var1.chunkXPos << 4, var1.chunkZPos << 4);
+ }
+
+ public BiomeGenBase getBiomeGenAt(int var1, int var2) {
+ return this.func_4065_a(var1, var2, 1, 1)[0];
+ }
+
+ public BiomeGenBase[] func_4065_a(int var1, int var2, int var3, int var4) {
+ this.field_4256_d = this.loadBlockGeneratorData(this.field_4256_d, var1, var2, var3, var4);
+ return this.field_4256_d;
+ }
+
+ public double[] getTemperatures(double[] var1, int var2, int var3, int var4, int var5) {
+ if(var1 == null || var1.length < var4 * var5) {
+ var1 = new double[var4 * var5];
+ }
+
+ var1 = this.field_4255_e.func_4101_a(var1, (double)var2, (double)var3, var4, var5, (double)0.025F, (double)0.025F, 0.25D);
+ this.field_4257_c = this.field_4253_g.func_4101_a(this.field_4257_c, (double)var2, (double)var3, var4, var5, 0.25D, 0.25D, 0.5882352941176471D);
+ int var6 = 0;
+
+ for(int var7 = 0; var7 < var4; ++var7) {
+ for(int var8 = 0; var8 < var5; ++var8) {
+ double var9 = this.field_4257_c[var6] * 1.1D + 0.5D;
+ double var11 = 0.01D;
+ double var13 = 1.0D - var11;
+ double var15 = (var1[var6] * 0.15D + 0.7D) * var13 + var9 * var11;
+ var15 = 1.0D - (1.0D - var15) * (1.0D - var15);
+ if(var15 < 0.0D) {
+ var15 = 0.0D;
+ }
+
+ if(var15 > 1.0D) {
+ var15 = 1.0D;
+ }
+
+ var1[var6] = var15;
+ ++var6;
+ }
+ }
+
+ return var1;
+ }
+
+ public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] var1, int var2, int var3, int var4, int var5) {
+ if(var1 == null || var1.length < var4 * var5) {
+ var1 = new BiomeGenBase[var4 * var5];
+ }
+
+ this.temperature = this.field_4255_e.func_4101_a(this.temperature, (double)var2, (double)var3, var4, var4, (double)0.025F, (double)0.025F, 0.25D);
+ this.humidity = this.field_4254_f.func_4101_a(this.humidity, (double)var2, (double)var3, var4, var4, (double)0.05F, (double)0.05F, 1.0D / 3.0D);
+ this.field_4257_c = this.field_4253_g.func_4101_a(this.field_4257_c, (double)var2, (double)var3, var4, var4, 0.25D, 0.25D, 0.5882352941176471D);
+ int var6 = 0;
+
+ for(int var7 = 0; var7 < var4; ++var7) {
+ for(int var8 = 0; var8 < var5; ++var8) {
+ double var9 = this.field_4257_c[var6] * 1.1D + 0.5D;
+ double var11 = 0.01D;
+ double var13 = 1.0D - var11;
+ double var15 = (this.temperature[var6] * 0.15D + 0.7D) * var13 + var9 * var11;
+ var11 = 0.002D;
+ var13 = 1.0D - var11;
+ double var17 = (this.humidity[var6] * 0.15D + 0.5D) * var13 + var9 * var11;
+ var15 = 1.0D - (1.0D - var15) * (1.0D - var15);
+ if(var15 < 0.0D) {
+ var15 = 0.0D;
+ }
+
+ if(var17 < 0.0D) {
+ var17 = 0.0D;
+ }
+
+ if(var15 > 1.0D) {
+ var15 = 1.0D;
+ }
+
+ if(var17 > 1.0D) {
+ var17 = 1.0D;
+ }
+
+ this.temperature[var6] = var15;
+ this.humidity[var6] = var17;
+ var1[var6++] = BiomeGenBase.getBiomeFromLookup(var15, var17);
+ }
+ }
+
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/WorldChunkManagerHell.java b/src/net/minecraft/src/WorldChunkManagerHell.java
new file mode 100644
index 0000000..4d16d9a
--- /dev/null
+++ b/src/net/minecraft/src/WorldChunkManagerHell.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+import java.util.Arrays;
+
+public class WorldChunkManagerHell extends WorldChunkManager {
+ private BiomeGenBase field_4262_e;
+ private double field_4261_f;
+ private double field_4260_g;
+
+ public WorldChunkManagerHell(BiomeGenBase var1, double var2, double var4) {
+ this.field_4262_e = var1;
+ this.field_4261_f = var2;
+ this.field_4260_g = var4;
+ }
+
+ public BiomeGenBase func_4066_a(ChunkCoordIntPair var1) {
+ return this.field_4262_e;
+ }
+
+ public BiomeGenBase getBiomeGenAt(int var1, int var2) {
+ return this.field_4262_e;
+ }
+
+ public BiomeGenBase[] func_4065_a(int var1, int var2, int var3, int var4) {
+ this.field_4256_d = this.loadBlockGeneratorData(this.field_4256_d, var1, var2, var3, var4);
+ return this.field_4256_d;
+ }
+
+ public double[] getTemperatures(double[] var1, int var2, int var3, int var4, int var5) {
+ if(var1 == null || var1.length < var4 * var5) {
+ var1 = new double[var4 * var5];
+ }
+
+ Arrays.fill(var1, 0, var4 * var5, this.field_4261_f);
+ return var1;
+ }
+
+ public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] var1, int var2, int var3, int var4, int var5) {
+ if(var1 == null || var1.length < var4 * var5) {
+ var1 = new BiomeGenBase[var4 * var5];
+ }
+
+ if(this.temperature == null || this.temperature.length < var4 * var5) {
+ this.temperature = new double[var4 * var5];
+ this.humidity = new double[var4 * var5];
+ }
+
+ Arrays.fill(var1, 0, var4 * var5, this.field_4262_e);
+ Arrays.fill(this.humidity, 0, var4 * var5, this.field_4260_g);
+ Arrays.fill(this.temperature, 0, var4 * var5, this.field_4261_f);
+ return var1;
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenBigTree.java b/src/net/minecraft/src/WorldGenBigTree.java
new file mode 100644
index 0000000..b61b8e8
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenBigTree.java
@@ -0,0 +1,348 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenBigTree extends WorldGenerator {
+ static final byte[] field_760_a = new byte[]{(byte)2, (byte)0, (byte)0, (byte)1, (byte)2, (byte)1};
+ Random random0 = new Random();
+ World worldObj;
+ int[] basePos = new int[]{0, 0, 0};
+ int field_756_e = 0;
+ int height;
+ double field_754_g = 0.618D;
+ double field_753_h = 1.0D;
+ double field_752_i = 0.381D;
+ double field_751_j = 1.0D;
+ double field_750_k = 1.0D;
+ int field_749_l = 1;
+ int field_748_m = 12;
+ int field_747_n = 4;
+ int[][] field_746_o;
+
+ void func_424_a() {
+ this.height = (int)((double)this.field_756_e * this.field_754_g);
+ if(this.height >= this.field_756_e) {
+ this.height = this.field_756_e - 1;
+ }
+
+ int var1 = (int)(1.382D + Math.pow(this.field_750_k * (double)this.field_756_e / 13.0D, 2.0D));
+ if(var1 < 1) {
+ var1 = 1;
+ }
+
+ int[][] var2 = new int[var1 * this.field_756_e][4];
+ int var3 = this.basePos[1] + this.field_756_e - this.field_747_n;
+ int var4 = 1;
+ int var5 = this.basePos[1] + this.height;
+ int var6 = var3 - this.basePos[1];
+ var2[0][0] = this.basePos[0];
+ var2[0][1] = var3;
+ var2[0][2] = this.basePos[2];
+ var2[0][3] = var5;
+ --var3;
+
+ while(true) {
+ while(var6 >= 0) {
+ int var7 = 0;
+ float var8 = this.func_431_a(var6);
+ if(var8 < 0.0F) {
+ --var3;
+ --var6;
+ } else {
+ for(double var9 = 0.5D; var7 < var1; ++var7) {
+ double var11 = this.field_751_j * (double)var8 * ((double)this.random0.nextFloat() + 0.328D);
+ double var13 = (double)this.random0.nextFloat() * 2.0D * 3.14159D;
+ int var15 = MathHelper.floor_double(var11 * Math.sin(var13) + (double)this.basePos[0] + var9);
+ int var16 = MathHelper.floor_double(var11 * Math.cos(var13) + (double)this.basePos[2] + var9);
+ int[] var17 = new int[]{var15, var3, var16};
+ int[] var18 = new int[]{var15, var3 + this.field_747_n, var16};
+ if(this.func_427_a(var17, var18) == -1) {
+ int[] var19 = new int[]{this.basePos[0], this.basePos[1], this.basePos[2]};
+ double var20 = Math.sqrt(Math.pow((double)Math.abs(this.basePos[0] - var17[0]), 2.0D) + Math.pow((double)Math.abs(this.basePos[2] - var17[2]), 2.0D));
+ double var22 = var20 * this.field_752_i;
+ if((double)var17[1] - var22 > (double)var5) {
+ var19[1] = var5;
+ } else {
+ var19[1] = (int)((double)var17[1] - var22);
+ }
+
+ if(this.func_427_a(var19, var17) == -1) {
+ var2[var4][0] = var15;
+ var2[var4][1] = var3;
+ var2[var4][2] = var16;
+ var2[var4][3] = var19[1];
+ ++var4;
+ }
+ }
+ }
+
+ --var3;
+ --var6;
+ }
+ }
+
+ this.field_746_o = new int[var4][4];
+ System.arraycopy(var2, 0, this.field_746_o, 0, var4);
+ return;
+ }
+ }
+
+ void func_426_a(int var1, int var2, int var3, float var4, byte var5, int var6) {
+ int var7 = (int)((double)var4 + 0.618D);
+ byte var8 = field_760_a[var5];
+ byte var9 = field_760_a[var5 + 3];
+ int[] var10 = new int[]{var1, var2, var3};
+ int[] var11 = new int[]{0, 0, 0};
+ int var12 = -var7;
+ int var13 = -var7;
+
+ label32:
+ for(var11[var5] = var10[var5]; var12 <= var7; ++var12) {
+ var11[var8] = var10[var8] + var12;
+ var13 = -var7;
+
+ while(true) {
+ while(true) {
+ if(var13 > var7) {
+ continue label32;
+ }
+
+ double var15 = Math.sqrt(Math.pow((double)Math.abs(var12) + 0.5D, 2.0D) + Math.pow((double)Math.abs(var13) + 0.5D, 2.0D));
+ if(var15 > (double)var4) {
+ ++var13;
+ } else {
+ var11[var9] = var10[var9] + var13;
+ int var14 = this.worldObj.getBlockId(var11[0], var11[1], var11[2]);
+ if(var14 != 0 && var14 != 18) {
+ ++var13;
+ } else {
+ this.worldObj.setBlock(var11[0], var11[1], var11[2], var6);
+ ++var13;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ float func_431_a(int var1) {
+ if((double)var1 < (double)((float)this.field_756_e) * 0.3D) {
+ return -1.618F;
+ } else {
+ float var2 = (float)this.field_756_e / 2.0F;
+ float var3 = (float)this.field_756_e / 2.0F - (float)var1;
+ float var4;
+ if(var3 == 0.0F) {
+ var4 = var2;
+ } else if(Math.abs(var3) >= var2) {
+ var4 = 0.0F;
+ } else {
+ var4 = (float)Math.sqrt(Math.pow((double)Math.abs(var2), 2.0D) - Math.pow((double)Math.abs(var3), 2.0D));
+ }
+
+ var4 *= 0.5F;
+ return var4;
+ }
+ }
+
+ float func_429_b(int var1) {
+ return var1 >= 0 && var1 < this.field_747_n ? (var1 != 0 && var1 != this.field_747_n - 1 ? 3.0F : 2.0F) : -1.0F;
+ }
+
+ void func_423_a(int var1, int var2, int var3) {
+ int var4 = var2;
+
+ for(int var5 = var2 + this.field_747_n; var4 < var5; ++var4) {
+ float var6 = this.func_429_b(var4 - var2);
+ this.func_426_a(var1, var4, var3, var6, (byte)1, 18);
+ }
+
+ }
+
+ void func_425_a(int[] var1, int[] var2, int var3) {
+ int[] var4 = new int[]{0, 0, 0};
+ byte var5 = 0;
+
+ byte var6;
+ for(var6 = 0; var5 < 3; ++var5) {
+ var4[var5] = var2[var5] - var1[var5];
+ if(Math.abs(var4[var5]) > Math.abs(var4[var6])) {
+ var6 = var5;
+ }
+ }
+
+ if(var4[var6] != 0) {
+ byte var7 = field_760_a[var6];
+ byte var8 = field_760_a[var6 + 3];
+ byte var9;
+ if(var4[var6] > 0) {
+ var9 = 1;
+ } else {
+ var9 = -1;
+ }
+
+ double var10 = (double)var4[var7] / (double)var4[var6];
+ double var12 = (double)var4[var8] / (double)var4[var6];
+ int[] var14 = new int[]{0, 0, 0};
+ int var15 = 0;
+
+ for(int var16 = var4[var6] + var9; var15 != var16; var15 += var9) {
+ var14[var6] = MathHelper.floor_double((double)(var1[var6] + var15) + 0.5D);
+ var14[var7] = MathHelper.floor_double((double)var1[var7] + (double)var15 * var10 + 0.5D);
+ var14[var8] = MathHelper.floor_double((double)var1[var8] + (double)var15 * var12 + 0.5D);
+ this.worldObj.setBlock(var14[0], var14[1], var14[2], var3);
+ }
+
+ }
+ }
+
+ void func_421_b() {
+ int var1 = 0;
+
+ for(int var2 = this.field_746_o.length; var1 < var2; ++var1) {
+ int var3 = this.field_746_o[var1][0];
+ int var4 = this.field_746_o[var1][1];
+ int var5 = this.field_746_o[var1][2];
+ this.func_423_a(var3, var4, var5);
+ }
+
+ }
+
+ boolean func_430_c(int var1) {
+ return (double)var1 >= (double)this.field_756_e * 0.2D;
+ }
+
+ void func_432_c() {
+ int var1 = this.basePos[0];
+ int var2 = this.basePos[1];
+ int var3 = this.basePos[1] + this.height;
+ int var4 = this.basePos[2];
+ int[] var5 = new int[]{var1, var2, var4};
+ int[] var6 = new int[]{var1, var3, var4};
+ this.func_425_a(var5, var6, 17);
+ if(this.field_749_l == 2) {
+ ++var5[0];
+ ++var6[0];
+ this.func_425_a(var5, var6, 17);
+ ++var5[2];
+ ++var6[2];
+ this.func_425_a(var5, var6, 17);
+ var5[0] += -1;
+ var6[0] += -1;
+ this.func_425_a(var5, var6, 17);
+ }
+
+ }
+
+ void func_428_d() {
+ int var1 = 0;
+ int var2 = this.field_746_o.length;
+
+ for(int[] var3 = new int[]{this.basePos[0], this.basePos[1], this.basePos[2]}; var1 < var2; ++var1) {
+ int[] var4 = this.field_746_o[var1];
+ int[] var5 = new int[]{var4[0], var4[1], var4[2]};
+ var3[1] = var4[3];
+ int var6 = var3[1] - this.basePos[1];
+ if(this.func_430_c(var6)) {
+ this.func_425_a(var3, var5, 17);
+ }
+ }
+
+ }
+
+ int func_427_a(int[] var1, int[] var2) {
+ int[] var3 = new int[]{0, 0, 0};
+ byte var4 = 0;
+
+ byte var5;
+ for(var5 = 0; var4 < 3; ++var4) {
+ var3[var4] = var2[var4] - var1[var4];
+ if(Math.abs(var3[var4]) > Math.abs(var3[var5])) {
+ var5 = var4;
+ }
+ }
+
+ if(var3[var5] == 0) {
+ return -1;
+ } else {
+ byte var6 = field_760_a[var5];
+ byte var7 = field_760_a[var5 + 3];
+ byte var8;
+ if(var3[var5] > 0) {
+ var8 = 1;
+ } else {
+ var8 = -1;
+ }
+
+ double var9 = (double)var3[var6] / (double)var3[var5];
+ double var11 = (double)var3[var7] / (double)var3[var5];
+ int[] var13 = new int[]{0, 0, 0};
+ int var14 = 0;
+
+ int var15;
+ for(var15 = var3[var5] + var8; var14 != var15; var14 += var8) {
+ var13[var5] = var1[var5] + var14;
+ var13[var6] = MathHelper.floor_double((double)var1[var6] + (double)var14 * var9);
+ var13[var7] = MathHelper.floor_double((double)var1[var7] + (double)var14 * var11);
+ int var16 = this.worldObj.getBlockId(var13[0], var13[1], var13[2]);
+ if(var16 != 0 && var16 != 18) {
+ break;
+ }
+ }
+
+ return var14 == var15 ? -1 : Math.abs(var14);
+ }
+ }
+
+ boolean func_422_e() {
+ int[] var1 = new int[]{this.basePos[0], this.basePos[1], this.basePos[2]};
+ int[] var2 = new int[]{this.basePos[0], this.basePos[1] + this.field_756_e - 1, this.basePos[2]};
+ int var3 = this.worldObj.getBlockId(this.basePos[0], this.basePos[1] - 1, this.basePos[2]);
+ if(var3 != 2 && var3 != 3) {
+ return false;
+ } else {
+ int var4 = this.func_427_a(var1, var2);
+ if(var4 == -1) {
+ return true;
+ } else if(var4 < 6) {
+ return false;
+ } else {
+ this.field_756_e = var4;
+ return true;
+ }
+ }
+ }
+
+ public void func_420_a(double var1, double var3, double var5) {
+ this.field_748_m = (int)(var1 * 12.0D);
+ if(var1 > 0.5D) {
+ this.field_747_n = 5;
+ }
+
+ this.field_751_j = var3;
+ this.field_750_k = var5;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ this.worldObj = var1;
+ long var6 = var2.nextLong();
+ this.random0.setSeed(var6);
+ this.basePos[0] = var3;
+ this.basePos[1] = var4;
+ this.basePos[2] = var5;
+ if(this.field_756_e == 0) {
+ this.field_756_e = 5 + this.random0.nextInt(this.field_748_m);
+ }
+
+ if(!this.func_422_e()) {
+ return false;
+ } else {
+ this.func_424_a();
+ this.func_421_b();
+ this.func_432_c();
+ this.func_428_d();
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenCactus.java b/src/net/minecraft/src/WorldGenCactus.java
new file mode 100644
index 0000000..cedc49d
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenCactus.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenCactus extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 10; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.isAirBlock(var7, var8, var9)) {
+ int var10 = 1 + var2.nextInt(var2.nextInt(3) + 1);
+
+ for(int var11 = 0; var11 < var10; ++var11) {
+ if(Block.cactus.canBlockStay(var1, var7, var8 + var11, var9)) {
+ var1.setBlock(var7, var8 + var11, var9, Block.cactus.blockID);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenClay.java b/src/net/minecraft/src/WorldGenClay.java
new file mode 100644
index 0000000..1e538a4
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenClay.java
@@ -0,0 +1,59 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenClay extends WorldGenerator {
+ private int clayBlockId = Block.blockClay.blockID;
+ private int numberOfBlocks;
+
+ public WorldGenClay(int var1) {
+ this.numberOfBlocks = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(var1.getBlockMaterial(var3, var4, var5) != Material.water) {
+ return false;
+ } else {
+ float var6 = var2.nextFloat() * (float)Math.PI;
+ double var7 = (double)((float)(var3 + 8) + MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var9 = (double)((float)(var3 + 8) - MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var11 = (double)((float)(var5 + 8) + MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var13 = (double)((float)(var5 + 8) - MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var15 = (double)(var4 + var2.nextInt(3) + 2);
+ double var17 = (double)(var4 + var2.nextInt(3) + 2);
+
+ for(int var19 = 0; var19 <= this.numberOfBlocks; ++var19) {
+ double var20 = var7 + (var9 - var7) * (double)var19 / (double)this.numberOfBlocks;
+ double var22 = var15 + (var17 - var15) * (double)var19 / (double)this.numberOfBlocks;
+ double var24 = var11 + (var13 - var11) * (double)var19 / (double)this.numberOfBlocks;
+ double var26 = var2.nextDouble() * (double)this.numberOfBlocks / 16.0D;
+ double var28 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
+ double var30 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
+ int var32 = MathHelper.floor_double(var20 - var28 / 2.0D);
+ int var33 = MathHelper.floor_double(var20 + var28 / 2.0D);
+ int var34 = MathHelper.floor_double(var22 - var30 / 2.0D);
+ int var35 = MathHelper.floor_double(var22 + var30 / 2.0D);
+ int var36 = MathHelper.floor_double(var24 - var28 / 2.0D);
+ int var37 = MathHelper.floor_double(var24 + var28 / 2.0D);
+
+ for(int var38 = var32; var38 <= var33; ++var38) {
+ for(int var39 = var34; var39 <= var35; ++var39) {
+ for(int var40 = var36; var40 <= var37; ++var40) {
+ double var41 = ((double)var38 + 0.5D - var20) / (var28 / 2.0D);
+ double var43 = ((double)var39 + 0.5D - var22) / (var30 / 2.0D);
+ double var45 = ((double)var40 + 0.5D - var24) / (var28 / 2.0D);
+ if(var41 * var41 + var43 * var43 + var45 * var45 < 1.0D) {
+ int var47 = var1.getBlockId(var38, var39, var40);
+ if(var47 == Block.sand.blockID) {
+ var1.setBlock(var38, var39, var40, this.clayBlockId);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenDeadBush.java b/src/net/minecraft/src/WorldGenDeadBush.java
new file mode 100644
index 0000000..0f3805f
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenDeadBush.java
@@ -0,0 +1,33 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenDeadBush extends WorldGenerator {
+ private int field_28055_a;
+
+ public WorldGenDeadBush(int var1) {
+ this.field_28055_a = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ boolean var6 = false;
+
+ while(true) {
+ int var11 = var1.getBlockId(var3, var4, var5);
+ if(var11 != 0 && var11 != Block.leaves.blockID || var4 <= 0) {
+ for(int var7 = 0; var7 < 4; ++var7) {
+ int var8 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var9 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var10 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.isAirBlock(var8, var9, var10) && ((BlockFlower)Block.blocksList[this.field_28055_a]).canBlockStay(var1, var8, var9, var10)) {
+ var1.setBlock(var8, var9, var10, this.field_28055_a);
+ }
+ }
+
+ return true;
+ }
+
+ --var4;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenDungeons.java b/src/net/minecraft/src/WorldGenDungeons.java
new file mode 100644
index 0000000..72bd60f
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenDungeons.java
@@ -0,0 +1,116 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenDungeons extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ byte var6 = 3;
+ int var7 = var2.nextInt(2) + 2;
+ int var8 = var2.nextInt(2) + 2;
+ int var9 = 0;
+
+ int var10;
+ int var11;
+ int var12;
+ for(var10 = var3 - var7 - 1; var10 <= var3 + var7 + 1; ++var10) {
+ for(var11 = var4 - 1; var11 <= var4 + var6 + 1; ++var11) {
+ for(var12 = var5 - var8 - 1; var12 <= var5 + var8 + 1; ++var12) {
+ Material var13 = var1.getBlockMaterial(var10, var11, var12);
+ if(var11 == var4 - 1 && !var13.isSolid()) {
+ return false;
+ }
+
+ if(var11 == var4 + var6 + 1 && !var13.isSolid()) {
+ return false;
+ }
+
+ if((var10 == var3 - var7 - 1 || var10 == var3 + var7 + 1 || var12 == var5 - var8 - 1 || var12 == var5 + var8 + 1) && var11 == var4 && var1.isAirBlock(var10, var11, var12) && var1.isAirBlock(var10, var11 + 1, var12)) {
+ ++var9;
+ }
+ }
+ }
+ }
+
+ if(var9 >= 1 && var9 <= 5) {
+ for(var10 = var3 - var7 - 1; var10 <= var3 + var7 + 1; ++var10) {
+ for(var11 = var4 + var6; var11 >= var4 - 1; --var11) {
+ for(var12 = var5 - var8 - 1; var12 <= var5 + var8 + 1; ++var12) {
+ if(var10 != var3 - var7 - 1 && var11 != var4 - 1 && var12 != var5 - var8 - 1 && var10 != var3 + var7 + 1 && var11 != var4 + var6 + 1 && var12 != var5 + var8 + 1) {
+ var1.setBlockWithNotify(var10, var11, var12, 0);
+ } else if(var11 >= 0 && !var1.getBlockMaterial(var10, var11 - 1, var12).isSolid()) {
+ var1.setBlockWithNotify(var10, var11, var12, 0);
+ } else if(var1.getBlockMaterial(var10, var11, var12).isSolid()) {
+ if(var11 == var4 - 1 && var2.nextInt(4) != 0) {
+ var1.setBlockWithNotify(var10, var11, var12, Block.cobblestoneMossy.blockID);
+ } else {
+ var1.setBlockWithNotify(var10, var11, var12, Block.cobblestone.blockID);
+ }
+ }
+ }
+ }
+ }
+
+ label110:
+ for(var10 = 0; var10 < 2; ++var10) {
+ for(var11 = 0; var11 < 3; ++var11) {
+ var12 = var3 + var2.nextInt(var7 * 2 + 1) - var7;
+ int var14 = var5 + var2.nextInt(var8 * 2 + 1) - var8;
+ if(var1.isAirBlock(var12, var4, var14)) {
+ int var15 = 0;
+ if(var1.getBlockMaterial(var12 - 1, var4, var14).isSolid()) {
+ ++var15;
+ }
+
+ if(var1.getBlockMaterial(var12 + 1, var4, var14).isSolid()) {
+ ++var15;
+ }
+
+ if(var1.getBlockMaterial(var12, var4, var14 - 1).isSolid()) {
+ ++var15;
+ }
+
+ if(var1.getBlockMaterial(var12, var4, var14 + 1).isSolid()) {
+ ++var15;
+ }
+
+ if(var15 == 1) {
+ var1.setBlockWithNotify(var12, var4, var14, Block.chest.blockID);
+ TileEntityChest var16 = (TileEntityChest)var1.getBlockTileEntity(var12, var4, var14);
+ int var17 = 0;
+
+ while(true) {
+ if(var17 >= 8) {
+ continue label110;
+ }
+
+ ItemStack var18 = this.pickCheckLootItem(var2);
+ if(var18 != null) {
+ var16.setInventorySlotContents(var2.nextInt(var16.getSizeInventory()), var18);
+ }
+
+ ++var17;
+ }
+ }
+ }
+ }
+ }
+
+ var1.setBlockWithNotify(var3, var4, var5, Block.mobSpawner.blockID);
+ TileEntityMobSpawner var19 = (TileEntityMobSpawner)var1.getBlockTileEntity(var3, var4, var5);
+ var19.setMobID(this.pickMobSpawner(var2));
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private ItemStack pickCheckLootItem(Random var1) {
+ int var2 = var1.nextInt(11);
+ return var2 == 0 ? new ItemStack(Item.saddle) : (var2 == 1 ? new ItemStack(Item.ingotIron, var1.nextInt(4) + 1) : (var2 == 2 ? new ItemStack(Item.bread) : (var2 == 3 ? new ItemStack(Item.wheat, var1.nextInt(4) + 1) : (var2 == 4 ? new ItemStack(Item.gunpowder, var1.nextInt(4) + 1) : (var2 == 5 ? new ItemStack(Item.silk, var1.nextInt(4) + 1) : (var2 == 6 ? new ItemStack(Item.bucketEmpty) : (var2 == 7 && var1.nextInt(100) == 0 ? new ItemStack(Item.appleGold) : (var2 == 8 && var1.nextInt(2) == 0 ? new ItemStack(Item.redstone, var1.nextInt(4) + 1) : (var2 == 9 && var1.nextInt(10) == 0 ? new ItemStack(Item.itemsList[Item.record13.shiftedIndex + var1.nextInt(2)]) : (var2 == 10 ? new ItemStack(Item.dyePowder, 1, 3) : null))))))))));
+ }
+
+ private String pickMobSpawner(Random var1) {
+ int var2 = var1.nextInt(4);
+ return var2 == 0 ? "Skeleton" : (var2 == 1 ? "Zombie" : (var2 == 2 ? "Zombie" : (var2 == 3 ? "Spider" : "")));
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenFire.java b/src/net/minecraft/src/WorldGenFire.java
new file mode 100644
index 0000000..e037ecd
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenFire.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenFire extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 64; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.isAirBlock(var7, var8, var9) && var1.getBlockId(var7, var8 - 1, var9) == Block.bloodStone.blockID) {
+ var1.setBlockWithNotify(var7, var8, var9, Block.fire.blockID);
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenFlowers.java b/src/net/minecraft/src/WorldGenFlowers.java
new file mode 100644
index 0000000..199050b
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenFlowers.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenFlowers extends WorldGenerator {
+ private int plantBlockId;
+
+ public WorldGenFlowers(int var1) {
+ this.plantBlockId = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 64; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.isAirBlock(var7, var8, var9) && ((BlockFlower)Block.blocksList[this.plantBlockId]).canBlockStay(var1, var7, var8, var9)) {
+ var1.setBlock(var7, var8, var9, this.plantBlockId);
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenForest.java b/src/net/minecraft/src/WorldGenForest.java
new file mode 100644
index 0000000..844b2c3
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenForest.java
@@ -0,0 +1,78 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenForest extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ int var6 = var2.nextInt(3) + 5;
+ boolean var7 = true;
+ if(var4 >= 1 && var4 + var6 + 1 <= 128) {
+ int var8;
+ int var10;
+ int var11;
+ int var12;
+ for(var8 = var4; var8 <= var4 + 1 + var6; ++var8) {
+ byte var9 = 1;
+ if(var8 == var4) {
+ var9 = 0;
+ }
+
+ if(var8 >= var4 + 1 + var6 - 2) {
+ var9 = 2;
+ }
+
+ for(var10 = var3 - var9; var10 <= var3 + var9 && var7; ++var10) {
+ for(var11 = var5 - var9; var11 <= var5 + var9 && var7; ++var11) {
+ if(var8 >= 0 && var8 < 128) {
+ var12 = var1.getBlockId(var10, var8, var11);
+ if(var12 != 0 && var12 != Block.leaves.blockID) {
+ var7 = false;
+ }
+ } else {
+ var7 = false;
+ }
+ }
+ }
+ }
+
+ if(!var7) {
+ return false;
+ } else {
+ var8 = var1.getBlockId(var3, var4 - 1, var5);
+ if((var8 == Block.grass.blockID || var8 == Block.dirt.blockID) && var4 < 128 - var6 - 1) {
+ var1.setBlock(var3, var4 - 1, var5, Block.dirt.blockID);
+
+ int var16;
+ for(var16 = var4 - 3 + var6; var16 <= var4 + var6; ++var16) {
+ var10 = var16 - (var4 + var6);
+ var11 = 1 - var10 / 2;
+
+ for(var12 = var3 - var11; var12 <= var3 + var11; ++var12) {
+ int var13 = var12 - var3;
+
+ for(int var14 = var5 - var11; var14 <= var5 + var11; ++var14) {
+ int var15 = var14 - var5;
+ if((Math.abs(var13) != var11 || Math.abs(var15) != var11 || var2.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[var1.getBlockId(var12, var16, var14)]) {
+ var1.setBlockAndMetadata(var12, var16, var14, Block.leaves.blockID, 2);
+ }
+ }
+ }
+ }
+
+ for(var16 = 0; var16 < var6; ++var16) {
+ var10 = var1.getBlockId(var3, var4 + var16, var5);
+ if(var10 == 0 || var10 == Block.leaves.blockID) {
+ var1.setBlockAndMetadata(var3, var4 + var16, var5, Block.wood.blockID, 2);
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenGlowStone1.java b/src/net/minecraft/src/WorldGenGlowStone1.java
new file mode 100644
index 0000000..44e19c1
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenGlowStone1.java
@@ -0,0 +1,61 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenGlowStone1 extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(!var1.isAirBlock(var3, var4, var5)) {
+ return false;
+ } else if(var1.getBlockId(var3, var4 + 1, var5) != Block.bloodStone.blockID) {
+ return false;
+ } else {
+ var1.setBlockWithNotify(var3, var4, var5, Block.glowStone.blockID);
+
+ for(int var6 = 0; var6 < 1500; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 - var2.nextInt(12);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.getBlockId(var7, var8, var9) == 0) {
+ int var10 = 0;
+
+ for(int var11 = 0; var11 < 6; ++var11) {
+ int var12 = 0;
+ if(var11 == 0) {
+ var12 = var1.getBlockId(var7 - 1, var8, var9);
+ }
+
+ if(var11 == 1) {
+ var12 = var1.getBlockId(var7 + 1, var8, var9);
+ }
+
+ if(var11 == 2) {
+ var12 = var1.getBlockId(var7, var8 - 1, var9);
+ }
+
+ if(var11 == 3) {
+ var12 = var1.getBlockId(var7, var8 + 1, var9);
+ }
+
+ if(var11 == 4) {
+ var12 = var1.getBlockId(var7, var8, var9 - 1);
+ }
+
+ if(var11 == 5) {
+ var12 = var1.getBlockId(var7, var8, var9 + 1);
+ }
+
+ if(var12 == Block.glowStone.blockID) {
+ ++var10;
+ }
+ }
+
+ if(var10 == 1) {
+ var1.setBlockWithNotify(var7, var8, var9, Block.glowStone.blockID);
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenGlowStone2.java b/src/net/minecraft/src/WorldGenGlowStone2.java
new file mode 100644
index 0000000..ca70e0f
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenGlowStone2.java
@@ -0,0 +1,61 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenGlowStone2 extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(!var1.isAirBlock(var3, var4, var5)) {
+ return false;
+ } else if(var1.getBlockId(var3, var4 + 1, var5) != Block.bloodStone.blockID) {
+ return false;
+ } else {
+ var1.setBlockWithNotify(var3, var4, var5, Block.glowStone.blockID);
+
+ for(int var6 = 0; var6 < 1500; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 - var2.nextInt(12);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.getBlockId(var7, var8, var9) == 0) {
+ int var10 = 0;
+
+ for(int var11 = 0; var11 < 6; ++var11) {
+ int var12 = 0;
+ if(var11 == 0) {
+ var12 = var1.getBlockId(var7 - 1, var8, var9);
+ }
+
+ if(var11 == 1) {
+ var12 = var1.getBlockId(var7 + 1, var8, var9);
+ }
+
+ if(var11 == 2) {
+ var12 = var1.getBlockId(var7, var8 - 1, var9);
+ }
+
+ if(var11 == 3) {
+ var12 = var1.getBlockId(var7, var8 + 1, var9);
+ }
+
+ if(var11 == 4) {
+ var12 = var1.getBlockId(var7, var8, var9 - 1);
+ }
+
+ if(var11 == 5) {
+ var12 = var1.getBlockId(var7, var8, var9 + 1);
+ }
+
+ if(var12 == Block.glowStone.blockID) {
+ ++var10;
+ }
+ }
+
+ if(var10 == 1) {
+ var1.setBlockWithNotify(var7, var8, var9, Block.glowStone.blockID);
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenHellLava.java b/src/net/minecraft/src/WorldGenHellLava.java
new file mode 100644
index 0000000..4646bea
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenHellLava.java
@@ -0,0 +1,70 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenHellLava extends WorldGenerator {
+ private int field_4250_a;
+
+ public WorldGenHellLava(int var1) {
+ this.field_4250_a = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(var1.getBlockId(var3, var4 + 1, var5) != Block.bloodStone.blockID) {
+ return false;
+ } else if(var1.getBlockId(var3, var4, var5) != 0 && var1.getBlockId(var3, var4, var5) != Block.bloodStone.blockID) {
+ return false;
+ } else {
+ int var6 = 0;
+ if(var1.getBlockId(var3 - 1, var4, var5) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3 + 1, var4, var5) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 - 1) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 + 1) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4 - 1, var5) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ int var7 = 0;
+ if(var1.isAirBlock(var3 - 1, var4, var5)) {
+ ++var7;
+ }
+
+ if(var1.isAirBlock(var3 + 1, var4, var5)) {
+ ++var7;
+ }
+
+ if(var1.isAirBlock(var3, var4, var5 - 1)) {
+ ++var7;
+ }
+
+ if(var1.isAirBlock(var3, var4, var5 + 1)) {
+ ++var7;
+ }
+
+ if(var1.isAirBlock(var3, var4 - 1, var5)) {
+ ++var7;
+ }
+
+ if(var6 == 4 && var7 == 1) {
+ var1.setBlockWithNotify(var3, var4, var5, this.field_4250_a);
+ var1.scheduledUpdatesAreImmediate = true;
+ Block.blocksList[this.field_4250_a].updateTick(var1, var3, var4, var5, var2);
+ var1.scheduledUpdatesAreImmediate = false;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenLakes.java b/src/net/minecraft/src/WorldGenLakes.java
new file mode 100644
index 0000000..1cf6123
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenLakes.java
@@ -0,0 +1,102 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenLakes extends WorldGenerator {
+ private int field_15005_a;
+
+ public WorldGenLakes(int var1) {
+ this.field_15005_a = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ var3 -= 8;
+
+ for(var5 -= 8; var4 > 0 && var1.isAirBlock(var3, var4, var5); --var4) {
+ }
+
+ var4 -= 4;
+ boolean[] var6 = new boolean[2048];
+ int var7 = var2.nextInt(4) + 4;
+
+ int var8;
+ for(var8 = 0; var8 < var7; ++var8) {
+ double var9 = var2.nextDouble() * 6.0D + 3.0D;
+ double var11 = var2.nextDouble() * 4.0D + 2.0D;
+ double var13 = var2.nextDouble() * 6.0D + 3.0D;
+ double var15 = var2.nextDouble() * (16.0D - var9 - 2.0D) + 1.0D + var9 / 2.0D;
+ double var17 = var2.nextDouble() * (8.0D - var11 - 4.0D) + 2.0D + var11 / 2.0D;
+ double var19 = var2.nextDouble() * (16.0D - var13 - 2.0D) + 1.0D + var13 / 2.0D;
+
+ for(int var21 = 1; var21 < 15; ++var21) {
+ for(int var22 = 1; var22 < 15; ++var22) {
+ for(int var23 = 1; var23 < 7; ++var23) {
+ double var24 = ((double)var21 - var15) / (var9 / 2.0D);
+ double var26 = ((double)var23 - var17) / (var11 / 2.0D);
+ double var28 = ((double)var22 - var19) / (var13 / 2.0D);
+ double var30 = var24 * var24 + var26 * var26 + var28 * var28;
+ if(var30 < 1.0D) {
+ var6[(var21 * 16 + var22) * 8 + var23] = true;
+ }
+ }
+ }
+ }
+ }
+
+ int var10;
+ int var32;
+ boolean var33;
+ for(var8 = 0; var8 < 16; ++var8) {
+ for(var32 = 0; var32 < 16; ++var32) {
+ for(var10 = 0; var10 < 8; ++var10) {
+ var33 = !var6[(var8 * 16 + var32) * 8 + var10] && (var8 < 15 && var6[((var8 + 1) * 16 + var32) * 8 + var10] || var8 > 0 && var6[((var8 - 1) * 16 + var32) * 8 + var10] || var32 < 15 && var6[(var8 * 16 + var32 + 1) * 8 + var10] || var32 > 0 && var6[(var8 * 16 + (var32 - 1)) * 8 + var10] || var10 < 7 && var6[(var8 * 16 + var32) * 8 + var10 + 1] || var10 > 0 && var6[(var8 * 16 + var32) * 8 + (var10 - 1)]);
+ if(var33) {
+ Material var12 = var1.getBlockMaterial(var3 + var8, var4 + var10, var5 + var32);
+ if(var10 >= 4 && var12.getIsLiquid()) {
+ return false;
+ }
+
+ if(var10 < 4 && !var12.isSolid() && var1.getBlockId(var3 + var8, var4 + var10, var5 + var32) != this.field_15005_a) {
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ for(var8 = 0; var8 < 16; ++var8) {
+ for(var32 = 0; var32 < 16; ++var32) {
+ for(var10 = 0; var10 < 8; ++var10) {
+ if(var6[(var8 * 16 + var32) * 8 + var10]) {
+ var1.setBlock(var3 + var8, var4 + var10, var5 + var32, var10 >= 4 ? 0 : this.field_15005_a);
+ }
+ }
+ }
+ }
+
+ for(var8 = 0; var8 < 16; ++var8) {
+ for(var32 = 0; var32 < 16; ++var32) {
+ for(var10 = 4; var10 < 8; ++var10) {
+ if(var6[(var8 * 16 + var32) * 8 + var10] && var1.getBlockId(var3 + var8, var4 + var10 - 1, var5 + var32) == Block.dirt.blockID && var1.getSavedLightValue(EnumSkyBlock.Sky, var3 + var8, var4 + var10, var5 + var32) > 0) {
+ var1.setBlock(var3 + var8, var4 + var10 - 1, var5 + var32, Block.grass.blockID);
+ }
+ }
+ }
+ }
+
+ if(Block.blocksList[this.field_15005_a].blockMaterial == Material.lava) {
+ for(var8 = 0; var8 < 16; ++var8) {
+ for(var32 = 0; var32 < 16; ++var32) {
+ for(var10 = 0; var10 < 8; ++var10) {
+ var33 = !var6[(var8 * 16 + var32) * 8 + var10] && (var8 < 15 && var6[((var8 + 1) * 16 + var32) * 8 + var10] || var8 > 0 && var6[((var8 - 1) * 16 + var32) * 8 + var10] || var32 < 15 && var6[(var8 * 16 + var32 + 1) * 8 + var10] || var32 > 0 && var6[(var8 * 16 + (var32 - 1)) * 8 + var10] || var10 < 7 && var6[(var8 * 16 + var32) * 8 + var10 + 1] || var10 > 0 && var6[(var8 * 16 + var32) * 8 + (var10 - 1)]);
+ if(var33 && (var10 < 4 || var2.nextInt(2) != 0) && var1.getBlockMaterial(var3 + var8, var4 + var10, var5 + var32).isSolid()) {
+ var1.setBlock(var3 + var8, var4 + var10, var5 + var32, Block.stone.blockID);
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenLiquids.java b/src/net/minecraft/src/WorldGenLiquids.java
new file mode 100644
index 0000000..05c797f
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenLiquids.java
@@ -0,0 +1,64 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenLiquids extends WorldGenerator {
+ private int liquidBlockId;
+
+ public WorldGenLiquids(int var1) {
+ this.liquidBlockId = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(var1.getBlockId(var3, var4 + 1, var5) != Block.stone.blockID) {
+ return false;
+ } else if(var1.getBlockId(var3, var4 - 1, var5) != Block.stone.blockID) {
+ return false;
+ } else if(var1.getBlockId(var3, var4, var5) != 0 && var1.getBlockId(var3, var4, var5) != Block.stone.blockID) {
+ return false;
+ } else {
+ int var6 = 0;
+ if(var1.getBlockId(var3 - 1, var4, var5) == Block.stone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3 + 1, var4, var5) == Block.stone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 - 1) == Block.stone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 + 1) == Block.stone.blockID) {
+ ++var6;
+ }
+
+ int var7 = 0;
+ if(var1.isAirBlock(var3 - 1, var4, var5)) {
+ ++var7;
+ }
+
+ if(var1.isAirBlock(var3 + 1, var4, var5)) {
+ ++var7;
+ }
+
+ if(var1.isAirBlock(var3, var4, var5 - 1)) {
+ ++var7;
+ }
+
+ if(var1.isAirBlock(var3, var4, var5 + 1)) {
+ ++var7;
+ }
+
+ if(var6 == 3 && var7 == 1) {
+ var1.setBlockWithNotify(var3, var4, var5, this.liquidBlockId);
+ var1.scheduledUpdatesAreImmediate = true;
+ Block.blocksList[this.liquidBlockId].updateTick(var1, var3, var4, var5, var2);
+ var1.scheduledUpdatesAreImmediate = false;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenMinable.java b/src/net/minecraft/src/WorldGenMinable.java
new file mode 100644
index 0000000..ef0ef94
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenMinable.java
@@ -0,0 +1,57 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenMinable extends WorldGenerator {
+ private int minableBlockId;
+ private int numberOfBlocks;
+
+ public WorldGenMinable(int var1, int var2) {
+ this.minableBlockId = var1;
+ this.numberOfBlocks = var2;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ float var6 = var2.nextFloat() * (float)Math.PI;
+ double var7 = (double)((float)(var3 + 8) + MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var9 = (double)((float)(var3 + 8) - MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var11 = (double)((float)(var5 + 8) + MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var13 = (double)((float)(var5 + 8) - MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var15 = (double)(var4 + var2.nextInt(3) + 2);
+ double var17 = (double)(var4 + var2.nextInt(3) + 2);
+
+ for(int var19 = 0; var19 <= this.numberOfBlocks; ++var19) {
+ double var20 = var7 + (var9 - var7) * (double)var19 / (double)this.numberOfBlocks;
+ double var22 = var15 + (var17 - var15) * (double)var19 / (double)this.numberOfBlocks;
+ double var24 = var11 + (var13 - var11) * (double)var19 / (double)this.numberOfBlocks;
+ double var26 = var2.nextDouble() * (double)this.numberOfBlocks / 16.0D;
+ double var28 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
+ double var30 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
+ int var32 = MathHelper.floor_double(var20 - var28 / 2.0D);
+ int var33 = MathHelper.floor_double(var22 - var30 / 2.0D);
+ int var34 = MathHelper.floor_double(var24 - var28 / 2.0D);
+ int var35 = MathHelper.floor_double(var20 + var28 / 2.0D);
+ int var36 = MathHelper.floor_double(var22 + var30 / 2.0D);
+ int var37 = MathHelper.floor_double(var24 + var28 / 2.0D);
+
+ for(int var38 = var32; var38 <= var35; ++var38) {
+ double var39 = ((double)var38 + 0.5D - var20) / (var28 / 2.0D);
+ if(var39 * var39 < 1.0D) {
+ for(int var41 = var33; var41 <= var36; ++var41) {
+ double var42 = ((double)var41 + 0.5D - var22) / (var30 / 2.0D);
+ if(var39 * var39 + var42 * var42 < 1.0D) {
+ for(int var44 = var34; var44 <= var37; ++var44) {
+ double var45 = ((double)var44 + 0.5D - var24) / (var28 / 2.0D);
+ if(var39 * var39 + var42 * var42 + var45 * var45 < 1.0D && var1.getBlockId(var38, var41, var44) == Block.stone.blockID) {
+ var1.setBlock(var38, var41, var44, this.minableBlockId);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenPumpkin.java b/src/net/minecraft/src/WorldGenPumpkin.java
new file mode 100644
index 0000000..5353a73
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenPumpkin.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenPumpkin extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 64; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.isAirBlock(var7, var8, var9) && var1.getBlockId(var7, var8 - 1, var9) == Block.grass.blockID && Block.pumpkin.canPlaceBlockAt(var1, var7, var8, var9)) {
+ var1.setBlockAndMetadata(var7, var8, var9, Block.pumpkin.blockID, var2.nextInt(4));
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenReed.java b/src/net/minecraft/src/WorldGenReed.java
new file mode 100644
index 0000000..c87d951
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenReed.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenReed extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 20; ++var6) {
+ int var7 = var3 + var2.nextInt(4) - var2.nextInt(4);
+ int var8 = var4;
+ int var9 = var5 + var2.nextInt(4) - var2.nextInt(4);
+ if(var1.isAirBlock(var7, var4, var9) && (var1.getBlockMaterial(var7 - 1, var4 - 1, var9) == Material.water || var1.getBlockMaterial(var7 + 1, var4 - 1, var9) == Material.water || var1.getBlockMaterial(var7, var4 - 1, var9 - 1) == Material.water || var1.getBlockMaterial(var7, var4 - 1, var9 + 1) == Material.water)) {
+ int var10 = 2 + var2.nextInt(var2.nextInt(3) + 1);
+
+ for(int var11 = 0; var11 < var10; ++var11) {
+ if(Block.reed.canBlockStay(var1, var7, var8 + var11, var9)) {
+ var1.setBlock(var7, var8 + var11, var9, Block.reed.blockID);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenTaiga1.java b/src/net/minecraft/src/WorldGenTaiga1.java
new file mode 100644
index 0000000..0956a9f
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenTaiga1.java
@@ -0,0 +1,83 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenTaiga1 extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ int var6 = var2.nextInt(5) + 7;
+ int var7 = var6 - var2.nextInt(2) - 3;
+ int var8 = var6 - var7;
+ int var9 = 1 + var2.nextInt(var8 + 1);
+ boolean var10 = true;
+ if(var4 >= 1 && var4 + var6 + 1 <= 128) {
+ int var11;
+ int var13;
+ int var14;
+ int var15;
+ int var18;
+ for(var11 = var4; var11 <= var4 + 1 + var6 && var10; ++var11) {
+ boolean var12 = true;
+ if(var11 - var4 < var7) {
+ var18 = 0;
+ } else {
+ var18 = var9;
+ }
+
+ for(var13 = var3 - var18; var13 <= var3 + var18 && var10; ++var13) {
+ for(var14 = var5 - var18; var14 <= var5 + var18 && var10; ++var14) {
+ if(var11 >= 0 && var11 < 128) {
+ var15 = var1.getBlockId(var13, var11, var14);
+ if(var15 != 0 && var15 != Block.leaves.blockID) {
+ var10 = false;
+ }
+ } else {
+ var10 = false;
+ }
+ }
+ }
+ }
+
+ if(!var10) {
+ return false;
+ } else {
+ var11 = var1.getBlockId(var3, var4 - 1, var5);
+ if((var11 == Block.grass.blockID || var11 == Block.dirt.blockID) && var4 < 128 - var6 - 1) {
+ var1.setBlock(var3, var4 - 1, var5, Block.dirt.blockID);
+ var18 = 0;
+
+ for(var13 = var4 + var6; var13 >= var4 + var7; --var13) {
+ for(var14 = var3 - var18; var14 <= var3 + var18; ++var14) {
+ var15 = var14 - var3;
+
+ for(int var16 = var5 - var18; var16 <= var5 + var18; ++var16) {
+ int var17 = var16 - var5;
+ if((Math.abs(var15) != var18 || Math.abs(var17) != var18 || var18 <= 0) && !Block.opaqueCubeLookup[var1.getBlockId(var14, var13, var16)]) {
+ var1.setBlockAndMetadata(var14, var13, var16, Block.leaves.blockID, 1);
+ }
+ }
+ }
+
+ if(var18 >= 1 && var13 == var4 + var7 + 1) {
+ --var18;
+ } else if(var18 < var9) {
+ ++var18;
+ }
+ }
+
+ for(var13 = 0; var13 < var6 - 1; ++var13) {
+ var14 = var1.getBlockId(var3, var4 + var13, var5);
+ if(var14 == 0 || var14 == Block.leaves.blockID) {
+ var1.setBlockAndMetadata(var3, var4 + var13, var5, Block.wood.blockID, 1);
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenTaiga2.java b/src/net/minecraft/src/WorldGenTaiga2.java
new file mode 100644
index 0000000..2294b74
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenTaiga2.java
@@ -0,0 +1,95 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenTaiga2 extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ int var6 = var2.nextInt(4) + 6;
+ int var7 = 1 + var2.nextInt(2);
+ int var8 = var6 - var7;
+ int var9 = 2 + var2.nextInt(2);
+ boolean var10 = true;
+ if(var4 >= 1 && var4 + var6 + 1 <= 128) {
+ int var11;
+ int var13;
+ int var15;
+ int var21;
+ for(var11 = var4; var11 <= var4 + 1 + var6 && var10; ++var11) {
+ boolean var12 = true;
+ if(var11 - var4 < var7) {
+ var21 = 0;
+ } else {
+ var21 = var9;
+ }
+
+ for(var13 = var3 - var21; var13 <= var3 + var21 && var10; ++var13) {
+ for(int var14 = var5 - var21; var14 <= var5 + var21 && var10; ++var14) {
+ if(var11 >= 0 && var11 < 128) {
+ var15 = var1.getBlockId(var13, var11, var14);
+ if(var15 != 0 && var15 != Block.leaves.blockID) {
+ var10 = false;
+ }
+ } else {
+ var10 = false;
+ }
+ }
+ }
+ }
+
+ if(!var10) {
+ return false;
+ } else {
+ var11 = var1.getBlockId(var3, var4 - 1, var5);
+ if((var11 == Block.grass.blockID || var11 == Block.dirt.blockID) && var4 < 128 - var6 - 1) {
+ var1.setBlock(var3, var4 - 1, var5, Block.dirt.blockID);
+ var21 = var2.nextInt(2);
+ var13 = 1;
+ byte var22 = 0;
+
+ int var16;
+ int var17;
+ for(var15 = 0; var15 <= var8; ++var15) {
+ var16 = var4 + var6 - var15;
+
+ for(var17 = var3 - var21; var17 <= var3 + var21; ++var17) {
+ int var18 = var17 - var3;
+
+ for(int var19 = var5 - var21; var19 <= var5 + var21; ++var19) {
+ int var20 = var19 - var5;
+ if((Math.abs(var18) != var21 || Math.abs(var20) != var21 || var21 <= 0) && !Block.opaqueCubeLookup[var1.getBlockId(var17, var16, var19)]) {
+ var1.setBlockAndMetadata(var17, var16, var19, Block.leaves.blockID, 1);
+ }
+ }
+ }
+
+ if(var21 >= var13) {
+ var21 = var22;
+ var22 = 1;
+ ++var13;
+ if(var13 > var9) {
+ var13 = var9;
+ }
+ } else {
+ ++var21;
+ }
+ }
+
+ var15 = var2.nextInt(3);
+
+ for(var16 = 0; var16 < var6 - var15; ++var16) {
+ var17 = var1.getBlockId(var3, var4 + var16, var5);
+ if(var17 == 0 || var17 == Block.leaves.blockID) {
+ var1.setBlockAndMetadata(var3, var4 + var16, var5, Block.wood.blockID, 1);
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenTallGrass.java b/src/net/minecraft/src/WorldGenTallGrass.java
new file mode 100644
index 0000000..89216a5
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenTallGrass.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenTallGrass extends WorldGenerator {
+ private int field_28057_a;
+ private int field_28056_b;
+
+ public WorldGenTallGrass(int var1, int var2) {
+ this.field_28057_a = var1;
+ this.field_28056_b = var2;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ boolean var6 = false;
+
+ while(true) {
+ int var11 = var1.getBlockId(var3, var4, var5);
+ if(var11 != 0 && var11 != Block.leaves.blockID || var4 <= 0) {
+ for(int var7 = 0; var7 < 128; ++var7) {
+ int var8 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var9 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var10 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.isAirBlock(var8, var9, var10) && ((BlockFlower)Block.blocksList[this.field_28057_a]).canBlockStay(var1, var8, var9, var10)) {
+ var1.setBlockAndMetadata(var8, var9, var10, this.field_28057_a, this.field_28056_b);
+ }
+ }
+
+ return true;
+ }
+
+ --var4;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenTrees.java b/src/net/minecraft/src/WorldGenTrees.java
new file mode 100644
index 0000000..631e379
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenTrees.java
@@ -0,0 +1,78 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenTrees extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ int var6 = var2.nextInt(3) + 4;
+ boolean var7 = true;
+ if(var4 >= 1 && var4 + var6 + 1 <= 128) {
+ int var8;
+ int var10;
+ int var11;
+ int var12;
+ for(var8 = var4; var8 <= var4 + 1 + var6; ++var8) {
+ byte var9 = 1;
+ if(var8 == var4) {
+ var9 = 0;
+ }
+
+ if(var8 >= var4 + 1 + var6 - 2) {
+ var9 = 2;
+ }
+
+ for(var10 = var3 - var9; var10 <= var3 + var9 && var7; ++var10) {
+ for(var11 = var5 - var9; var11 <= var5 + var9 && var7; ++var11) {
+ if(var8 >= 0 && var8 < 128) {
+ var12 = var1.getBlockId(var10, var8, var11);
+ if(var12 != 0 && var12 != Block.leaves.blockID) {
+ var7 = false;
+ }
+ } else {
+ var7 = false;
+ }
+ }
+ }
+ }
+
+ if(!var7) {
+ return false;
+ } else {
+ var8 = var1.getBlockId(var3, var4 - 1, var5);
+ if((var8 == Block.grass.blockID || var8 == Block.dirt.blockID) && var4 < 128 - var6 - 1) {
+ var1.setBlock(var3, var4 - 1, var5, Block.dirt.blockID);
+
+ int var16;
+ for(var16 = var4 - 3 + var6; var16 <= var4 + var6; ++var16) {
+ var10 = var16 - (var4 + var6);
+ var11 = 1 - var10 / 2;
+
+ for(var12 = var3 - var11; var12 <= var3 + var11; ++var12) {
+ int var13 = var12 - var3;
+
+ for(int var14 = var5 - var11; var14 <= var5 + var11; ++var14) {
+ int var15 = var14 - var5;
+ if((Math.abs(var13) != var11 || Math.abs(var15) != var11 || var2.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[var1.getBlockId(var12, var16, var14)]) {
+ var1.setBlock(var12, var16, var14, Block.leaves.blockID);
+ }
+ }
+ }
+ }
+
+ for(var16 = 0; var16 < var6; ++var16) {
+ var10 = var1.getBlockId(var3, var4 + var16, var5);
+ if(var10 == 0 || var10 == Block.leaves.blockID) {
+ var1.setBlock(var3, var4 + var16, var5, Block.wood.blockID);
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/net/minecraft/src/WorldGenerator.java b/src/net/minecraft/src/WorldGenerator.java
new file mode 100644
index 0000000..afbcdc8
--- /dev/null
+++ b/src/net/minecraft/src/WorldGenerator.java
@@ -0,0 +1,10 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public abstract class WorldGenerator {
+ public abstract boolean generate(World var1, Random var2, int var3, int var4, int var5);
+
+ public void func_420_a(double var1, double var3, double var5) {
+ }
+}
diff --git a/src/net/minecraft/src/WorldInfo.java b/src/net/minecraft/src/WorldInfo.java
new file mode 100644
index 0000000..74fcd15
--- /dev/null
+++ b/src/net/minecraft/src/WorldInfo.java
@@ -0,0 +1,194 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class WorldInfo {
+ private long randomSeed;
+ private int spawnX;
+ private int spawnY;
+ private int spawnZ;
+ private long worldTime;
+ private long lastTimePlayed;
+ private long sizeOnDisk;
+ private NBTTagCompound field_22195_h;
+ private int field_22194_i;
+ private String levelName;
+ private int saveVersion;
+ private boolean isRaining;
+ private int rainTime;
+ private boolean isThundering;
+ private int thunderTime;
+
+ public WorldInfo(NBTTagCompound var1) {
+ this.randomSeed = var1.getLong("RandomSeed");
+ this.spawnX = var1.getInteger("SpawnX");
+ this.spawnY = var1.getInteger("SpawnY");
+ this.spawnZ = var1.getInteger("SpawnZ");
+ this.worldTime = var1.getLong("Time");
+ this.lastTimePlayed = var1.getLong("LastPlayed");
+ this.sizeOnDisk = var1.getLong("SizeOnDisk");
+ this.levelName = var1.getString("LevelName");
+ this.saveVersion = var1.getInteger("version");
+ this.rainTime = var1.getInteger("rainTime");
+ this.isRaining = var1.getBoolean("raining");
+ this.thunderTime = var1.getInteger("thunderTime");
+ this.isThundering = var1.getBoolean("thundering");
+ if(var1.hasKey("Player")) {
+ this.field_22195_h = var1.getCompoundTag("Player");
+ this.field_22194_i = this.field_22195_h.getInteger("Dimension");
+ }
+
+ }
+
+ public WorldInfo(long var1, String var3) {
+ this.randomSeed = var1;
+ this.levelName = var3;
+ }
+
+ public WorldInfo(WorldInfo var1) {
+ this.randomSeed = var1.randomSeed;
+ this.spawnX = var1.spawnX;
+ this.spawnY = var1.spawnY;
+ this.spawnZ = var1.spawnZ;
+ this.worldTime = var1.worldTime;
+ this.lastTimePlayed = var1.lastTimePlayed;
+ this.sizeOnDisk = var1.sizeOnDisk;
+ this.field_22195_h = var1.field_22195_h;
+ this.field_22194_i = var1.field_22194_i;
+ this.levelName = var1.levelName;
+ this.saveVersion = var1.saveVersion;
+ this.rainTime = var1.rainTime;
+ this.isRaining = var1.isRaining;
+ this.thunderTime = var1.thunderTime;
+ this.isThundering = var1.isThundering;
+ }
+
+ public NBTTagCompound func_22185_a() {
+ NBTTagCompound var1 = new NBTTagCompound();
+ this.saveNBTTag(var1, this.field_22195_h);
+ return var1;
+ }
+
+ public NBTTagCompound func_22183_a(List var1) {
+ NBTTagCompound var2 = new NBTTagCompound();
+ EntityPlayer var3 = null;
+ NBTTagCompound var4 = null;
+ if(var1.size() > 0) {
+ var3 = (EntityPlayer)var1.get(0);
+ }
+
+ if(var3 != null) {
+ var4 = new NBTTagCompound();
+ var3.writeToNBT(var4);
+ }
+
+ this.saveNBTTag(var2, var4);
+ return var2;
+ }
+
+ private void saveNBTTag(NBTTagCompound var1, NBTTagCompound var2) {
+ var1.setLong("RandomSeed", this.randomSeed);
+ var1.setInteger("SpawnX", this.spawnX);
+ var1.setInteger("SpawnY", this.spawnY);
+ var1.setInteger("SpawnZ", this.spawnZ);
+ var1.setLong("Time", this.worldTime);
+ var1.setLong("SizeOnDisk", this.sizeOnDisk);
+ var1.setLong("LastPlayed", System.currentTimeMillis());
+ var1.setString("LevelName", this.levelName);
+ var1.setInteger("version", this.saveVersion);
+ var1.setInteger("rainTime", this.rainTime);
+ var1.setBoolean("raining", this.isRaining);
+ var1.setInteger("thunderTime", this.thunderTime);
+ var1.setBoolean("thundering", this.isThundering);
+ if(var2 != null) {
+ var1.setCompoundTag("Player", var2);
+ }
+
+ }
+
+ public long getRandomSeed() {
+ return this.randomSeed;
+ }
+
+ public int getSpawnX() {
+ return this.spawnX;
+ }
+
+ public int getSpawnY() {
+ return this.spawnY;
+ }
+
+ public int getSpawnZ() {
+ return this.spawnZ;
+ }
+
+ public long getWorldTime() {
+ return this.worldTime;
+ }
+
+ public long getSizeOnDisk() {
+ return this.sizeOnDisk;
+ }
+
+ public int getDimension() {
+ return this.field_22194_i;
+ }
+
+ public void setWorldTime(long var1) {
+ this.worldTime = var1;
+ }
+
+ public void setSizeOnDisk(long var1) {
+ this.sizeOnDisk = var1;
+ }
+
+ public void setSpawnPosition(int var1, int var2, int var3) {
+ this.spawnX = var1;
+ this.spawnY = var2;
+ this.spawnZ = var3;
+ }
+
+ public void setLevelName(String var1) {
+ this.levelName = var1;
+ }
+
+ public int getVersion() {
+ return this.saveVersion;
+ }
+
+ public void setVersion(int var1) {
+ this.saveVersion = var1;
+ }
+
+ public boolean getIsThundering() {
+ return this.isThundering;
+ }
+
+ public void setIsThundering(boolean var1) {
+ this.isThundering = var1;
+ }
+
+ public int getThunderTime() {
+ return this.thunderTime;
+ }
+
+ public void setThunderTime(int var1) {
+ this.thunderTime = var1;
+ }
+
+ public boolean getIsRaining() {
+ return this.isRaining;
+ }
+
+ public void setIsRaining(boolean var1) {
+ this.isRaining = var1;
+ }
+
+ public int getRainTime() {
+ return this.rainTime;
+ }
+
+ public void setRainTime(int var1) {
+ this.rainTime = var1;
+ }
+}
diff --git a/src/net/minecraft/src/WorldManager.java b/src/net/minecraft/src/WorldManager.java
new file mode 100644
index 0000000..623aaef
--- /dev/null
+++ b/src/net/minecraft/src/WorldManager.java
@@ -0,0 +1,48 @@
+package net.minecraft.src;
+
+import net.minecraft.server.MinecraftServer;
+
+public class WorldManager implements IWorldAccess {
+ private MinecraftServer mcServer;
+ private WorldServer field_28134_b;
+
+ public WorldManager(MinecraftServer var1, WorldServer var2) {
+ this.mcServer = var1;
+ this.field_28134_b = var2;
+ }
+
+ public void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ }
+
+ public void obtainEntitySkin(Entity var1) {
+ this.mcServer.getEntityTracker(this.field_28134_b.worldProvider.worldType).trackEntity(var1);
+ }
+
+ public void releaseEntitySkin(Entity var1) {
+ this.mcServer.getEntityTracker(this.field_28134_b.worldProvider.worldType).untrackEntity(var1);
+ }
+
+ public void playSound(String var1, double var2, double var4, double var6, float var8, float var9) {
+ }
+
+ public void markBlockRangeNeedsUpdate(int var1, int var2, int var3, int var4, int var5, int var6) {
+ }
+
+ public void updateAllRenderers() {
+ }
+
+ public void markBlockNeedsUpdate(int var1, int var2, int var3) {
+ this.mcServer.configManager.markBlockNeedsUpdate(var1, var2, var3, this.field_28134_b.worldProvider.worldType);
+ }
+
+ public void playRecord(String var1, int var2, int var3, int var4) {
+ }
+
+ public void doNothingWithTileEntity(int var1, int var2, int var3, TileEntity var4) {
+ this.mcServer.configManager.sentTileEntityToPlayer(var1, var2, var3, var4);
+ }
+
+ public void func_28133_a(EntityPlayer var1, int var2, int var3, int var4, int var5, int var6) {
+ this.mcServer.configManager.func_28171_a(var1, (double)var3, (double)var4, (double)var5, 64.0D, this.field_28134_b.worldProvider.worldType, new Packet61DoorChange(var2, var3, var4, var5, var6));
+ }
+}
diff --git a/src/net/minecraft/src/WorldProvider.java b/src/net/minecraft/src/WorldProvider.java
new file mode 100644
index 0000000..ef899b7
--- /dev/null
+++ b/src/net/minecraft/src/WorldProvider.java
@@ -0,0 +1,66 @@
+package net.minecraft.src;
+
+public abstract class WorldProvider {
+ public World worldObj;
+ public WorldChunkManager worldChunkMgr;
+ public boolean field_6167_c = false;
+ public boolean isHellWorld = false;
+ public boolean field_4306_c = false;
+ public float[] lightBrightnessTable = new float[16];
+ public int worldType = 0;
+ private float[] field_6164_h = new float[4];
+
+ public final void registerWorld(World var1) {
+ this.worldObj = var1;
+ this.registerWorldChunkManager();
+ this.generateLightBrightnessTable();
+ }
+
+ protected void generateLightBrightnessTable() {
+ float var1 = 0.05F;
+
+ for(int var2 = 0; var2 <= 15; ++var2) {
+ float var3 = 1.0F - (float)var2 / 15.0F;
+ this.lightBrightnessTable[var2] = (1.0F - var3) / (var3 * 3.0F + 1.0F) * (1.0F - var1) + var1;
+ }
+
+ }
+
+ protected void registerWorldChunkManager() {
+ this.worldChunkMgr = new WorldChunkManager(this.worldObj);
+ }
+
+ public IChunkProvider getChunkProvider() {
+ return new ChunkProviderGenerate(this.worldObj, this.worldObj.getRandomSeed());
+ }
+
+ public boolean canCoordinateBeSpawn(int var1, int var2) {
+ int var3 = this.worldObj.getFirstUncoveredBlock(var1, var2);
+ return var3 == Block.sand.blockID;
+ }
+
+ public float calculateCelestialAngle(long var1, float var3) {
+ int var4 = (int)(var1 % 24000L);
+ float var5 = ((float)var4 + var3) / 24000.0F - 0.25F;
+ if(var5 < 0.0F) {
+ ++var5;
+ }
+
+ if(var5 > 1.0F) {
+ --var5;
+ }
+
+ float var6 = var5;
+ var5 = 1.0F - (float)((Math.cos((double)var5 * Math.PI) + 1.0D) / 2.0D);
+ var5 = var6 + (var5 - var6) / 3.0F;
+ return var5;
+ }
+
+ public boolean func_28108_d() {
+ return true;
+ }
+
+ public static WorldProvider func_4091_a(int var0) {
+ return (WorldProvider)(var0 == -1 ? new WorldProviderHell() : (var0 == 0 ? new WorldProviderSurface() : (var0 == 1 ? new WorldProviderSky() : null)));
+ }
+}
diff --git a/src/net/minecraft/src/WorldProviderHell.java b/src/net/minecraft/src/WorldProviderHell.java
new file mode 100644
index 0000000..4bdd8dc
--- /dev/null
+++ b/src/net/minecraft/src/WorldProviderHell.java
@@ -0,0 +1,38 @@
+package net.minecraft.src;
+
+public class WorldProviderHell extends WorldProvider {
+ public void registerWorldChunkManager() {
+ this.worldChunkMgr = new WorldChunkManagerHell(BiomeGenBase.hell, 1.0D, 0.0D);
+ this.field_6167_c = true;
+ this.isHellWorld = true;
+ this.field_4306_c = true;
+ this.worldType = -1;
+ }
+
+ protected void generateLightBrightnessTable() {
+ float var1 = 0.1F;
+
+ for(int var2 = 0; var2 <= 15; ++var2) {
+ float var3 = 1.0F - (float)var2 / 15.0F;
+ this.lightBrightnessTable[var2] = (1.0F - var3) / (var3 * 3.0F + 1.0F) * (1.0F - var1) + var1;
+ }
+
+ }
+
+ public IChunkProvider getChunkProvider() {
+ return new ChunkProviderHell(this.worldObj, this.worldObj.getRandomSeed());
+ }
+
+ public boolean canCoordinateBeSpawn(int var1, int var2) {
+ int var3 = this.worldObj.getFirstUncoveredBlock(var1, var2);
+ return var3 == Block.bedrock.blockID ? false : (var3 == 0 ? false : Block.opaqueCubeLookup[var3]);
+ }
+
+ public float calculateCelestialAngle(long var1, float var3) {
+ return 0.5F;
+ }
+
+ public boolean func_28108_d() {
+ return false;
+ }
+}
diff --git a/src/net/minecraft/src/WorldProviderSky.java b/src/net/minecraft/src/WorldProviderSky.java
new file mode 100644
index 0000000..fc21ebf
--- /dev/null
+++ b/src/net/minecraft/src/WorldProviderSky.java
@@ -0,0 +1,21 @@
+package net.minecraft.src;
+
+public class WorldProviderSky extends WorldProvider {
+ public void registerWorldChunkManager() {
+ this.worldChunkMgr = new WorldChunkManagerHell(BiomeGenBase.field_28054_m, 0.5D, 0.0D);
+ this.worldType = 1;
+ }
+
+ public IChunkProvider getChunkProvider() {
+ return new ChunkProviderSky(this.worldObj, this.worldObj.getRandomSeed());
+ }
+
+ public float calculateCelestialAngle(long var1, float var3) {
+ return 0.0F;
+ }
+
+ public boolean canCoordinateBeSpawn(int var1, int var2) {
+ int var3 = this.worldObj.getFirstUncoveredBlock(var1, var2);
+ return var3 == 0 ? false : Block.blocksList[var3].blockMaterial.getIsSolid();
+ }
+}
diff --git a/src/net/minecraft/src/WorldProviderSurface.java b/src/net/minecraft/src/WorldProviderSurface.java
new file mode 100644
index 0000000..29a566d
--- /dev/null
+++ b/src/net/minecraft/src/WorldProviderSurface.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public class WorldProviderSurface extends WorldProvider {
+}
diff --git a/src/net/minecraft/src/WorldServer.java b/src/net/minecraft/src/WorldServer.java
new file mode 100644
index 0000000..a6b7af6
--- /dev/null
+++ b/src/net/minecraft/src/WorldServer.java
@@ -0,0 +1,121 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+import net.minecraft.server.MinecraftServer;
+
+public class WorldServer extends World {
+ public ChunkProviderServer chunkProviderServer;
+ public boolean field_819_z = false;
+ public boolean levelSaving;
+ private MinecraftServer mcServer;
+ private MCHash field_20912_E = new MCHash();
+
+ public WorldServer(MinecraftServer var1, ISaveHandler var2, String var3, int var4, long var5) {
+ super(var2, var3, var5, WorldProvider.func_4091_a(var4));
+ this.mcServer = var1;
+ }
+
+ public void updateEntityWithOptionalForce(Entity var1, boolean var2) {
+ if(!this.mcServer.spawnPeacefulMobs && (var1 instanceof EntityAnimal || var1 instanceof EntityWaterMob)) {
+ var1.setEntityDead();
+ }
+
+ if(var1.riddenByEntity == null || !(var1.riddenByEntity instanceof EntityPlayer)) {
+ super.updateEntityWithOptionalForce(var1, var2);
+ }
+
+ }
+
+ public void func_12017_b(Entity var1, boolean var2) {
+ super.updateEntityWithOptionalForce(var1, var2);
+ }
+
+ protected IChunkProvider getChunkProvider() {
+ IChunkLoader var1 = this.worldFile.func_22092_a(this.worldProvider);
+ this.chunkProviderServer = new ChunkProviderServer(this, var1, this.worldProvider.getChunkProvider());
+ return this.chunkProviderServer;
+ }
+
+ public List getTileEntityList(int var1, int var2, int var3, int var4, int var5, int var6) {
+ ArrayList var7 = new ArrayList();
+
+ for(int var8 = 0; var8 < this.loadedTileEntityList.size(); ++var8) {
+ TileEntity var9 = (TileEntity)this.loadedTileEntityList.get(var8);
+ if(var9.xCoord >= var1 && var9.yCoord >= var2 && var9.zCoord >= var3 && var9.xCoord < var4 && var9.yCoord < var5 && var9.zCoord < var6) {
+ var7.add(var9);
+ }
+ }
+
+ return var7;
+ }
+
+ public boolean canMineBlock(EntityPlayer var1, int var2, int var3, int var4) {
+ int var5 = (int)MathHelper.abs((float)(var2 - this.worldInfo.getSpawnX()));
+ int var6 = (int)MathHelper.abs((float)(var4 - this.worldInfo.getSpawnZ()));
+ if(var5 > var6) {
+ var6 = var5;
+ }
+
+ return var6 > 16 || this.mcServer.configManager.isOp(var1.username);
+ }
+
+ protected void obtainEntitySkin(Entity var1) {
+ super.obtainEntitySkin(var1);
+ this.field_20912_E.addKey(var1.entityId, var1);
+ }
+
+ protected void releaseEntitySkin(Entity var1) {
+ super.releaseEntitySkin(var1);
+ this.field_20912_E.removeObject(var1.entityId);
+ }
+
+ public Entity func_6158_a(int var1) {
+ return (Entity)this.field_20912_E.lookup(var1);
+ }
+
+ public boolean addLightningBolt(Entity var1) {
+ if(super.addLightningBolt(var1)) {
+ this.mcServer.configManager.sendPacketToPlayersAroundPoint(var1.posX, var1.posY, var1.posZ, 512.0D, this.worldProvider.worldType, new Packet71Weather(var1));
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void sendTrackedEntityStatusUpdatePacket(Entity var1, byte var2) {
+ Packet38EntityStatus var3 = new Packet38EntityStatus(var1.entityId, var2);
+ this.mcServer.getEntityTracker(this.worldProvider.worldType).sendPacketToTrackedPlayersAndTrackedEntity(var1, var3);
+ }
+
+ public Explosion newExplosion(Entity var1, double var2, double var4, double var6, float var8, boolean var9) {
+ Explosion var10 = new Explosion(this, var1, var2, var4, var6, var8);
+ var10.isFlaming = var9;
+ var10.doExplosion();
+ var10.doEffects(false);
+ this.mcServer.configManager.sendPacketToPlayersAroundPoint(var2, var4, var6, 64.0D, this.worldProvider.worldType, new Packet60Explosion(var2, var4, var6, var8, var10.destroyedBlockPositions));
+ return var10;
+ }
+
+ public void playNoteAt(int var1, int var2, int var3, int var4, int var5) {
+ super.playNoteAt(var1, var2, var3, var4, var5);
+ this.mcServer.configManager.sendPacketToPlayersAroundPoint((double)var1, (double)var2, (double)var3, 64.0D, this.worldProvider.worldType, new Packet54PlayNoteBlock(var1, var2, var3, var4, var5));
+ }
+
+ public void func_30006_w() {
+ this.worldFile.func_22093_e();
+ }
+
+ protected void updateWeather() {
+ boolean var1 = this.func_27068_v();
+ super.updateWeather();
+ if(var1 != this.func_27068_v()) {
+ if(var1) {
+ this.mcServer.configManager.sendPacketToAllPlayers(new Packet70Bed(2));
+ } else {
+ this.mcServer.configManager.sendPacketToAllPlayers(new Packet70Bed(1));
+ }
+ }
+
+ }
+}
diff --git a/src/net/minecraft/src/WorldServerMulti.java b/src/net/minecraft/src/WorldServerMulti.java
new file mode 100644
index 0000000..e4d699e
--- /dev/null
+++ b/src/net/minecraft/src/WorldServerMulti.java
@@ -0,0 +1,10 @@
+package net.minecraft.src;
+
+import net.minecraft.server.MinecraftServer;
+
+public class WorldServerMulti extends WorldServer {
+ public WorldServerMulti(MinecraftServer var1, ISaveHandler var2, String var3, int var4, long var5, WorldServer var7) {
+ super(var1, var2, var3, var4, var5);
+ this.field_28105_z = var7.field_28105_z;
+ }
+}