From c2d851cf2021b0387c2e9e8b0dcb90ca8ee837eb Mon Sep 17 00:00:00 2001 From: LexManos Date: Sat, 4 Aug 2012 00:00:31 -0700 Subject: [PATCH] Get rid of all old patches --- .gitignore | 1 + fml-src-2.2.106.176.zip | Bin 219568 -> 0 bytes .../net/minecraft/client/Minecraft.java.patch | 133 --- .../minecraft/src/AnvilChunkLoader.java.patch | 27 - .../minecraft/src/AnvilSaveHandler.java.patch | 20 - .../net/minecraft/src/Block.java.patch | 712 ------------- .../net/minecraft/src/BlockButton.java.patch | 90 -- .../net/minecraft/src/BlockChest.java.patch | 35 - .../minecraft/src/BlockContainer.java.patch | 26 - .../net/minecraft/src/BlockCrops.java.patch | 52 - .../net/minecraft/src/BlockDoor.java.patch | 29 - .../net/minecraft/src/BlockFire.java.patch | 275 ----- .../net/minecraft/src/BlockLadder.java.patch | 79 -- .../net/minecraft/src/BlockLeaves.java.patch | 94 -- .../net/minecraft/src/BlockLever.java.patch | 100 -- .../net/minecraft/src/BlockLog.java.patch | 36 - .../minecraft/src/BlockNetherStalk.java.patch | 51 - .../minecraft/src/BlockPistonBase.java.patch | 11 - .../src/BlockPressurePlate.java.patch | 20 - .../net/minecraft/src/BlockRail.java.patch | 213 ---- .../src/BlockRedstoneRepeater.java.patch | 20 - .../src/BlockRedstoneWire.java.patch | 31 - .../net/minecraft/src/BlockSnow.java.patch | 54 - .../minecraft/src/BlockTallGrass.java.patch | 68 -- .../net/minecraft/src/BlockTorch.java.patch | 102 -- .../minecraft/src/BlockTrapDoor.java.patch | 53 - .../net/minecraft/src/BlockVine.java.patch | 51 - .../net/minecraft/src/Chunk.java.patch | 371 ------- .../minecraft/src/ChunkProvider.java.patch | 23 - .../src/ContainerCreative.java.patch | 29 - .../minecraft/src/ContainerFurnace.java.patch | 11 - .../minecraft/src/CraftingManager.java.patch | 11 - .../minecraft/src/EffectRenderer.java.patch | 149 --- .../net/minecraft/src/Enchantment.java.patch | 17 - .../src/EnchantmentHelper.java.patch | 11 - .../net/minecraft/src/Entity.java.patch | 98 -- .../minecraft/src/EntityEnderman.java.patch | 11 - .../net/minecraft/src/EntityItem.java.patch | 34 - .../net/minecraft/src/EntityLiving.java.patch | 150 --- .../minecraft/src/EntityMinecart.java.patch | 975 ------------------ .../minecraft/src/EntityMooshroom.java.patch | 78 -- .../net/minecraft/src/EntityOcelot.java.patch | 12 - .../net/minecraft/src/EntityPlayer.java.patch | 246 ----- .../minecraft/src/EntityRenderer.java.patch | 97 -- .../net/minecraft/src/EntitySheep.java.patch | 67 -- .../net/minecraft/src/Explosion.java.patch | 28 - .../minecraft/src/FurnaceRecipes.java.patch | 62 -- .../minecraft/src/GuiAchievements.java.patch | 108 -- .../net/minecraft/src/GuiControls.java.patch | 144 --- .../net/minecraft/src/GuiIngame.java.patch | 32 - .../net/minecraft/src/Item.java.patch | 234 ----- .../net/minecraft/src/ItemBlock.java.patch | 12 - .../net/minecraft/src/ItemBow.java.patch | 35 - .../net/minecraft/src/ItemBucket.java.patch | 23 - .../net/minecraft/src/ItemDye.java.patch | 70 -- .../net/minecraft/src/ItemHoe.java.patch | 22 - .../net/minecraft/src/ItemMap.java.patch | 20 - .../net/minecraft/src/ItemRenderer.java.patch | 99 -- .../net/minecraft/src/ItemShears.java.patch | 89 -- .../net/minecraft/src/ItemTool.java.patch | 36 - .../src/MovingObjectPosition.java.patch | 12 - .../minecraft/src/NetClientHandler.java.patch | 155 --- .../minecraft/src/NetworkManager.java.patch | 34 - .../src/Packet53BlockChange.java.patch | 51 - .../minecraft/src/PlayerController.java.patch | 27 - .../src/PlayerControllerCreative.java.patch | 28 - .../src/PlayerControllerMP.java.patch | 72 -- .../src/PlayerControllerSP.java.patch | 83 -- .../net/minecraft/src/RailLogic.java.patch | 89 -- .../net/minecraft/src/RenderBiped.java.patch | 37 - .../net/minecraft/src/RenderBlocks.java.patch | 140 --- .../net/minecraft/src/RenderEngine.java.patch | 36 - .../net/minecraft/src/RenderGlobal.java.patch | 73 -- .../net/minecraft/src/RenderItem.java.patch | 115 --- .../minecraft/src/RenderManager.java.patch | 21 - .../net/minecraft/src/RenderPlayer.java.patch | 73 -- .../minecraft/src/RenderSnowMan.java.patch | 31 - .../net/minecraft/src/SlotCrafting.java.patch | 20 - .../net/minecraft/src/SoundManager.java.patch | 108 -- .../net/minecraft/src/SoundPool.java.patch | 52 - .../minecraft/src/SpawnerAnimals.java.patch | 66 -- .../net/minecraft/src/StatList.java.patch | 14 - .../net/minecraft/src/Teleporter.java.patch | 41 - .../net/minecraft/src/Tessellator.java.patch | 219 ---- .../net/minecraft/src/TileEntity.java.patch | 32 - .../src/TileEntityBrewingStand.java.patch | 30 - .../src/TileEntityFurnace.java.patch | 96 -- .../src/TileEntityRendererPiston.java.patch | 28 - .../net/minecraft/src/World.java.patch | 380 ------- .../src/WorldGenBigMushroom.java.patch | 35 - .../minecraft/src/WorldGenDeadBush.java.patch | 22 - .../minecraft/src/WorldGenDungeons.java.patch | 23 - .../minecraft/src/WorldGenForest.java.patch | 36 - .../src/WorldGenHugeTrees.java.patch | 66 -- .../minecraft/src/WorldGenMinable.java.patch | 36 - .../minecraft/src/WorldGenShrub.java.patch | 33 - .../minecraft/src/WorldGenSwamp.java.patch | 44 - .../minecraft/src/WorldGenTaiga1.java.patch | 36 - .../minecraft/src/WorldGenTaiga2.java.patch | 35 - .../src/WorldGenTallGrass.java.patch | 22 - .../minecraft/src/WorldGenTrees.java.patch | 50 - .../minecraft/src/WorldProvider.java.patch | 56 - .../minecraft/src/WorldProviderEnd.java.patch | 25 - .../src/WorldProviderHell.java.patch | 31 - .../src/WorldProviderSurface.java.patch | 25 - .../minecraft/src/WorldRenderer.java.patch | 71 -- .../server/MinecraftServer.java.patch | 247 ----- .../minecraft/src/AnvilChunkLoader.java.patch | 27 - .../minecraft/src/AnvilSaveHandler.java.patch | 20 - .../net/minecraft/src/Block.java.patch | 695 ------------- .../net/minecraft/src/BlockButton.java.patch | 90 -- .../net/minecraft/src/BlockChest.java.patch | 35 - .../minecraft/src/BlockContainer.java.patch | 26 - .../net/minecraft/src/BlockCrops.java.patch | 54 - .../net/minecraft/src/BlockDoor.java.patch | 29 - .../net/minecraft/src/BlockFire.java.patch | 227 ---- .../net/minecraft/src/BlockLadder.java.patch | 79 -- .../net/minecraft/src/BlockLeaves.java.patch | 93 -- .../net/minecraft/src/BlockLever.java.patch | 100 -- .../net/minecraft/src/BlockLog.java.patch | 36 - .../minecraft/src/BlockNetherStalk.java.patch | 51 - .../minecraft/src/BlockPistonBase.java.patch | 11 - .../src/BlockPressurePlate.java.patch | 11 - .../net/minecraft/src/BlockRail.java.patch | 212 ---- .../src/BlockRedstoneRepeater.java.patch | 20 - .../src/BlockRedstoneWire.java.patch | 31 - .../net/minecraft/src/BlockSnow.java.patch | 54 - .../minecraft/src/BlockTallGrass.java.patch | 68 -- .../net/minecraft/src/BlockTorch.java.patch | 102 -- .../minecraft/src/BlockTrapDoor.java.patch | 53 - .../net/minecraft/src/BlockVine.java.patch | 51 - .../net/minecraft/src/Chunk.java.patch | 321 ------ .../minecraft/src/ChunkProvider.java.patch | 23 - .../src/ChunkProviderServer.java.patch | 23 - .../src/ConsoleCommandHandler.java.patch | 108 -- .../minecraft/src/ContainerFurnace.java.patch | 11 - .../minecraft/src/CraftingManager.java.patch | 11 - .../net/minecraft/src/Enchantment.java.patch | 17 - .../src/EnchantmentHelper.java.patch | 11 - .../net/minecraft/src/Entity.java.patch | 89 -- .../minecraft/src/EntityEnderman.java.patch | 11 - .../net/minecraft/src/EntityItem.java.patch | 32 - .../net/minecraft/src/EntityLiving.java.patch | 148 --- .../minecraft/src/EntityMinecart.java.patch | 957 ----------------- .../minecraft/src/EntityMooshroom.java.patch | 78 -- .../net/minecraft/src/EntityOcelot.java.patch | 12 - .../net/minecraft/src/EntityPlayer.java.patch | 252 ----- .../minecraft/src/EntityPlayerMP.java.patch | 69 -- .../net/minecraft/src/EntitySheep.java.patch | 67 -- .../minecraft/src/EntityTracker.java.patch | 21 - .../src/EntityTrackerEntry.java.patch | 40 - .../net/minecraft/src/Explosion.java.patch | 28 - .../minecraft/src/FurnaceRecipes.java.patch | 62 -- .../src/GuiStatsComponent.java.patch | 58 -- .../net/minecraft/src/Item.java.patch | 236 ----- .../net/minecraft/src/ItemBlock.java.patch | 12 - .../net/minecraft/src/ItemBow.java.patch | 35 - .../net/minecraft/src/ItemBucket.java.patch | 28 - .../net/minecraft/src/ItemDye.java.patch | 56 - .../net/minecraft/src/ItemHoe.java.patch | 22 - .../src/ItemInWorldManager.java.patch | 122 --- .../net/minecraft/src/ItemMap.java.patch | 20 - .../net/minecraft/src/ItemShears.java.patch | 90 -- .../net/minecraft/src/ItemTool.java.patch | 36 - .../src/MovingObjectPosition.java.patch | 12 - .../minecraft/src/NetLoginHandler.java.patch | 50 - .../minecraft/src/NetServerHandler.java.patch | 190 ---- .../minecraft/src/NetworkManager.java.patch | 36 - .../src/Packet53BlockChange.java.patch | 28 - .../net/minecraft/src/RailLogic.java.patch | 86 -- .../src/ServerConfigurationManager.java.patch | 153 --- .../net/minecraft/src/SlotCrafting.java.patch | 19 - .../minecraft/src/SpawnerAnimals.java.patch | 67 -- .../net/minecraft/src/StatList.java.patch | 14 - .../net/minecraft/src/Teleporter.java.patch | 41 - .../net/minecraft/src/TileEntity.java.patch | 32 - .../src/TileEntityBrewingStand.java.patch | 30 - .../src/TileEntityFurnace.java.patch | 96 -- .../net/minecraft/src/World.java.patch | 354 ------- .../src/WorldGenBigMushroom.java.patch | 35 - .../minecraft/src/WorldGenDeadBush.java.patch | 22 - .../minecraft/src/WorldGenDungeons.java.patch | 32 - .../minecraft/src/WorldGenForest.java.patch | 36 - .../src/WorldGenHugeTrees.java.patch | 66 -- .../minecraft/src/WorldGenMinable.java.patch | 36 - .../minecraft/src/WorldGenShrub.java.patch | 33 - .../minecraft/src/WorldGenSwamp.java.patch | 44 - .../minecraft/src/WorldGenTaiga1.java.patch | 36 - .../minecraft/src/WorldGenTaiga2.java.patch | 35 - .../src/WorldGenTallGrass.java.patch | 22 - .../minecraft/src/WorldGenTrees.java.patch | 50 - .../minecraft/src/WorldProvider.java.patch | 56 - .../minecraft/src/WorldProviderEnd.java.patch | 25 - .../src/WorldProviderHell.java.patch | 31 - .../src/WorldProviderSurface.java.patch | 24 - .../net/minecraft/src/WorldServer.java.patch | 71 -- 196 files changed, 1 insertion(+), 15985 deletions(-) delete mode 100644 fml-src-2.2.106.176.zip delete mode 100644 patches/minecraft/net/minecraft/client/Minecraft.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/AnvilChunkLoader.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/AnvilSaveHandler.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/Block.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockButton.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockChest.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockContainer.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockCrops.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockDoor.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockFire.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockLadder.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockLeaves.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockLever.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockLog.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockNetherStalk.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockPistonBase.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockPressurePlate.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockRail.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockRedstoneRepeater.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockRedstoneWire.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockSnow.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockTallGrass.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockTorch.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockTrapDoor.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/BlockVine.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/Chunk.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ChunkProvider.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ContainerCreative.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ContainerFurnace.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/CraftingManager.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EffectRenderer.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/Enchantment.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EnchantmentHelper.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/Entity.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EntityEnderman.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EntityItem.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EntityLiving.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EntityMinecart.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EntityMooshroom.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EntityOcelot.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EntityPlayer.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EntityRenderer.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/EntitySheep.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/Explosion.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/FurnaceRecipes.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/GuiAchievements.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/GuiControls.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/GuiIngame.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/Item.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ItemBlock.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ItemBow.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ItemBucket.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ItemDye.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ItemHoe.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ItemMap.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ItemRenderer.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ItemShears.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/ItemTool.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/MovingObjectPosition.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/NetClientHandler.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/NetworkManager.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/Packet53BlockChange.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/PlayerController.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/PlayerControllerCreative.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/PlayerControllerMP.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/PlayerControllerSP.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/RailLogic.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/RenderBiped.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/RenderBlocks.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/RenderEngine.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/RenderGlobal.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/RenderItem.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/RenderManager.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/RenderPlayer.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/RenderSnowMan.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/SlotCrafting.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/SoundManager.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/SoundPool.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/SpawnerAnimals.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/StatList.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/Teleporter.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/Tessellator.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/TileEntity.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/TileEntityBrewingStand.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/TileEntityFurnace.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/TileEntityRendererPiston.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/World.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenBigMushroom.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenDeadBush.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenDungeons.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenForest.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenHugeTrees.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenMinable.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenShrub.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenSwamp.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenTaiga1.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenTaiga2.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenTallGrass.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldGenTrees.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldProvider.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldProviderEnd.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldProviderHell.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldProviderSurface.java.patch delete mode 100644 patches/minecraft/net/minecraft/src/WorldRenderer.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/server/MinecraftServer.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/AnvilChunkLoader.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/AnvilSaveHandler.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/Block.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockButton.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockChest.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockContainer.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockCrops.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockDoor.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockFire.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockLadder.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockLeaves.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockLever.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockLog.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockNetherStalk.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockPistonBase.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockPressurePlate.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockRail.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockRedstoneRepeater.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockRedstoneWire.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockSnow.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockTallGrass.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockTorch.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockTrapDoor.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/BlockVine.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/Chunk.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ChunkProvider.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ChunkProviderServer.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ContainerFurnace.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/CraftingManager.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/Enchantment.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EnchantmentHelper.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/Entity.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityEnderman.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityItem.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityLiving.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityMinecart.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityMooshroom.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityOcelot.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityPlayer.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityPlayerMP.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntitySheep.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityTracker.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/EntityTrackerEntry.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/Explosion.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/FurnaceRecipes.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/GuiStatsComponent.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/Item.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ItemBlock.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ItemBow.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ItemBucket.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ItemDye.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ItemHoe.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ItemInWorldManager.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ItemMap.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ItemShears.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ItemTool.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/MovingObjectPosition.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/NetLoginHandler.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/NetServerHandler.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/NetworkManager.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/Packet53BlockChange.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/RailLogic.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/ServerConfigurationManager.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/SlotCrafting.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/SpawnerAnimals.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/StatList.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/Teleporter.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/TileEntity.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/TileEntityBrewingStand.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/TileEntityFurnace.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/World.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenBigMushroom.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenDeadBush.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenDungeons.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenForest.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenHugeTrees.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenMinable.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenShrub.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenSwamp.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenTaiga1.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenTaiga2.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenTallGrass.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldGenTrees.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldProvider.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldProviderEnd.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldProviderHell.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldProviderSurface.java.patch delete mode 100644 patches/minecraft_server/net/minecraft/src/WorldServer.java.patch diff --git a/.gitignore b/.gitignore index 349494889..af4f887fb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /logs/ /*.pyc /forge-*/ +/patches-old/ diff --git a/fml-src-2.2.106.176.zip b/fml-src-2.2.106.176.zip deleted file mode 100644 index fd8ec057cc2eac75f6b90c880299e62ccaa27537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219568 zcmbTdQ?O`3lqGm=+qP}nwr%^qYumPM+qUg@ZCmrIrlPtddZK5h_g8+bwPVN0eKIpv zu2hf)27v+qfB*nMYd8}C_@4sg-`LF7hF;;n5D)+=;2{F23|7Zoga80(`TzjP|Aml| z6c&|J7Nz}%rgQOdNzu`E-r{KV9jg;~H@%_~%`kC4&CXc%RInjctTFZ?^=kAirjYm> zOvKu~UiAH3)^`I2q12cpyP{(hBv7=FR!86e%~o|yN3EkpdO3PCxiaocQ5DmaH6yP{+TkyEWE! z$lh9Qlgm*SBjj)2bW0JEQfXP%b&ld(%vO5S_G-`7<+J2{9X+AP^ty;;n)&ffR)K~3wd zc>}N7y21AH^#H_Q%=nh_t-xuHe%$FPMJ3){z)J=z%iP#Rgp2(d$Ie1R*?X*Mhz<*D zXYpXOV{;wWO%vgHJJmUGH-~KP=lgjwGgr6!b$!ad%11*sDu=J@N&yYdcB9)el{s2t zqr91X)*#u?SXFITX|usLySPqT(=$ZRtd6Z+8?mtixUQPf%B_w7%CcL!RlL4G-w3vZ zZW?q*owse}9a*=N*ELDnWqQMKkqf6>R(G8V=On(>&~gg?quIf=g(BpZ5}PP2X1PWzTK1r)_)A6)rI6Lh47w?&IT?($mXbD zjZAurr^3Rv-bwPe^c(f7=F>Wl9Mrz6G(w{C-MiODcc5#%>j-5tXV@?r2Gj z1ta!BW?ZEMqB%8qZ;8`i9_pIRB<&*_-_)bG-s2Dzf5?m=ec5VFp ztbK@g{lr_7wmC^7KZnKybqQ(mMU$2S&h_ApmLg4$gw$luqzaM5ZW9)H!RmmFLwv}x z^tRz|SV;O8;uj&l+bNFT!juhfkM~Oxxe&;|76h>@b24m6L;2waMw~uGAoF`N`Dr4D z3DxMb0B-X)Q^)uSDXytes@J!sBG7KdjHD@t$7i?P%sS&pCxk>6>h++7z=o>~p(a^s z1VCr`Q89+lTm|@GM3=Vj!_ej93)x*-6of>*s1IAyQ>_|Q?owAFs1dfglj^RAFK*&t zTD87Sr}lIXWR?Py4j=)#1ovOGaTIGNn<`(%`p?ZXi?sNDwC4M4l6DwQ%h8c2&e2AS zMV|UiQ|9;4=}gNyY4b-3M2#PfCHEK7rN9bfr5(~#4e%8;!eQSoCCJ>i*#*t8E4Ihvvc zP&R(W1LAlQq5D|>I{H;wrub}y^ZQOpG%?I2o)tJtViP8}i=A1ORkj{J>Tn6qmr|+Q zQUz)7i>UD#gnThX1_%v(uBWY25vc4iw6%fkV9^iU&~qWG7so>Z=V57IGfoj~k2gI2 zrF8f57NQd2W{902KPLp(mnE(nSce#;IG>s2))Y=GI;a9ZwL9Yj$`?K^sBCsbXOp78{#i3yyxMERl4GCzf>rK41E(gg6~t zPIS${@|$NXrX`0Z!UimJfcy>!Lf$BxeKEwJ9iY!n1BSNf68l{j%y9*P;bSZ5E6bBS zieh?S2~N*tk_K}BS2fDMnYtxi+_ydy2`ZSZaTBYQJE7lTC1%u2ayc!-K$4!r#Lp8F zLo(C+xZ804umt_k1UQ`mt zHd)b{B?Rq#1kjr}iD}{45;K=goi^S@8P|D`e3qH&=FL7M#2UV^98n|Cf~iyh`rWOB zNsA>>%qL|BFt(A2ejP+W49JLB?1>> zyHw>$dI1<=^faT#On5%=2{?8gB^1vl^XnPQ45qX|q_ zyyS0@j?z=V7cs9*05uTo{r&W?Ax4BI@NfY_!33xGx<9b=@N==95y+>-*jOfBsEk1^bs{N%yU;<1Fxed1wVmW|f%8t6 zQ(l+dERJK9ZfX^5#ivuW_rK(}UKv+2^-%e@7FhGWKc*#8CM; zx&4Hg0stEO2Mt{9`rn8fk1_HOrL6T&M$*YzTcuYfIHZgqY?25JSreqB%2tH^%TrTu z$x9FcUVo)E#=E`06yqSl8ezz2rVW!MdS(Oy10b@PBgmPBO4GTOdsGE=BpB|Hfxx3p zun3t@psOzcq{rC{Nx(=9<_`Ve#qp7Mm`O<*m;+rl)+?s`A~r1tB%&jf5=v8AIM`k; z0#b3IMmB)dbo?M0s9Cs8PrV#`2@(ZBKZLD$(>*^5a-Y6jzuomoS=3&hUe2stc{{r_ zS7BS6-_JLfS0{(#dNXLRj~k!hUyAG@vz}26R8vZ3|^Nre}c6M{)A7v`M;E~Z_R zfe<*FXrUPN)cc&=J^)CWf2$+heBBt?mVysZe{)h;HEXEG2#Isw0eQ0p0` zEe?MNB4@?RE1WMe7Bsgh#7(JpHid zZd^@G;_Ha9=|e({pkAS#B4kxKYg4(@(j z%?2mbuc)Z|(X&L)KKkfK2D?Oea&U~zP-o%`!T23jSFpH2>&-;j(uRKc^3;ALBzM(C zN(B*C+^m537yzm}zhbGK$ibhZR?uin%Zy%~h-aOsIXd+K2Fr{mBu+f-DW`)|A-fw( zY@<~LNC5MjwS49n#Bx-k8zCge6GwFMo^YszPJG+s|bVm*9bSbYGKca5@Kj{OXsXI|{!bu=C| z+N99n9mh9(EGuaa5b&oGWW{V|B)!OOPG@1Ua^&1-5$mPDY-i9!K+xOwfSq?A`OAYR zckXdUqj6aPagRO+?&VI|Ru0Nt>D7w59!)D}vqNJ2pn=eG$wx~hGH*K8(L3mF!wr>tvbXBLZmV-A5(9)pj0A7@+GIbj0SABsFnogp-V zdX=LOObn=AsnixT$OiT$SzZGpqT!E9=X6T?^M2kNMn)wV@xc+A3bA06TVJp8gaSoV zgrPHN=f>4=(}Vmbl1ys)*UFW3^>G}pWLmeS?-Ej4HsR1!)4*Lfqe4yFT*VjFoK(2m zxMh2cXY83))8Z~-mdZR)~K?_z-g!`LL|!Kl(^@TTqGA!JK6oTdqqHmR8koN!AN}C zOlm0tiW2>hKVwXFB-L~Zi$oQ2N+^KvyN2Lw9*~g?Y63PuVhpgtEHr>`rBAE0z)ml; z<3hMWgR?}FB>UNmjFCQCN{=8bq1wXUibs&|%Wv4ZB*MLC4PRj7O9sOQ>hDE&eKe4g zB=fFqWCy2O!YD1VCRntK{7xndWx0ns94xy9K(pcGxZ+~G9};E?atY}=&g&8c0>IX8 z=n_%)fP+m;nC0=!sOXYZZHFA79w8+5J12iaPkW+8TzIb53bSE&K&-FxXkQVMNjvkA z4t$Z&9%|*Bnwtelu=E%U5B?0!mrS1G27RE$i%Pd@o_R(w9p%x=UOcLf7{1+C5wJBR zM|d+DJxGv#Wge=lS(mx7PWU~Bw5H9{F1bY12bBRxe=uJb1SI(+5-c)E z9@;CV_swsVh~G-%bWcm<2u`6TDux93l9Rc?b3VkFx3i)}6P0m5S3l((0`iz_1I zP#m*0lBK)W87nv&RF_)^D>~1t)2Wr_hd2#!r+LW|unyrt`4$!I1JgzH$}y z(Upbhzy}^rZ3oYm#dt%Jw3@g;+77!GMI;1-yUr;SXd6d?5F(FxBC-72;W$o)@6vO< zh_POA@8`C;-CnFrchV1)gfxR2<#v(@KM5@SFap^f-355+aWTUEHsJzl0QkBZWf{JS zvagf8*76)%Z~cqZbWwlI-+gI}O(rdi-*l&hxF56vX#1HsAzcH~nBWCRPvm&j6l0=& zHiSkdO{T&hL$+6>QcpQT4o)jtDoKQa0cHM>lHdyTMb)lRr5J0bSvv%w^XvfoC4+{? zP@RV=YH~1kxN%Jda8%%XE?%17*EHjkf?aYplUb@IdM{uY2$L7Z$t`F(Z|SzwTd^yo zL>!Kc)1vInUPGr{EjTy15w42X@_cH>^$LX1GE-96Kieq{!q4>%b>ky-AapK@y)R;z zw^Mp@-2CDMGP#P*sf#klbQMhcl)+t>T+s<9kwln_g9S5j8z&{0u&fXsoSQPrv~h>q z(QJz%HF(*<>a;NWfM&d8oWL2oAk~LG%Q<0^Fhm|qAA4j~YZ?E#ZyKzPZ5WTy9T9Y0 zfjKIunl7ewi+grK9OPZ{Vfik`#Wyf}v>=q0T~j{!o8dph_PH?H}S zrNGBTmU@lw@vU(WW(TBq;L!9>+`6GsEx25;5JqA|N{#rK@v2`hZp$xqs)Fq@dxC~&qGL1|avW#WIHJCJ77sYu4f z+(jRbVyZ~SqS~D`VgsBHK@FE9o8rT3+>W@YKrAV?782Slmz=nl0WU~4bl7rCOEAO# zjIqX&)J$@H2&y3fXP;L(pN1pfF~d=DC<&5BQ?t#y5DmxlfOH|)q#GCn643#|5aV&u z3v%?@(ysEcF#z~1$yt4>G6BR(w6_0cQV_SND``?S^3uo(xcwEaRBj`Ph>yaCjr#;` zVtCltEs*zAyU~|O`C(#1ZhXJ#pbcXId?+nrV`9o}YAzg&Ra#ek*GoW_Q5@iXKqgwG z3GR!JQ-aRu^x57(=npP+5iZTTTwPS!|DN)*&TR35gB`ih|2xBPY#}~IppbDika^m0 zG}C69idRzD)f8Vk=sPx+4?%lzPRb)` zwgTmCOnIWBqlQezy)5op$Z@sY$#i>Mo_q9;=T=WmdUNwCMvCN9$YCO~=;JXPBS|$p zXCtWf0?b>L2vf^kKtZVP-x)YOeE5Dt(;Ia0K9v^#y};JRW}8R<5(3csb|1_W!G9$X z(yGUUjdzDqRul+LSAd(fsUyDvo^<4K(Lyg7GF|d|6Qg!yAvcV|mv! zE}DCGBTjR3Rrj@$IX)YlOgo2k?KB_HSRL=cRfxzg&O>UgP}^LM*fvPmgkF1YqpQAn zB9dW`Ro)UzQZ~Nygo6&_8NhAZGHf9rD{YDQgzhtZD)MemSb9kZgB_lV+BSyT2yPcr zy(QzeXV2Zn9VTn?T)U=?OI40Iuq}dIdfpq)Mt$8R2bAV|!pwR6UcP4d3D`OEaN!`X4OAZK>G^)`+)+7`Oc7U;#nvc)C zJ~1BcWZcVy@?`cYFtXg@CQ<9=g2T%JGM@x1=zE0+u5+Z{h#ZT?;((<$0|_x3gW8a6?UKSa;k+X+%IJ7eVKIveN{=AbIW7!TVa{ZfIgQEFHA6MxO6Q;>RPu&hEw|xS+at zE#GzcJtlrS640v{kkzW=gOuiZ!j8b3cAj3Ug64+)x5z@1(!!DcX7fcpaX|TNO|tLp z9n!5s4Dw~;yp}j$^`0*t_uGp6QIxT(iDp{FgC+OO|H+H2<&%M?{1ZtWEMpP zAB{6Ax|yz|wUR}?Vq~(J?dT?_Xg^*CEs=tf9#nyc0j`3B9#aFiAnftp)`-_91X*KG zuZ#eGdBo8+5ypqTCfCb6BqqcLkO^u;>czd?(}|m4+|S=6{8EUYbI1n{ipbI)-eDqp zFfY;oHT&_bAq#Jd6zfh|0PNcA=N~B8y8XhWhFVVL!8+DT`KV+JGHWY4vXJZP#r5N3cZvJ4x4?8jB-SzKP!tMm;f zaVufp!@qyAr=#|wUt^#I#!z;4 zTlq5)nv21jUO*yKF z5IssycUbl_O9iQA{A;0(9qQy%MtD(_@CqTLR*m?@!EaGhMop(!_mdms(z{FeBCy9q zaBZvW!^o7N;8c*VIbj4S$@N-sb}U%&*VI0^gAL*Y>qJif9r;{+(N1NdT;TtA*3DCJD~-{EY0kaRKdY)+j6#r?v~k zE^)+q_*y*A67u*A0Z_ijhOa0BvP~NPw$$wMjxFRK>Seet)L}sqkEwi8IFTK^BL}PE z<9Za#y;cB!A8aq{Q3)BIuB_lB6GHK6MtGVR}A7#o1EniYbx>8X?8?GuX6tUd=7v=h7GMk*90EZO4Pl(mHih z!ml;;dx@#GY~S)W8m9ixt7|X#7Emo-pBzRdqT^A=c9}{ug`5HmBf1nvZYzCjBg*4e zc7#Y(r(dnbq!$pH2-q9NTpf*0V|&ur7Q5JK=B|!5V|`UDJv*-%_+lLWtI8s2^Ru4E zTlV;Yf%{GePiN2iggbh8UBgKJ<>adMGq`M=9oSISqhP_`*fmIqIo3r~z^=feMw*ht zU5?^`7j3$e*H(<3a+1DMR076fLu%qfX@VYkuQ{hlQ?8Eo0nnycL?h14&2b<*QhC8} zwo7FM#P8sDX{CLsO&JbS6p7(15bHzdajl5OQxrLz%e~R<>xZkN`0S7cZu1nc={LCO zY|n$-=+f>kuDdAoN>FHkEuosTKI0)uG9E|_v%hap>KYdE_4k-u0!>uVw@UAmL4Jx; z`R`CJlcIi8b7%?0_tKz$D6`Ta;LRoV*(QkByf7WzBYdylW!^~6%e6PT4Lp9mHIBpe zNwO}+`B=SMh*8E`>Dgc6RVG4*{R71_ygU-o39t7Z+}qLHbO$d6H07??`geFADey7c zHn-RJ?rUqH=a^wS8{;K5kBQbDE>kVa8Dis|>q%sSy95j`Mt4o4(4CaWzP2kTDx6^JS4u2aK(vl*}>DF z?d?taq<3#8=ie03BYfje-#?t58Zy`4WfeWSJ$dpc`qwrG`eW^l_$NyhJ>LfO{IVzb zWyH~0@{E5^R^K|_YN9QGuw1A7@_znNo$YT+ALp7ry)v)A)ww&miYCZ!>nz`nrq*SC zeK>o%+VuHk?XPIfewm1!&|Zw!7_oBSa z=AT=7GW3vo-mDmNe)+mg_@>L;lQy;=lqnxM%{qDzFCV8c!o-2tzj2A~9D@FJ`BxvF z1wT0mptB5LVtqiyQ^o!1kEvMH5+p9}PdI;pzDw9|%JA8$Z?1RBt7b12BD@wG&;DW> zl#wNQcG7Fx{(#q4<^+*YI3bw03+p@2JBO}_P`~tL787w-dzRkp9siRT5--=KHPM{T zZX(k6C19BZ|GeZ?a4a&j0Nn97jS51e+o5Ujs#*)onCEVd4~^f;hugrQ8*4|NMrr!L zDVHjm@%|(HW#pQvqsKQb*}?#%kH8uQuGG2_g98QPpW?~Z2lWBMmj$1+@jSFWrLj*? z<1I}yoJ?cA6F_6fznz39LoY@H?DjH1gGa}Ier~waG zoI4-K5Ty9;(0pal_Vpa0?lb)h{6D-NsQ=s`1VK`EL%;w4UAO=M2><2vFtIcaVZ~PLsziO<>{j_0x$3Mdptht= zl3(Z6J-*n~TqyH+2q}CNj1MhEXBWHa-}9_cV>yh(u2Iu{oB`!sV^M8(ys(MqSd*7p z^8|J80;7;N(5Tz_JNT{@+P{}`bf><~m>9k_LohA{#yMdBZz0*-n0VzQiHC1uEPo!U`NRQq+|iihg66{e4fJ-luYob*c?2J5TrN z4fmX;Ix{tNSgYZRj2vufJs9i%lE_fN#%Jtea`9ECUGS@0A7mvYndiaITqyO5A1`& z*O~YuC~V5Yw`OmVE|Ye`hZ*HI$mW74S3Roduw>S&e82wCx=T#2=Kr-a~2lf{&uEL;?3KoQ12u`fv~ zM`z`Pkpzv1 z%>M~xYiVa{>||)>qVH_#u(TWs{G7#2uzr|q;{HkAydyDr6DhrfkHD%bMDg^!DsZ2l97 z#>$6CB3sHi!w!OH&S@-ir+F{p>?Xw4O@cThG5c2p#gmB^S}ZYeo`!FqQ}cl%!}d-% zgK!b3oKm9~C3x;=sw)fJX(ZUc)t$zeQ+7g^Q#L7FhZJ!NgjgjW)fW*OE$Lh=wiARX zzP+IoxE=VdS;E6jNCQaMsnM*%-`xoZ57Pwe$REIzWh*`z&2_9k=peH$og^c;X`kA_ zSPX|`FA;v|^YdWl=n(RW1`S7RBa@P2!YPFe z08L}uQq3lQ_A=`8@pazs&CG>0(_2J|UOXu)>ONg(cb7Oo*onP6FM1ZgHuUxA=HTbX z%^NY1(bx;hh3pwfC`wZ>Nd;q+KadI(A$`=o2_b+62tLerfh8@Iz=6 zkhl)~#KHZ-!a-HhF9#11{2?I>uSaX)0x{?zcoEzHfhdP|so`*%bbYG%oB$*b{rH@V z>`-u6n&jla<9X3mlsuxg66Kw;f85%s^T2H>~c$Prdu*XFk| zm-!QL=QMJhXyeB`QtFI0+)_O~l43459D9E~f`YB#qCpPmu|9K)U z8_T{TP!GgBD?ak7yD<~j1XP2sof+-qs;*|+MLS!J{PW|6XN2ru&N+kGp=#K%?rCDS zjcS00rXc&O79+?R5~&J=MMV=HuaUAQC4b&PY7K`Uh+V=cL#o*U+F=>)IK$R}4!FHy z?PyNq4SQ$@LO)96^c6G^f6RcTsYu{E0&ATxH5w_ieLjRtHvtI8*_19&a3aJ;og%D( zi$o~6Z&G@oFJu{<)FztB>_`ctVzn4xj>7y#)ejrNRTfziq|DMU$O$pMlynqafG{z{ z_KwV6Ra38eh=-D4W5$~)VnekQvaLefW0Mr_@h15-0A>4ARKf6hg6gOd|iJN7v@|T`&s&N z%87O5D&Dg^7vLo@`P6!E|Ef}p8~|}YF=Oq4wEWi@z}laU=rDfhT%V=OyzF)xn1OAz z_WJw^s~u7Umudh@zC;L=^ad3VOc3yg&DJwOnt&1ObZ~;yCT3=|o;Wil?mF5am@Pgi zSXv2Er7g)MAT|QFOlBM>I|7!8`{R-VX!ufs#(GHSLSyNiI-JOVvw0-OpytktTNCs%1yU8&kM;)(-mjbZ6< zmR+E&GCW-E9c=|{>b*-zB;LugsASp!&0NHEzc?+P(0yECEeaC*BF1Vn$Bae~C1D=o z!Jp04a6c7jV6CY$U@jq4EHoSee%4)E;YZh3j1BN;(Nh614X|phmVtrBX_+#7HI}le zKNa(4C(g!`6P*u<3+>)W@rbmD+bqxFszNGon0{ELFrJFyrwIK-1!YHf#TUgrUC`8b zk*a})o_$!l#6$SC;RP2!63au9MdBTSo@3Dj_pc>?J`T`Uw|OEmq_O3yBpPSPcq|~p z+!KQ6k1Ek!nnBN#0KeZo4(?!RRTmENsCVd!Jo*G%ZQ<3Ckb zpZj|+nj!n$w24{#o;~~PVYiR}&1a(i>a$gakim?Y zjXo~)uSn8L9q})BhzK^MFveTEQ7D7kNKtF^itgcbsK(gqJ?}|A(lqKvu)VAl?sY!e z64eW%Ap7c_?&ooF4o@lC%5Yo_$xOjRRsbd}(R*OU4rE;cm~N~dfNEfC2J;cPyJ|_ylZKFS2+8&j`^SsZ8$G&o z6$Ww)5d$%>Dy2+}MOZ6T?uQXKbf+x*q3`zhiL~^Wp_uDq`S8khR;tODfsyJ)<}6Z^ zSyx?a5mUaZ)MT`|kPdcjIh$)k{yBv_!53N35$X=O#17 za+C0ydKP~w1%+%90kg2Q_$YkwyR(cV1w|mXa}cGRC>(IjkVGv9<`^S=7uTlSIHVDC zC8k*8MtOQ2O<^N=F<$l*&qkA#;pn2fmZmU;CB4?BEr_>@s$#wBXJ>y)Q&fv* z%UfJo+a;R|o2c@u%t_j*P&T905HhQK@o%SF6ylB-_yUEnN!W;_4eczWWr1wEVI}Cg zHVI$RnSQ!H_h$y&!#*}NM(@pRFhx=UW+5x+DZo0`3bY1ot#s-6Sf=EV_Mx<>ZJZ9j zzNp;4DPRC+om^um%>1HKwrySHI{r;v&@Tn->$1HhHTzwaDZxbbyj6+SB)cO4;KBR7 zsaJ}B@b0LlK_s-?HkM4cgL*m5b6{;xBDh6OmZg4C)aj#as23bonHv7VT4zcP2q_VO zpt9+^8)qY!yeSuw5$+tE5u;4#^*sN6HJqatBj^B5)~g3F8bB2k#D_hEb)XB}9Xfh= z<+ZQIG?Wkyv=zsfFu#`;SD?%blV_Pju)Zal6Qo*Vl0=kHHat`IiWSvlh!mx3a}UB3 zsk$XRLhJ!NZ)pa@&j214QOKvMxE#vkx@b;Ki3x_1Te(3ODH|Pq^0xR0ymb%O)I)C= zA#!EqLfq6k3hd7=ubO;&etHq7+_}luntjc6V%8iO!C+QBoqcME`lHO3?rg^9r|N#D z>rR%=^zs_-UrEUgYQ`Vb5^+W3XGyh?Xa}&DuZC~<_E}yXxsBUA`B%Cryl>}P$~uh< z`rJE#Mw9g*P!AbFh)^CHtg`m#~W0INB zV^tw1S%RHmZF~wWf;V?72UMSF@Ys>J86o4gfrC<{2NkL%W0QdRRp!uAfrP!ta1@yfoEq*MZ@Rr#?0T@Qp6)OqmH?4TYAqE;z6LXI zaW1dV%1U1wQ^p}S(DVB{BXG&^T$T(6!pZ<0eSMB3oE2HybAHcaw27qf9G4c&>uybg z4PgnJ3d7rmIb!TbNsYL@nrsJd6t^5p139*ih;(72vhTFpgF5cnLFd~2V27z$`brz5 z#HS6`rMc*AQC5!k;Wi({J<9R%p}-ZPC@TIX0k+BhM6mh_q7e5KIycdUuf|f#?X(4< zqYCscQhWuhP!k!@7nPRy=t6YR<-Hu)9vf;`Pf0S3;(W?JZt_2fFp=$Cq&jx5b|m3x{f%(2 z67Etq;IT>$oUH1Bvzm|&U0EP!;z_z0kmJI*?)BZFb|*;2%{eh*3{}ftKulN{f$65e z6{s(VeXSgVO1>Z97b=qJi?3-LUIByxq;XP&4{{W7g$0eJ(>dH0!Rgg4m$>69>D;Q6 zs><>#)^aY>Gsi*9)G@6LmZyxyr)JX-C?q3joHMlhpA`Wi9E&4O-DKcUovzL@$X$DX zkX4aY-$TcLH?u6rgKT)ussbjTcGj+F3#$WPAcx*h{j9lCR#-#%d^yDdU1BG8d%@2y zvS--~mSzi;+$RgNjSLZNbFskIi}P$U*P>J*K(nB-QSM4vnS}UP^su}c$~vm!6wVV# zVp$1Nqx7oAW8)-IS?2NG8yO<`-AwN@_T$d5EzJBu-9Utxj z9v1SJRe9Clp5^)~Y~)!%UP=7RAaq?*0z_kqs>1Xfv~QH+m|K*ryUFyivTs07syZ&( zW@Ule!D!eiZ2LWXdq|c^cJR(y(!|_h(6ukG7-Er|p);{aW0(NCRHQ3rT(?d&2pLw5 zhhu}qUlKCB=C!I#6eY;W-ttunSsdqryEj-+E~HRA7EP_*pf0(2cwZf4lvSWO)go8I zWr5|4@AUNAom`Gk+v}k+Xs`oKlQp}gaX0mZNU!r>g>rp82%DR(V0jYq`D$42L?b${ z-_I9bc^5uw*Y+nm2{2Az?8h7P3r8=?c!gvw298ajFLY!1*J7X!<-3qZJ13XnLgF{9 zo$tqYd|tDc=eHJ^6f5ky58hioXupQ;c2(1QUBrD$J;r;_@0uOicekpt@F0!m>oZL} z=FBpt0zu?O57U+X1C5W?^4p>jz}P<2^h{P@p316E%y%$ARPJoSE{OCrm_5+V;`+E?Dy%dqe=* zXYw;5Im2WSWj3wm>!Dn?fQTp3GxI-PJ9~xZ+JLI_xBfWKEq5r;U0)2bR@zQPYGAs8A{)hlYO$n01 z6+?|px>Tv>1h>{@gcN)6Ns66HHOsz@jhqZQ;$LML{0y|t%tQmW-HI8d_5W5k;*zk@ zX&&-Mny}iD*v%^}h3ZnhSUfmWPgHVev*_db#Qq=G1+$dP0;~RNiyS}z0KH%U0D}Jq zvX+d!xtP6^t)Yv{f2mq6s*3iT3<$n+b$1U(3M)SLD`B=FsE`(-3ZD$u1G01jS-9e@ zz{beGKBvX;!HZCMZb*ZjpEq4|VYd{X4^gKAiB2=gaqPR$&$a_$84~bRd)Wwa)!|o<^hgyQ z7NOWz10M&(iKQ8AhlVPl^wT77JCw<;&*;#^=sluCwrj}RyIe@zo4N5^A)+Xd0JoUo{W7#R1P;SRo@u5h}~ zqgj+qYYF#>M^s>*IMl-PkJqQu2f>D!fZ`w(&YW#g@I}D_unh+J6QG37A02JLi41wM z0*w?xu#Pz1?+;$!Y89d;j)_bsp9$)bI*gwBduJ3vU6U~S$(efBthK4NrCukHEWYX9FcK_Rt z`4YV!eNH=>yW14Dat^Ln3;?d}_JC}J>NfD*wA|Nb_?~V)dT#b7Lja9t{9}{473RHJ zqQSYyedQ~bK^X1~2Xo_#u=~ddiaA3w3Oj*`Pdlom zju>5nPw|Fs&CztSfSxcEzQ99|Cd9JhCVaW$m2ii=Dq>dJEeFrvH#W{MoA%`9_U-0L zR+54!AMr3%`A}P=K`V9~G1_xsgey~nfTaRez z$$%)=zs#9!A#zCTa8-;OUOav}vq3{t$#kBh=p<`+`=OaljegGH+uQE<`DnLFg`ANf zJ2(OoK?M%IFAI(TP_iT-#k^~rEdQi139Tb}-2i8n<`c zh%1JP&-{tbOueDJg0Raz#waVG4x6C0W@&vAsq)rVcTSn<%_VuYw5@L3C?Bp8$jR=n z_u2?CGda2pD^}j5B@x*K@t!BcS`lfEeRhLmO4?K_Rli_sHoosK8yW}|O%mnQ+>@@N zP1(cwTkSbd)L}~aLs3M8q1BbOgR~mZfE$N%I!AxC{j(P@5uiUaTMK=|CgLH`g~uiG-J$S zD~{o9Bp4ivTU4aHeji8Z*K0zEYv(5J)@jRrf@j#35*pW$X6MdNJC;-Ed|{BB`!MdO zctBX?7{F{vtV8Rj+eVk*>=-3jFv zXGgsA9rO`|XR5BL7}$E|N*hl*GRD@qru^pv(`R%%_n1w*Q`Roc#h@mGce192zxd%% z(Zjpfnr~`p_j|WE>qfhLbuWSdxAjDQZadET&s$^hxj^pUAHqrM&0pX_m(tyk`^b;F zlI(70h;$E!rNc>TVr6F6aZ~b9(v%cnEb_EjJJrgHOt9dRwW;~ z&x1io_|*3FJkrhC&Aa7iaI-o@uvjYsa>2I~CiuZKGm4so1t{TNT^3 z?TVe9T64e0eAYhRFLVBd>pn;8z4g)hxOZqQnX4LT9kdK+sWs_8+I+)g+1x0Z8O>+8 zD^@MWzyl>eyz?#C9#9Tc#eT&@RWj9!J!I;-0ihLOQJvATXj#2rj5sg zRWkmGM?cEq_zbfDkohe%r=dc|RjEswJwz{Sd=yQ)ZOlt92HAdMDo@IZ&Gq|4bfx)g-3QxYUw-?xW+lD z*B!}Ql=ITkid02$DQAS^xC;-_w5@deePf_Rw1W8PL4m4#b`9Sp7P*bwN4-ZF+2GYx zr4n zUbC^bfT*r1pM%#PZ*)7p6?-cbK&Mxyz7`NZMCts9k`@#qMruBAIOTw%Vk4uj)UM`c zu}ODwUTw=~U*}g`l@gPjs;ULubv8&FO$*wF7++RS%{0s#bs)-Wame;0JC!&o{7F+p z78gN;bHEAmz`ws*96gc${_Mq7K*$BYYPMt@l>g>cZ7eN>+2A7Gr+_BA5ssXWUZjFg z0Mt5)244TmceiMEc>swjdC3~L`;_YJBH*V^GsH+Boj9bgd}MdR4Pi}SA>Bu%bTG4O zU&sKfB4s+$VKjQ1B_i|bx&G^+4QtWXC9wBp)Nt4OX+I0|#~A;ZRrUJ_vl5a`Tmb4C zI^gli{PPj?y(d0+fA2jZ|0R5JOAZ)6g58md}(0uQt^$PaKWgknUI)n?H*q}Oe3xPS$2FHQJ(hBGbg%jSD%iH z8SA-U79FbN!tWFeAE{>$$fx-t<@qaxltV?TLgP1Mw?m?w*ciC_+6E5_k+gv$NwAk@wk0#Sj`dQqHf%YBwU*pNT9KbYP6 z=$d~(k1tlGJoTM(5jL1cfwem@4r)_DDnfbfLLFmPMrEnU!**Vk%Kq+#_;aPx6^I{+ zj%1;tiU@0mPhkdkh2Pdw6{mto0!Jk)IR-D_Vj( zQFXSYwq(=6y2oR`6TV zEaW}gpGn8dwnzMb>khhHC_h5iJu>#UJ1hGRbp6NfOyXN?9Br*l{+T&QQj)RF;794a zqdr;@M!{C&c~LYB0vXix#WToYiEu&JDn0YP1}1+fO45|2vE90u@a(_X>gTx) zMzCE9ZE`2Ib_!}jL&aRt<%AL)k#zkPR}+$pHM^#423d z?t*S$9wzWaAp$Lw)HpSg?+S8Cux42dE88Cbz~FPT{zq}x5+^MosJf(o{?U&`W4wvn zaug!STaQA+kXFi)RzTfpAAMau$S}3t5REZ>e9O6(>j+);%mp$YhLJs?&TEJWf{)I# zYmm9l55F#NE^#h?M+*kG0t8 zjkE1Ac%307mPPZ@OB+TEUiNG2FbD0F*kZhAc-amG{myR-Wtz`1(kxniX#$_RDk=v2 z=jKXX7=vEm?z`i&3Ep0;$Oh+Kr);8a!2EO>9D5vVsT>u>!|8zipU%|}Sx&^ z=l}p~r48DyoUMPvUCsl7_=QcPW<$Tp!v_5?;w}B`9}r(udf>!d@jq)V%cFW|Y7ZxvXwZM%YPn_pv>4f8OZ@Hbxa}Ocg4; z$1})-N~KoK1)Fz>=$1+=FP`_((`e1u>UTqlB(#l2;aGG84!CBX$DJ`NL+mY`!%G{2 zbSe+Zl$cSsGh*3pLi5+sug9Q*ZK85pZHrQE7ox4JE42bHzwpgY!A>n;MDY|2ONUf% z;p%lvy~8OI&5bS}=V^ME51W1Iev45;zGe)3mxxpfnXq{+A z9&1d>r@*@j>^~Q^3m}C|mssb>j?nnwo%eo2nLWI^q!6`d%^{@}sv1U&(Z?xW@7A6c z0$Is6>X9_%C64&jkY~b&ZmH>?Y;Qo<*TO6*1R?^6%0&>xEapSt0ps8>f=))3xbb9J zwzDOMVqBMDLF2| zFM@|wIQKA)SfpqfSePwwY%J1^-j~#V9M{CG?cK%hbWujF9X~3WOgu2pbUzNc`gZ8f zUtzYhblP0LDK~Kn7DwJb?mxuHVAEHvC4Ie)Rm74~KmJx{kiIwrv4r@3X<7pvv10h4 z5ope1rJE_#|LHB?2|!BUc&*CAwEeU#wFCzsk=vHzr8A-6op?(RSuAQ#y&G(H*4M&4 z>3$x3YVFmxw&Q3zu!qLve#_@kktfGu#2E$*8eOxi7 zV7$6NK(-g^i~J2{$HWWe2Ey{gki;Ow>2>?fF7tVAsxk9^W_|I>)6?;C7t38JGzEHK zjTvSA!iGtF)omSxD{%1&n4?r*Y=*L` zXT7ArJ@(_?WF?ACphX*PFr4YG=U#xH#9Bs)MqLXQ*hke|HGAI|zOn8A-Otk+;CK z!Z?Cy6f8~+&)Qw>+z-=zHHza)Xo2x|2N$%ag5OuVeWvaE9EF-pzSqsIJ-03{MTMFK zjxxiL=k(JjAgt3Eo zu@8nvKFtIB1}%lNpDn&TDivW$xc#x`g~cyXo9gYs)9X%{D{|^@^XXbR-vdvgg8-`4 zvmcc7asLhYZ}$GC6G@Fdg?0b|0EoYx#edG;ccxIu!q~+4pBn3}xNft~0OS3nb}|bH z^u-?zXSHMvnCYzk3LGh1GDb3+d(eDZ>x+LVl~CFHP87jO0uL_-{fd5}aQawuYizja zre<-Q-Iq^MX&aWn*~6rqT%P3I`pnh}_cNtA4DtOi<5z7B26hOi1Qn;_%NFT*`Pz^Z z>HDuT5m~hTBr&nKuB5f5%n|Z*HPaDSG5y#IuF%#z{X_GQNh+tv#LhD5=* z_GU78FwO)#7JT6ALm5uvTs((7FQxocgSBql(B`;lRxjEl9VK2T(^H1i7FCDka$<^K z_tcw6ZkeFq@lhNk(~D}qnxV&HB-;EwIdjZf;>9{-D!Fr|zCp6Qj#0s#1jpRfm#b_VP zoDz=W(9wdXdnwP=&=Uq+JYo2J5b?6dY3{)m)Or9PwG@aMl`mqlsJYB9L34GgqC3?q zY`IuG!4z*Jd*-6bHM^M;yD~G@?2Fl6<;^4ay1~fI{S_vQdO?H5izFI`1W*ex1h^8r zJxi)O+m7-`2@r=2SG>yTKS3#?G5qmLG*ia7*Nl+~G2>f=p8BSOE%JTaNc+DbzD+5i zbBIy~@_1@@69it|ln&b?LNZ46E z*2c4=J{js!=(3HF8{C*VMgf(4G_$=pG?Hm)xm^8__u+xW*$`P;^o?|mfXdvc>s`ZD zkDDXMWM3>}cqN?y9xo}Nwn*&z;?^(h>6gg3(eOV^CXtuBqwM%pN0eawB$!?j-Ec_O zY?LXF1t%ooY`s@zYQq=e=xSo9=tpkG9l{DSa>mA8o%+gs@n@qGnDfQq<<^D z^)0Cy7vv~_=#GEDQ*px`a6FPYQ$Flo`8dJ4%os3sl5VSibYHsKeqs-c-XXL`0UEf^ zYJa$+=nHB-v14oWorKXjYIHiYy@&h!V{-rMUB@4^zqLjC4dv#4Wm#lRoLp@kto}Ec zCi&#Nx*qgYYWOjTs6hfJv+}gnxRfIVkF_;^Mw?Z4qDg_1N>N{c zc3RUQW?H;!sHg86aw-ekUNfR$orWeaHj zB3z9^vPgv?n^~bP?Dkw(wfDhpDM^b7q^h~^sXJXx{UG#y!7zzTxQ-l)Z1|#5HnFZ5 zPcK9U1$F!&Yt#?x=2g=yKG2b{Z_6^d0}WqAMqlWF-{)#wWE4;?N-aB(tV$yHP32zT zdx+84$wzK7v`v4e5bMlPjD2$^m)qU=_%Oy9MsB)mO$fxziI`pwt9IiLM|L-{rk#}T_t{r(V&6MrZTLA>Wq|lBRKMqU{ zCjEZxk!if*dEsU(3 z?PP78EKDu_?=4c2;=fotr#?yrsWxmo86_W#LIU&=h(~-Dm!ghfk%1yH5u$j#)>)PC zvhY_WkK^LXT+JE|0f48#60A=pW^|ELPla+MrmDBgx<`SFO|$T%eu^62yueGaXBJq^ zZgaRyfs?$dtmS!bX%@CCel#<%2;Xv|2nsHes0>QXVkT)UsHpQtez%b?}=0MhFsz@bA~UO z$KtB11Pnu*Q{hg{X~URH8P;86IYI}*U+gol^?&WNuJ|Euq^)~W^#9mr#J~30@c*;V zkz0Bj4*fq#3&3r8U0+H>qGQi~;OuHKhf2BegAd+K^X#V)$Fbazk7022 zCD{9%s1IPs<(t2gzH&y_jvCo`!)PktfrR7;;W`lLsN<`AAMv<(B#=v$&V|e%&BQ<_ z+Hs*}x~P;U66|-Fp6$^QOZjR0?xkzh4t(WT2AEl0x^8IttCHTD9kzcnW}z6yZ`!wt zMflCw@i$}q|8WtPw>EG$aZq+JFtYmpMeLoz%Umr>;wnA)>RZ&T8$b|H~hI=WujcH42 zYMi(+t$Pi4{@tr;URG7Bp zUR~==JnsKC-5ealP2aD=2KBXXQl}ZwInG5B;G};JsVM7jXLT5&%|=LVJN=!|=wk7J zN(8IpjB@fCAw_TFdlumMB|&ZqK>C6P`!aZa$EVJi)d6(F~ zJ4sgWEHel-uWpcjvd;ckm%%)x?pNWQ3ldw3ikBWotDNaRcc#N*YcLxUgCFG{b?N%{ z56LkW;ciW*prYzx88m4>k7vQoFHO57@r4TiGIrbf&6vP9V_Q+zZhsjAN@7QHQ$1b0uH@RS-wDf zq|fLK6+!&cXDX{~8u-JOX#8Hef8%Eww!zQB<~FeTjh*?okNA&oCM1-M%uS4)txb%T zzqRh4MOP-4#{q~DCde~K&}7As0|3^<92k9O?Z-L6S0pVwL)r$9E`7#8lxTf-2|4Kk zTPMXG0Z&zRB_L#p2By? z)|L;3rw;(1gate{jX;@?g-(;778SG5zsNhUXOmH=Pm$Gz2%D*wX$dAT>TJ>~!#Pc~ zb)vfRWdTjV=8E;P0S&Nm@^g$S8U1%I7>S@3t4iMDGLdcQ9}XL+;Xq7pGasoo+gr&e zo==_f2$~Rf@&!8WZ5Qx|Dj$GsNVTbTSaxe~b(dOJOR%EqFw4Zb zEg~juQC;!BX=$D~kiN_bI;4axE>SeE*OoZ0+IY;C@IY$E!j`HkGv*15(hbSSv*uo3 ziYwdSo8JshzQCE{tuv)Y;knl$mC_uGZ~8u{?X~+@)#h9Sl^o(A4uf&v3xIlV7Wawj zL<4i#RsHGJ^P^=ehz`Q~WcU1%&yM=9z`bTVs1msLSn~p+#9j!GG)eiiO4qGdi=hY- zIq2u>Z@|->nNDNOpyWk7LC1#lB&iIv-g1 z-QcT@Dhl)OY2e;Syn3&$)>WE@Ogz??es4ypGW|~pq4O2=RMk3k#kPbSvBo+7-11UH zPf;nUWX~C7WkbPFk>SMIj#4y8Go}&}tGS_=lU2j}k&G1G?xhh#TBo$=lVu44wh#e1 zs84jfKRv1ASkI0ok+`#B`(7jJCQi;gY1&;G?+z?^GI4~?nIu^hIUvRON?C?PI+`t1 zv@+|4+VLPd3`_Iqb?6q?MUrOiw$P94l0zx8>FntBUIC2lit;`;wGINpCqylk`!oGb zxL{<_?JOVFVOT;oc<>iD0U_QLsDbT@VO8PLwG?qkl0mafCis5S3Fv-HLc`>-@cF~i zt9RbGBmrVUlPb&bmt&^o8R(O%&WsdwwdTlzw@dQPe?TBh%%IJ zPCL$$Qgm`7g~X~bN|ViV5@=-uP3O5-IwPiqItfH82sh$y-x%- z^C!)1daBxU$R0YMeujdX46O=981)F1?!|TLr?3IH6rl0252l@9Z_Q}VzfY!A-EaQI zbWB&O?~|GT-(=Gy)NCEBjm1p913(5&w*LwNB`L4ltnnjwA5)8-2_Xx^7N1GEhY1N8 zhGn!;5USvzdBS8=c3oXz1rmLBHCQ2=$CsA{-I$n7Wpf;_OnShcF=!FrgL$7wGznsi zV7$f;mhz)-Zgu5~d zM3n5`mugk;T+aZp0WiK-tQ-z2A0;EalVW5TFO$TV-y??iGeQF zOMG$%!4%cQeDD~iYXmc%b$*5jDP^PiC-)R02a~P=j-Uhy6k9p{D(~_oWRhwG41p>6 zlApnm=Kk}?jeRwS+mYSUj}peEiIv`FZ3uND6s!b6WV54&oFTp2_p%jE)yQ#6O zV=_{(VvJlp$RmXoJ*o=#JtOG!+f4O<259cE&qrDgJV+-Jv7bsp4}r7$kh@QTiRFMP zirDLn5V?zwA4}+8R^uTr%(+XZv}Uu&1vg5iJWz#?@yc#-(n^w2Rib3#COdIIQ`Io& zIw4KeiW}!D@qq}+C6l*KBuoMy@GkFtsJFsbj2PtJI*bz;{$kgh{X z#GX&Xs)APJKgReI*j#}^>Ad1u^Q!$P>s$*;;%rM{r!d^zw8gou;dZ^;RqI+#^O|o% z)8pww_yoW3ZhGn0-3^81;O1y!2(3?XA|6f&#LW6Vmb){;9c}xUU3zS-RajKghTSXs zRfSwQufMPBmQcUe^JD+-T+~l0d9EYXMm9hnlb`ch6*JZ(zGXat?LRgL+kf01ynd3L z`YQ5VFFZDF|N9{R9aPTdfzm{v0{|%L0|2o9rzP@V!H56Zc;4i;a$RRl-oB$om^3D0 zfx#^?`#oUK8gA5*-DFgQe|gHf$-xY&QArsuCGV10_Vu>q2^b3iq1c%5@`Lv$O+?S& zpf?|YjrUWa_b?q=CN2(s-LKBhqYL(&x&rR>Kk;EIihmG7E)ECVrK{0Vv9D!T&ehgy zG_*H*kvaGfX=JL$O0}7u+37jVh;r0i6-HfGIQ8n-$J9s7!b-;uELH52m1)LIwcJOO zUue>5{zRw*N2vPA42~D+zhr(s@6MBQ?FsfY;JXctQ<#)gR4|9FDj?lS+o3_K?ywp5 znq64RG{6Bs3SVjO0(JmDD^7wtg_t6u*T;@1?TgwZwHT{r*Mj8LD+2r#cX8YwfiFi#zj8lMe{p=ex_Uo9NYBMk zuX%8jxa|N*u7PF&q;CLilBi-eaOd`AeJzH;_hIMe69!WrmVy5O$8;)A$qfy#i z^g0ZZ13(<9yNh%eXk;wIt6Jl!`c9}79mxFQ^3J28m^eVLi9H7WuezuaTmXL?#oRA< z(0#xmfgj+{;1<~_fN!x8P-ZxCs};-Z>ovMIzF(FZI@xjtXG;l0;kHBwJ_u(BAc}!^ zCRjr+4v=%V2apVe^wf`@PS`;bcz7g~+kdVuBzkvBe?J&XM=mXr{7`_zGi=7gbms&yJb67?&EuD z2H+*C^m$tqzC1X`>j0CbjVOH*V+1ac=CB}Gbhzp#y=2Apsl&UWA;!Q^CB8aGnj#w3SUlZ}SUb zf5Gv=#y-LI0mS!XkiaQohecR_t#*Mba{{)9W6gEI9j8o9A;;*m=h*du4sRVM- z2YW1-NHIsXZQOO!>IC-7?JVs9!U$yD&AArPvgOz59om9cb^*!N2ZNEO`XRZx(18Om zb$sKh%BbL957j1J)cGA>03*E7_5+-<1(`@B1F=^J;@SU^uEtE_)uGZkzjAoW^_oR? z9W7go56|}ju!Q8L8l2G&dep;QhlZ+0wH}JCLPIoxXvGSK76G8H+xNQxq|zuUh2Sm0 zPoyC&plLx>=I0kZfHgcNP1Y3;2W^uJKX4fAQUD7adkh-{0AvrD-ml=>dR;mysF}VW zfK(+`E3DRvwvYGLUpMo+BH|mYfJ7PkUG5HDKwt=1R-;^rRcVD*BQ2|{(zyRc=8j7R}>0Ut+7+JOOaXT0}1S|X=(Ig#{^IE9@NST%{ zh`Lg6-3uD9IJ+X-;kl?PU-di{d;7$r)Z1$*B@Qa6+JGqXLqvzDEy0&LSy`EvzA!Sd z2O2Q4HAE(U;^8Tz`Yc)&cub^?mFmJL+WyE)`tE=Q5=;7&{*s~@hlm$v@}Q(UR#r3! zfK@Y+4fn#B_4*TF&9)lKB=!_B63u%Lh19&msf6u7AP$PS0|%UKMKRWRD!KQ89RjJe zWuDJ3iM89wWWpA|Yac^y5+@`FgiB4k9w+h*m__V$rWMY+VpMyI>cfl);bINK8{Og+ zN7Zbz$3RL>Df&;mBeBO_8 zwq*4QcO6Ir$N)63Y0m>uabdB%IQXg+K~6RH0EJt2Bqi?v0av*YfQm}hSV!oQDFyNB zr!v_KR3vEX=-3VaaFe5g-3+fF4&W?fXt#K>1e76AajF<;KGK@GR9!_K83X`Cp};4i z?wzC$Rt$v}}?-T28<=Y4oJ zUaav4u%yrW(=(L)r4B)~%I6}VCJ*Pd}KbEbky|HE5aEo=PLA>{WET8FmzN= zzPFRQ#`v~$%hi-W1B|}0lhF@C%^la5P(Xp>5IdSFeuM$jmmYjmftOC<2?bzJW=?|YpAbW;Ls||sF;+K$+=n# zPsx&+rp5&63(FD1oZ`c*k-+Rz1_C@1xhRhAfnH93E^X*y*Gct~+E_MXOcSe@c)|@l zW7&1u1rI`ltRgg%b+~ND|MHQhD8QZny?cK$0-$4IVH<`#$~6&UE@*@M8$`b z_LU^((qdB}bYEiUIWJ|p8gVnO!Is#hghbLeST@+VUt^}|&D)PaqQ6LcV8pW>+|Z|zynP}IY&jtdZFEdVIE z?Xa$))8uOT4L>uL6hF;tQ$-x{v553fub6{dOmtm_^y*06xz2nESHf1F|nc{ z2>rSO+^CWKQ*G44ASlFHyZrX|rnv~Xr!l~OeJ6qHb%=CP_%Ldp9ce($6s(~@_L*e* ze2a;?t$PA?p!BwfN)7%|7i zX%pGYn0qgd%o}sUiF>Yae@`s!DOs<6MNJ(v*>5z++ePfm8nkm@#D!T5;{qmT4%lL7%&6n!2_ZkD7VN zKr+s)1}NcnnW-Tj&9z-jqLBJZJb+eWbzSrU54^CZu|$lhNL`hdfOyFhMbIbS$VK|Ex>6hg!&HA|YFCXI| zK%*)QGRxF4_@}?l_5f+03Ig&Dg0qI9tFC)E<1b1TcI*&FUuVTtYokYD+v) zQloe=Z<2XxgKC3|f*Pcne-DW;%%2b3-~5A$JS|{37t)N48{{PM%e|gHm+CU znaLSg{Qa~UP>9wK1$t))%wWdxjMaaELWu2f*+|2%io{qSlNY|5-&3m|u^wKf>i1KZmQRg8j9ZF&GZvF8sH<7pzpYE@jG@;Rcy zfpyYr;Iwh&XW@rh`t3PIR`PNMsoT6LdqOFbICG*EGYhR!XS6`^HIV`r*=C(AgD#1n zKq$0VEQ_zTu-|z{c?Uw6VS&`0!CVZ*`dz!oHlFA9E-76pmr}T-%ALxo?walyGH6tq z*(lOyQWgRjo*XXQGf(_z7=hK*qrkxsa96H|_-h1}+1Bz0NQ<*#M_!>*1fc>drc44< zT{@#QOqEZ6;jo$?aDYKb?QwENEa;X_m}%+E#-G$k_;=1YZ@LY(cIJ%W?SWspP#e8? zgBGKt?Lv#SP7gN=0|>J|WTLbWcWEy3md-U1d=Qm0q0NAsE!_&?9{%}}x?w5_{!;Ej zvP--05{dG%voN&$LB~6wCKmW6%!$W}C(MJekZ$ukbF-xv-Hnh-E7T0?NoMoHy|O9~ zljaF!kiVDJ7D&k!n(Dlw zoWOSRTm2i1|3Iu`%O5;ZNX_(w$}BWQPTz~y9({|(H4CJMj{@@ZNGf`-ORYa z#U;T!z!w9tckmcyUs7Jd)pw>jA)tp1BIl$j&kjGPyQC9fRz?KjFTu_TYMsN#VV!eu zxi-(-nWQy+D&g`z%NhWGFgTzEaW_i5^twWDXNLKQF80mEj-L8`>DSY#`~I#H%*H|j zQ;;Ba<4h5Vv}c8ohTs*crC%lNCxqku^t%6W?tC4b5A{2X&_Y@rPN zxdn}J>@5S8uYt?y0kEuK49y!+Ex@D6J@6}qnzOGURHnD^``_Svo^tRE_bIv}mUbrf z{xM&Rbmp6o?^ZhxYmK&v{Abf7lIuC9W z2{nkICf;m~G2h z1Az6$wMlGztQL(a?|Ad*1So>cRN*V))^W*!&I3X)dT{FPJn<7DWR;}}k5kX^I_D~X zs~Q!f>52qj5znq-$XU`qn5gR~CZ9@Z0-nmenFpwm8fwbAV^@U^R*zC?y$?RCO2E+w zE*j)5I0~f0RZLE)U75mx9zS3Zrn1vQ6^^A>yqKcQJp3bvzWpdMmF*#>FLBvyd~O&f z#w=MT$U=q?Li;$jdL7pQ!}H}O`l~-*A~bx3QhPxcAmX3GxC_2sRLBE^NQ;F##7c|W z&lc0@>=Lpl=~a z8yW*vIhl-`re%o5wsK}2BhLf@>rl70LJnN3D&z{@Z8j+jXJCdpR4oa3|Cw0Z8;Gy;JP2%{_d4IJ=(h=QZf5xcE&6 z;y2Z}Xx!HYh~4h@f@)lj3(jjK*bZ40Vr@zdUYd%HN0s6u3Djpp2|= zY;8d2N0?F9`3Bne%zS8l#Sf=W;r$&r;Vxg`NM zE!Rb)m5{4s-Ql_|1-Q6;5xe2<`4gJ{(+$*(DSb=H8A_%Gh7W7h=E-o-hbn$CudSk4q06CUDy`*mTB#ac052Rw~P%!%?V--U5>C#m=Ra!ZPhMyx#lc2M}O~G|FIGkGV zkz0Mo+Zb&8b4s|`(y3Tmc1vN&Y~kF{eQO(m_%ebf96l-1wdi#@55}jin$_VO8X#qfdi8bhVQ9g6YseCTD0%8FE;0qCm*)WVGov<3)FP9ZQ7HnL@%_%6ux}w*O z;?If2OF%nSLqCOuT2SXs&egOn)UHwqq@X|6STwOK{ICf7a&cmgDNRR3i!v*_ePx|bABpAka9EDg6ETjN5_yP9#NKpbWpL# z6}z}voxQdFy2}EAcq>Z6+1fNWoBOWFq>bYxTk!BYCF ze8unJg4BR)3sQ(y_6JV-`P`{>!{*#!O{) zCel-9jST6WIGv*JQmMpJz(0kp10S9XvY4-F3jB%n=sF(>e#6=I$l0t9ipAJqrg=U3 z}hjPXm8PCX|o68E#`E+F4lvRy9LXBo{m)(x>x+x!7(QckU!DJTI76;CSTs z)r}WSALrj(8i13fwk}TOG}uq98^Kl``*r)k@k!ajMS0`ecx4xqNx2VhXWghpJSe`w z+gk$ENF{CN?xxrsrqmylCBAuppzDBPX&-cHkL#W{;%37t`p2*g2x~OwEq@y2;;sRS zBRkCR9fUbwbwo@|mVJGz_3}+|nUcknuTL|7eNJ`yxX^F&kYjWo*6}uK<&-blh7_v7 z%~A*4)pT-vMT44kLW(&%$IWm#Cy%R$^u`Zy8r_5G23U8oj!Rn)26w>S1{p``(;PM_ z-RnPSDgUHPHB{C+P*7UXQv9Ho_(3jt%i^0+Xw}_x<)g*3wtq52l3N_r0Xtt*T~FGr z!O?3EV!x`*e=8ok7uXJEse{3=eOT(gow*Pv>`Kz#=}Cl7TW||TT^lg(iL4gnp<%+T zl~AVjaI>T{v3pZ5BLNLql6|fUO@P9PIyuSDS@7`&huFd01dk4DX;Rvt6%XleW5yh& z;i}fJzvo-S-W}@^eNEgkN+1Y2HL9Q6?eB-bV8?UrjhHk$=RUF}1--u?_CuYs(R%K3 zRsDCQOy8PyV>-3}YY@=a;Ia`$S6a zZ;}vSQeqh(r!g_<5}1@tXz&aE%NkX|~W`4>t&j zL^zTv%8mEP$$NOC;c5m^e!Jbl8r!I-)%4`hy}sF&w(8unDTr+^3xQt((d16ZeTJe$ ztN5cf$?0H`l33>|%4-yNO7!^T>76&;VK`2xt5M$JXW;5DKBn&^JW~sDaPZ1GR2YRm zMbZ*xTQ!aVXDHF7<*z7Nlja)w@_e5KMr<)tqr8SAJ3cK#$t8!2Y^d)fylz#JG(!?3 zYBB-M*z3?yqG6Y9xgeQBf)$ZZ_$#t`iO%w}-~=~TT^a;l5td$nJA!cXfxg=J$aKO{G>Xn6iI3VLUKaZ_Wc`mn-z5P*|4*dRV%n-A=*M ze|=s)T;{rRwYIh0(%0A)PgDSMV!csUG_bRIkS~R=NGK#HX0xq=%RbbrNE}_D;IKYj z`v$#Z?sh$V{v&VtcTq{{y2~!^8(rk@MJ1O1^ls{VFZW-#ey29}{)V5aMR}S+VFMSl zTfZMbj{-pn$_+1&AREvcj|dCz?!ph+Zrhbb(1 zjc`O2l4i(Z$pG7O!ZjkiSasAf*Y|J$CfctLqT!u8X3xh)@T|(T3Dkv#g&0Y7;ctN> zRDm^;3KGS^rh50&2(cBE?9P8qzAO{HO3S>EYXJ#6qWwp1_|?8oT`(q=P?Kk3X_}u& z11k3~%xQTn5Yt>2>f!;M=ASLpL`cyaX9K^A3qHS>lZO2=39ueZVZHlD;HN^eG#~xH zmy-hYAA# z$3&h>4li#VHp16k3{cX-5@52>8g}HBA%hQuzy4cUaTY0L(dQST@`ncyVGJRUuy;5i*rSep~I33Ote$)cChQ`5Cr0cMjyqKO-G)DV+2GYU*LxW<2!6L z*X$4-VLAcItnuN}^TAcS++Wh-yhBZno_5uCMnp(v8VEkrl5ZA>_dp+F0u|fgUB}d0 zjPUyGP(b?ed#4Qm&Q-*5 zG|e+(k?2bN>Z(o@uYFo7^B7LYMR46(Y?-V15N;D5h@y_?v1@oaoySQ@f9q>J#q4ys z6;hE;lT_Ti1_vnAimJD^W93knNZsbOsz?&lam#y5DjLzWd4p4?GCU)SsCvTzdwd?b zoX(oN!4xJJ$3}2 z;~I=VDDB!%JeSC7rz^UvBKdp+@KxpI@Iz^Swo$mNa41!;zqh4<5(^tWpInk5!kCyo zO^@C#GILmVV2Y&zdnX~lmS_=dtbvHBk(_oMQ5j4Vs55?MY0>}-tI@WeIMMT)VtXjP zQp0ObX4z@wt}hS)Vo8*g_DRoh%TTp z53Fpwryn&n&!j!D`C-@*`;)-9&srej#uDRq!i|+KB!$v|##-c@dU#LR&%`ALu@Ro) zHXC4#zNg*$^-XK2k9F|pE&Q0bmiZ7ojo_l9me!#k(V8Zj3hI)*kjTxEcSjyx4^bCy zdcg&|_x^cs!Sn0qqaa|eMqn!;Z=Y_Qo#|1pMy)wf*VkmrjM4~SCIa*M^vaDOzvS1h zk$rPjJ%CD))x%j7rAW(JzW)g-jPNVZXf0hNj+UbntpS`0)JO=MHM$hM7th1JJnkn3 z7G}$?V@fYNRuCYQiQ$#LlmNA5Ff(M2&EQ~_; zys~O)Y194LhlYX5ojvS^RX6t4bb@TYM$D|t&bhuf#ZHj7_lruBUuJ0bOe}PzcFOLf z!MRdt$h63GEPVAiJaKMn?!O-Z)o@I{-jog!vptjeP-`xJVkR`l5Tp1_1Hy__23WmY zGy4rqHJl+gg}d@aP{Ze#F&QC)PCjA8Dx;^&djnEx)QSg(B#BSwJov?c zBw@cehqr&M;0?_&7cwr@j45QHq7^BI$@GZvsyN46aHRaO36CW&IMpgVLJq;k`-5x;| zQJbRwByubC8h~Ss_PrlXx!KEH=~mLRk&6Q~e$Gx$N!TRrBCX{IUz?ab(-F)nlZg4y zGG)v7NJ^NtLs~fHV+2dOh&pcCmht%QdN?SQ7!%O;jZbQ3X21E0ON}F(!ZqqC(<|pd4 z#r*3BMy7y;QL2$llR6*~5-5}VBqi}*@sxa0s$;oMM6ma?aXWQnTg!b0^gb5;k-w{emwErST`B$U<*KROI_>}Wp6YNfZr?HKc?Ro-dFKlaJ;);mb@{O*;f zGiu>;!)V+|G1FJmzq*gbSuuc^Psj9R0F>1S69rfWkjesYa z7$%bY1cXU=bSk4#>2a){=vG6X)bQ0cEA7ZL(UT<@SvD#$d8c3i8a$3vH+opK&f|-; z8G+Mkr$Q}G{UC>1$J*CwwapBhi-Qyql|ts&8QM%dj`VnWcpCuKBRq5X{dePG$IDPC zu|rW3L5FCm%?IfSjOLs87R3m~TkT1~Ekm9+Agih|AxIdlA&2(3-Vk&aC#e1pYwr{# zX}4`_rz>rnm9}l$uC#4d+O}=mwry70MkOlsN3Ff~KHq=2_BroWT+L`LT8sY9G5Q!! zAA=VjZ_{EP-%erRD!5gvjeMc;}yq$VQE1fiy#l3F*A826F?o|~IPPUG`F z;S(!f_~LN?8=G=l=zxxfXg91Y4#Yqad@xx%F$>|j@RwOpEdTdF~|> z5Gv`5Pngx;XsqW?UL9^xceZz$>2s1(Sv%V<>pX4hG_hi?6Gx2`h5`=}Hn6Z?Bq>w^ zr0>)T*VpA;pBWm-J5LyAo`Lu29hk!S;jcF_?vNkS<;iq(e%Kk)MrkBGrg0p~ZG8*h zYwgvwTDM)$Wpge;D0Vt@^C`DK&+cvY>vu+rTHMR;Mlk717Gp(xt{-@&wzGCB1AeJ> zUoz+xK?z$SF8oC3s8zsuWXpNpbx={G(E2 zl=-Z{6l3gKd)z)Ol%DopP}pem_d)6$;qB46r_w0R;Tzm75`3-zv!A*g2=>Zih>nTY zwFU%_j*Hl6-VbDSw;t8BR|JFYi~7QEWPVwl&PbjTnnC%XslMA|+V+DFHx>$`soy|1 zeKJ0w$}w)kT)ZnF9>6$#o`|RFhMB5cX7g*a4P|xHVKExM{5nW{Mwbjc^Cz@5>XHj$eSN?t_!nAKfFW@oNy*Wh2Mp5@}Z2>&qpTJcGL_R zw;2uP5IfqAI$_ziKA}w_-FTou`o8Wz%IzlL!JW1BRLV~K}P87Ur{{s-D&NHv(esy%Ze@9jHxADu-* zU*Kumc5)!>GupFJGcDn;lGt-Zz=%oUB-P-&t544W%1`xdz5;V_Il;?$hZmmmA8^l{ zh>1R4(mU!3te5hVx!8P8%V3gjf|-GjH_l%UPu@0OXmeQbw)b01RWi2_ZmTpnPixv- z8%VIaK1>3eCTk}aIyR_%VPyH53gnjX&z~8_7IDAF1-n-YlDTr+^Ar~BaCh6g!8t`)!|y_B zHK$@=*L8?Y6~r=q0s0kUM~PaaRq)W{{rWxGz71NdTak!Ggg z+q8e4fRXEY9-x?c68UkpQqv&!RHq+$-#q?E&o|}4mBt;l2pg~qFZihDoFmoH*WW!`_Pq84 zYK1J>)5(`j8}YBIE){Or#K%|lze9YS-5AI&jr>?%%7Ec+;xkS39qceX1;x;FJF?!I zVOzxRMw)lEZRXaFW`^(0u;;+#^*g|F+nSYHcA9R0*sNkdbMkh_ldcUtiYtk^G<1r7k6?^>7B2d;MGkdZI?aW-O5G@4@Ho{i zYp>YL|F<}4dufig{N*yXqxgNV_CLeH{&K8f*c$d70EGk;?Ehk881RyoHE}jDHgGoh zSJB+9wiCM{_P2^iBP3(OFl12GlWJQLj{$>mM50@ zqCa;0KnQs8%dzHN>|57Dasl(+rjQbxjOIiXeX~!30u%8oAX*fwcQK@302K+sD<@1K z+Qh9ULUL6OT*j;*hI35x>FU+)53-Ezc~(&n<=7&(ngL0x^MjW4HxH{8y)lQpFzT=j z5?$Lz_rP1jJ0=g2oc}h#Akv>h6}>a()V*lxF~O#9B7*CW;soWKYw@z64k=UQ;mS0^ z<~p=C0w3k1p)A3&4e$;yp$JAN5gM0~-#fp(oX(znZr|s}#+#DQOFy$r4i=;_%S6&r z5KqmoaCT=S@auQ^GUr64BD5^cyL-5GYV?`2wSxb#znM)v*t6W9-Sc7X&84-~)lm2o z=x3|+1FIb>2_osLo(BY&>X3k8q1ui$?7DMmw_DgJ$>3bri?o6CrDglz!jV8@-` zg;#^tTW7<9#Sqz>xXeeTIWl7D`un~uVIkzvf;l0K64p!PW%y(fch0sCym^-8S-AXA zcs*L&sdf)%GkFzmJm!clfd`+Qf&y!g*_1N!szz_!+DG`5kfgU>SVi@sZGI4-g=dG z_Rt!JF4{Y*ppNZPn8P2L81FQd?v$-o%`sMEOzlO1InXRo2Wa~)HQn>R8I8i+b&iom z5}9s*y#(x#@6O@2a9UcO3^|T0OWjoT8||QmXpIrSKynah;%CzSg6)Dz`N(A;*PyP1 z@%W9ZOv-a&wKC;BDQ{^-o*H%<)B>ODrN%VE%sH2~&8L5$EAH_IB9cOuRoT4Kgq}Q; zbG4^0r*F1NHp=4**hIH62SalTU}S~U-P1{JQ$cJtXHG5OI4fEX;v>>u;#SJzH&yAt zk&5;7j72}IbENd8vKTRD(Klad*__H{deKeUg53r|)U`F{s_H4_?Lod}iRY;v>4CX@ z&2_5bLsBvo3Dl&I*y#Js1LbH6OJuV1rZ_8nYV2bZ*t=g0>FebcM3ag1j(2||!yGc` z2W9$G!c#ledrsGvFJWA?i=ws&5s@rKi%- zd8)8hs~V$F-s__H78b@%!igY~>(r>9&+wF^T6zr`HxQ@|Y;L;CaV0a$!z25iCZk6?NS zcO3Y#xgCcVsS#CeBU}i2XaUMv1$pUB$%7s{1kZf&zTWJZ@Fnu_mP~0ee-fcc5sbbu zgp9iL;60iSy2Hjc-W?1U5%h!IMF$-B(35I~09Zvo!uS=b;eb)GXx6dIiz)9}`;Foj zg1QQggvNu-q=BQ;bay!=OoZ3Wv3ct(cP5>pVGRfuDT4U9;B|yRcwrWN4aajGNqI`& z!xf}L?MtIvke(TJcAU9ZdtH2buluZ#l}}YGRqGzp=N}hU#989MPpA`1EnA8nELbXH z06K!v)taPfIwIIk{^ilgF~lUHmD07dJ5@!WXUEn$%@G;yRB4R2Wy{Z&guRMo3)Q|_ z0`mE<86i{o$3>D-S1GPTYHPe^-(@W@^;l;oPt1J2ZybP4p89DAT*$K4flBm4h21vU zyKB+#P|Q8OTDe|3;KgJl*?S2&-YlyS)f&}!)s`@L;3@y|TGk&s2ySV#Mi`q-MwU=V zVb@FB)!awj#hTVt-DQNynCj~e-PE?1Q?%najV-zA7Ctz~k8W8)_TeNZa9GqsYk}T? z+qn9~f#$*?5B~mfm-_i48;m{vDV^WBeli=_%4n(b<&m$eFjKbM4qt`l=2n8!>>9 zFWF&#I$>``^jOw6H|oIbilX7>dd}(ITX@{3#~+3L?%`A5{2O{Nv^`MNEKF|9W)^QZ zj7|&#k0p38L%VG=9VvB$Dcx``W^7Q=(Z89|yp<$8v;SAIm%{AxAbE`II3*N&J)<|# zx{iLqGS#hpR-n8L<>og@cuMyG7pXutLPfW-09OqZ?t!{$@dFl^55d#di(8Z{8wa7J zDdA=fju@42k&$iPeNt^k9G#&R;%O*an2u%eGePM=lG{=^K1^)T25*MnK99bjV*;D1 z<9f6TG0q-H1F;kAhOZ@YsN2d<($#DN6*t&RUpa<*DWmm&HklVQI|>jljezvHaliEN zrD|BO;FC*=U8&9{Vqa#5Jxhsi{LX?&!1{;#Bk}?;etQ(#xhH+P)ZZPtuC=sO{}aCQ zw>c_RkWj$O+6tB~4~C9Y zM$Kt$y!k=HCE6>^6z?)1<0gyhqeJ%^GRx@q)O10B4FqQD?&U2}@Hq)p!sij9fJ(EZ zJhl2HGl_2m9t75vxUr)KmnF?1KY7A@S6bKS-kOfp;@!d-CVF_aVlZCQq+75tMn{wuurpU)rmEK#$(OZ^Nv zk7mr6xbnPxbXm@&cXe)D=W=_8&Yq4u7vc=U??OV06?7t60WnY(wJ7|hN?ITkC}V5L zEDOGJ8#jOEJ(6DhcC#;yWIc}-UR6AC;2i|ozbWpT8aRQS!iCoSLD2?OXz z@A#dJGMe$#G{U}_G7EkSONga9#F@bLDHQjud?+g>mCVtme0_3F7{N&*lx(O&UoyQAB;`B3z6X1o=v2lfxs^G%Vfk*$5Y_48BLp$xQ8oU?X$ zg45f|CL!|qhJ;!pz*`+`w(PBN?nvXfYUALaV@MxxPafQ74&Ub?r)ZJte`&(r{bU@9 zjj^LoDvrH>KXx}kw)R_P$lZf&GB^y){i>hvH+a z^q^pr4Q)jv(Q8t22G~q2;iHplxnncWXh#O;F^Bht;+?vk6&$UCZTf1H$pV;@`Jtpy zSW3i*SZI96BWOx zH1+9V{*ou)uP|B*kvB^!0i+#iy3SjDmnix!7Ecg>U++MA@e<>}(ZSX!0096%u`3Mp zl85*rzSmR+E#b|~;A)J>y{N58QU%lIyQ(Zx0h#TSjT7Xqauysx&?{z$O?or$$@DVg z7L#N<9De4J4mN;MH`!?c;EY^958qGu(#c;-iUDv?#}t#W+{G0AAXNYy)R{L{scPly zoHH{R00(u|!1r*P9imgvQ3QHy?Q5*ypt*q}`i(boGGLhDMQwIW8NYvr`Bac^VL z1ZGiZLAYAOlEhgum;WkI3JV^#9YVutOE_sFTESYxrgdE+aGxlk!*>dwPRLE&&zJXH zgl=T$yxmlUVYBSc2Wvypqo;EwCNq{w$y|UiZr@eS4J}B`_3YBD))$|{3?WzA%KzLm z-CC-?+r~f8v6f&=G!*w!e8lR*7@d4&&0}hZadM&DH=~Grn|Bn>rHl2fnF6u3U-!k( zJSW#FtQVH-4jP8ZX-nA_zZx&Fkp5bHmUrUx73Ryi2rohJ|E%hUcW()x+8(3c1Acrt zKvl%`pQ^!Mn1zam{eLM!wc2LPzS!Sod8vn?s4)NVd*lYiuExFs`$R_UyR|iw(>Z7D zZ5s{LtKQNL48*8)z)(zFpKfV|oNnfmGH4Fr7BTF1BTR~J!L%~Wk%-~4e&elz6GD0_ zUW=Y}E%P3p0jJV8SVd1#$$UUH)UzU!>*wALt zbELH}WVB+FZ49cr)KtYp0mLD++=R(2LVvlf#OHAcDl!!9LLN3kJ9`v{ON5u1`IkeI+rZ2_XkUk=Barz(agY^QF`;= zAHKq!Y_efS4)^g7ZtoH|I)|IRtbBPM_~)o@T}|Q+G>gQ z1#i(mfR}b`6hn*Noa^-$(N_q{jMYDmQa&KB#}`>suuA(RcQU+@h#R?OpY-L)#&5O=HOqaFk9R3*Mya>O$)C8wsdL6 z8N_MhT$sL!ft$<$BDSjV2&ws0dwoV}v*<2*+SHpAAY}3f%Z!3_Yk9Fb&G~{K)kf~< zzhtVKw?JeXZ0cO)7IuV3*a9)le?oH#+espGg}Q)H$3F5WZc)rj`jHeoFsC4kwIYBm z-KlTCW-WgPDmr2e8n8~n@DjdTScBVU?XglpjAdn-U5AGOq7<~DuLwf`2}SR4|JWr% znAI~N&5;|rc<3S_(W%xHp?&G@t_daAL<$(+!ofH>G~n|j_I4+TJvdwr#vUGjG^qDG z^|%IsH9((9bZ^29bxNZ>X*?Mg27(!)M$u|=$uBxG$HF)!d{36Lpb&^3%&>`<${^ZN za))I)kJBqlQ*d0aAPY5O3hjf5oA^_=xa6t7tW7(Mwh*de>W|Y7IU;-1;DP2I z;ad85Om!J$mf4X(H3{=csa6N!Qb6gOE2x)*?y-ufraST-fVfeSD8Jg-y6m(YV7U?` zkBTwwZ>W*INf*S{^cquFTLfMh-CKIDsCkI_;f2uWOEa<6C#kcfa`QWJk95(PlM+?) z7x|jtujTFePkz;3y*b|=o9?%q+<$LAtKDryi!H|NcRicDaBi`lVG(*)rb) z<+Js>4jD|a^GI;<+aHs6uQhoTS21ijG%EJ0Il1gICySm_)SngwPt*{r7 zs!n4>@T7jU6ux<*)0y7hTqFB9S(me~Z8@c*9QxPDY;Iy?Pg$6KfAszJ4~X_(sbDDm zMo|eUKVIR1fF%E~|J8qQA^&cPbOV~Q`x1ZeAeMS!-wm_lmb+*&w~4@zN$HRk=-sY^LlVXrcb&A=VesKn-2>FOnQz&PmweP9%@ z?Q9XV$bo%u3`jquz@@S7&5iU(2k0!rq6M3m09ms3{Aof6%_Vlv6bkj2_=%cRpr?00 z!D9N@YERKW^dTFg8_y8|)Sj%nywfp$W}OHKLh`TxRw~(9`>WN5VWw18LQ@%QLQ~Uk zkJ2E&hS5MUW@d$ID5Aib+3M8sM;U}ASi~fCK!paB-R>E(v`U;6fgX5r#EeDxjkA`xVOjic=3hJI2yn*Z`W{TJE|>e zIRi$|P8~RG-x$PrnDgT+0hbYxLHDYMzTEPp49F28nlGhi-PK*I?Su=3fFFhvUu%dt-p=kKpWO9H6%egT zI9Bs^1IsSmKEJ&_Vk^01MrE10t5noz+zpC+l$zxumVBC`J_P7eRa`t{bcI={&?-U! zsa=h%4=961y|f8OnA6vbln6_@v~JG=1+mqIZhhNO2tQ_kwYH2Kg|y!82bNE8q$T(* zS2I(SRWn`)O|=GT7bQMy;L6$5wA(}sSWs81-pf?{YLfS@lzeTCahmI&iC{izvqpFH zPvvd`O_fF@wh4w36woD|jBQD{gBK_U-h$+n_$gy~7k>E5+E}s4%POd54| zgY;?0Bt}-OTBSBVx7gD}L0}*DX=WGjB`krM#V_cN*@HX+ zQJZy65v&*-6ipCd7`_YrWPwmv#rMjbh)Fa;#D`vqVB1B6%fBtOn>m)v2&7tCxO`yH=H8``>-c{rk zWTySO;#PAzI;}Ruajg6H#^ZI5yVh_`e-KmuR8UBB6iHis=kj!Z zf7+E-zSg9U5fgNh_4SL&F8QBzuo%dpz&CGXOm%=FP5=~9`hTy8fIH5AjqU!UO+2kG z4H%6>?0KN}q-TyZlpR~iNt3A-Cd`Krnh23PqPT=;il;tS@Ar&)rP5H)gp#xTmL$yG`VuI&!E;06I| zvq6&$kVDb}eSfJ%?3%9Qk@XE@JPM|i8Ucnzl*bsLUwaY$r86@+reH=hQQ$3rL=7;a zRgP&1!^IXZ`e^a{UIHQWej(h)vCCckoEH(c{(YA$Ib6lyI&JPO{WU0mi?} zGfTS+NcsdxA=T1m`yg{wDiwrs*!OAlsYy7DALP@Ch_V+~`vPTi2$YQzZ5E zSHG^qNe8(2hIoi6PhAu$>DqBKRUASpeb@m6PDSSS=*T7Y0&vzF* z*=s?$Z1(|29hzkl4G!1YrQA*gx|}0Hl+G|*3PJs0up+x5lyE#e@QaIQ1a1qf_&4d= zIRwr7J5*@Xox7AxvY1BoI(D#e+OIbF>_W?GSFw=mcR@3R1Elg&gSp--gpbYG;`_2h z;eI9l zr*izsDQ?C`JQH2h<4FCp`zz&szov!VP&Pwt527ejGT87(=cc z{&Ai#WW&d+B2vr8eWXt=-^ zI@7qtS<7wp?Y@>Qh#LB&NPBeD)?)^3=F|nVlh!N7e;0p{K!5ABsJgPZBP1XoU1cC3#s3HT1rW0T|A6l@u7%TP+i#}_ z>bi5|P$@Jnxl+A-5>;>OrHN6ECsXE4KnT1bvK6#~$J)H>!_FH%Py!HSgv#Mr{<@3A z{@&i+HplaiZo=BJtAK=uNJh?+@vHl3$X!T|XPY zQi3YUDdK+vT(kL~$fQ;vv5i4W3HO>$sHBg6RUUE!e(^zag)GtqZ#;#h6B2zTUOYt7 ze9@*>?{Uo5ETEQ588pfRX8T8>liW-t7SJaA3SxCVRcZ0qQqC2<>n1c~Qc@#-P-yBx=>amn4z(Xpa*Rh5NR)IX?aOwQE zk|O?oOY;KVQ4h&`8igjG}CRcp?pb-4Ud)gVv#9k(yRwz(8oVV+FJEOmL{xg3AjZqmCw_ zT!=m}iy|ZSk0`K!Qv;$pI~D};aAsXVO45vxT#z6tkn3M*ee-DksHWCQBlU^rgq6nb zb{IyF)9ubf)dh?;;aDS2F%cG_+*%~n%!P3QgH9)!OOk9knpuA zkrD(|S1AR`@BS^)x0~=*n{1xsF{5bCO@Jj5a|9$C)zO0;UvEd}<1rl`McG^aB+1ES&J-mN#FIX`+Pk6|o3)G1W+hD(`VsZyH*ZGbsc7H1)3Xuw7HFV@UXn zCWeS2;6s)YCRlzQwo~f#jBOXOxTDXi#8U=;!VIQIfvexAQajmGutLouL$zChwt>b) zCX|6Jy`T^&H_KYQ8zeaWn{-5M@$(u`hB!nKSTfhyl2~n^6fBL!Gq_rL&C8(o5WSxu zxvc5}k?~Kc0xS5>r>8M;2`56`@$@nL5)&lQjUWx4;#obD(Wf8X2@JJ$RA!8aDX^rY z4Un27_oOmYo^gZ*i7&nz)D`a@Xr%p0%aG-Ny2w9W9xC)@6^m;b`{7-DfDeCv=yTy6 z>k$@56B;oy5Ql$oN>#!LjR{%m2NLgh!)_511F`eg;uS+mX z&QDkQehK^yPFX=NMw18Y z`2~024=1<-dKdhI9V%?B{36Ju0Opb-&8hlOd}7`*nxBb1{y?JB%GitT=oEM40j<_A zEJ7km7FFlu;C??;ziSTQgzZZ+Fm7{)nKEV%2WVxQupX7%7OEpNDXjero0}wj@TBjz zm_F|IU)Rwa)Pj@ouk=na3f^ZfI9s(`aga3aD+@f^a#c+ zbv6`I%47*xXb3VvP)TlhX?qHNC4&%6w?Q>ODdx@ioV05tFp@7a_|EygG2Dt>@{uyZ zWDwaSuOUMD5C_fg{7ZpplFc(U!1aHsnag(EPJuq>v|#0Y$W=qUzj$Be=x@*Xog{#0 zpg0{mew&lSL;pg;B#w`AGl<%L{vKe;af!TPz3iY~?&bd{wFPK)QH}5+tqP-+Dmk&Ck;2Mwoa12CTaMPS9*`rt+W#=+Ng}v zrnzEqW+)=U4}9zMq`|njKNy9RyUJ(jIb_DFZo8fI80RawtXO|vEik@6wTMidX1PYr zh(%7Lx*3K5zK}Z8NP*de-AYBirIVqPK0z0cHiT;w(jd|y*{aKPJp7)er4v0y%hSeP zj<8NF4(J8UGK>h__Qx2-Cd&)G&(mYIKjs#f!A~ z(yQ=nF9NL&EP=1C>r00v89z_L?$@ z5=Fx@^_TVUu9LiYx`XDT%U>ZZ{ln$lDWw83)Pv9!i#)Iv88dwzRcrF~8r_L59_C{58!iUp56nCV{6 zqF6ogo>^4B0k=0i4`i}7^zyR0$oW~|;jZEKvxe(`#1%!wH^deeUji8Suz@d?#Ca3 z=wbZFzz0h-jhjCU{N4oWtj<7nXF^i=BzmuQe0umU5_fz^GW)p{Re)ehDlibnoak(m zA9ar>y$tN;gtCE1rAu$P01JlbybH&guHkVE&qMOe(kegn97VeAh^wZL;~;{?7)1HB zc>v2tg03fw2n`W(uN~Cs$dP$UJl9f(X@SJ4ED^1`lBg13!7okJ{v;{$oD@GKjqVK8 znP7MVl-$>o=f(rbGunDQo2us(uXEy>Gx)B~Kr(Be9sovkk2oxo;5QBKhC3cJj%_+S=bV17 zuvgLpQr9emnwFs)dVl9D<<^7U9yP%kWdWVM14-F_kHEVKghSi<$fM=7VN)L3?pfCO z3vH{~G^lcpIjWjcaT~EtomsUsyZ}N4kMtse?BJ3$feQ|qjB8X4=Y6w__PgU152#ao z8j^)Fa;KchHrO|*_z5B0|VG(*qTzQ zm!|_4!-deWOq43;Sa8ik^XjHWt=j4h5EeBT<_t0|Np@Vct{cIz3B2NDNC3+N;Sf+^ zl8kKBKI57`Z2(fmu|fzPJ;GQo^W1hi?c1CC<>xIk)N{30uMlp4J6S#PLL@S9<)fuSgKm5B7Lh+>+wj$LP+BVcA&|8Qu1}v`)vuja8(_8 z5xGW%-2ScZ1nw>8L}XhpG3;}UiJw~iXvjKXkJ)hxrQ40Y-vAJ+NxoJX=b19&~7qXrPP&5+FMd{ zAa}k*q3dS7bvBq#O}d_|VV>Y0TKXA@D~Se|C1{HlK3;yf@JqV1F#H!rh(x zx?W~@x8jKz_|u)v-7il!VN;CNU+e}LnYlG>*0RjrXCZ@w__-kNSsc~HQ?^|?|C zTq!?nN?S*I^J#vAJ7n?}P336S()F}YN@gdpPD@z2osJI4kW14_rAiu+;K}m-lD@^1 z@mQmWV<^7f41FB0-#L&;>j8Hp?qQ~lF;V#&sZq(sVu(>zWyO5bJ<=sk zItS@g8TG)@$wpCxUA)rY%ow3YP-bFNtD|nL>ugwa=TOZBOJ;EIrNR4RaJOgu9nER0 zT|Z%$PfR1W0YdR;SY-NcB_VBH-=%)utDNP=lKqe;l7YY&+W|t!C|!LUid>z%1KTzj zJgzJl?!}cJ1vM3kKj|#8sz{LiICq-bY-O6C<*mO9sE{$)RVO9?+k>6WhwW0k!$k`5 z`qL`L7sUVRDgBM}fPa+gYXS@^mIC5D{^Qv&oBtUo0JM?-+Z%wPX=jiB^8XWM?Esml zAvd3BJT1XydR!~bpnx5dR*U{AMl!>AWpVLtu=9jgHKh~*pVG9c@a+l*ib)MG|>*P z)RIhJ!7s?1{vb07I1pw9&d7BG_{@@SG?bt~?H)%3x1?OnnnT1m<**Q5OJOriun*<> z)g(SdtVB3SQ+oe?J?x&xWYAQboa~CSXuQUndH}tJ4YIkv0G&^PlqY5}^pz^uyd`9m zLb5=!17E3VoAQ1iKi1=~{STl@O&8hVo;=cF@hW&bbLT`YHVa3Oo?Y6u2f62P^g*I4 zCd7zWN+$IgCes{Gb^@h@0g|%{mV-n7g>O+luu51!%o{TpeUeB3;9G)52@By~5r%^j zHe0ki?6Hm!-GP-f0r(a*geoqp*OWNEC=>LT+v1yDL+rW4yjObKVda=Kj3j<^DGLJI z_2)FQnf#;g^51X#92Re`C77o$LSj7{>~Uo9Ue;s;K_c zWWzqsJC7_`j2l(Wellm|@5ZDf_5uuf(%v2F$LkB$FPZOly1TLmib$vZd%xSg_kR+o zfPgrEZU_MStN-)-#}mAcCT12+&W;}c7_|9&rbSF|VgSH^A_uG|hyhOjkEVD2=S)Dx zu+qQJ|M$u#0L#FJ3cxaC9fuq1kQXhIcU&PucTUAk0;Om3K)+!wjU|XD5XqQ*dBxIX zYWERsHt}F?a;4sIpKvG8(_`BMCvpmXxkCOdHiK-X3duKQv}E9H#pFt?nNZ7^Jx0&i zc53Uf)D=#mwHST_jN8bwE>h=hijV{-hU+p#+h~;I5`Pyonu=cb&d>(4^&fvxvXD@n zN=){Omrh+m#*XA-%}dzdo7^S=EJ02=ol7h8VVN{-iB17hF`!j zuhlT3PDhBuvQ946h?zP?C#tG_vtSqqTh-Q(*#Wt>9!Xi=kZJ3S z&@YVl5EKc(I&jTZ)I1v5fy>h?c?}Rlh$@y7XK1SyQgvl9Z~9ImbdBfTwcwNQ4%_2U zMxA=>Poe5G8%fC5`W6qLsS5FOhBBrT_VD|BWai^ir;-fm#{dPn59QMj;;AfwOfyg- zd$B)eDO5?CrRLG;`tduCm5*j8S1w~W(Qpya{p4$9bDOw(Q~PV|P3^W&b0G;wEC|nw zy$lTom_j2g($my4CN1_TMUJ$16^E?rqfROLd3#@om~ZpHVoL+|zP4jTeaRW<;p7dn z3hG#5i!e5>O#JO~U1&$6efP9IyOP_L+!!;a_o0>Dcr&b42RA?MQ-C^#Pd}f&?M8}X z;b_>Q-g0MqrlB`};Is6nY?k-E$1uG#zCy?75z%ODpT3 zy1kz@H&~5ZTaY!!o3XNAWM`ZE%;19Hf&#Fl)+uqMMpEw67~a===@C}X$vP06qX?QZ z{;)fLrm$a<`F+HK)H%1ySExURH;GQz%!2R!xoQ{a2sFkJ_0JpY$*qFzQI45C;F)B( zdfG`#8CqbOb;O!x^c;D)e4mcMOOJP39d0uhUYP8q4Ij0yBG$HmM?2UpDzfyyQQK|V zv><-O=g%9AU0Gv`%NF^{&T3J{S6KR1am31*yWhsJ_4|H*Ahg4878@#rhJYS{q2krn z_WIzyzon;gQpv~epU|1VDrdF}JN*A~_RZ0e_G`B3*tTtUY}>YNtK)QRTOHe0cWm29 z$F_B=&$;K!cjnH_nse)~S}XOwsa0#gkA8bU`xk(2ZUk67Bm4gyjm<- zkn+4(fMZZy613s7DTFWP-K4Jx))ljWX-}vUQf1c+;>-(cb>Modw`lx6(3!ViGP=0~ zEl?r4=a8?tg9Z%|DC)WUH+FvJ)%+Byp4V7^h9Ef#j!GzRObeG%{wqSgi?NLv{!Fz{KR-uSD#^*+frNTUFr^h7d__ueTngz zx}`bOK9cNCgL=;Oo!#*fB}N#>SDkMA>t*7*T^+d`#U)_T^$x!|KTi*PKSd&6j>#`< z0{WxZ`)7s)y!p42tc$&a zy|cZO%U_bLv_g!)Sj~W`E+EOKA^-u2{JZe`=RE-htuo-=|De37Yulgv*{Yx}$qs_>U+Jh@s^9^&5$_Hr%hd+`B`w;(bp z(Jcp4_ge#;R9iwbS{XuvcA!-VWcr&M|Io7BwlKGLvco{%0Wve+Ct_%hwjxwg7*`_?zV&FkZlujNd{~G?cHt)e zG@i}qp=m#CtU!1k?t+o+1Jk3Z?Pt@wHgjR$f)3zFtvv?MD=cc+OYmAV(9dP{aaBX~O zN4$V6%epfnp8LA@lK_%v&4Dh74IKeqN6)n*mEX;;{j7IvnP^Uq#OQ*XWIwUg7P+wg zUDTk%s4lPA8VQQ5@PZY49`0Mf&*g-bx`Tjo1$E?wwNFEdgi=jk1I3+UdQ3PX*{x{E zvI~{AO{TMzUpydQLJR?Ej;UbAw?1QK-wRj0M)En4PIU@xKcWXng*Br%&?rxHaTtrn zKMckd*}B>Nb0luaCZJT-eW>PM7ot4zi)@s@XTsvHrhgbdLladSlwhje0=AAOoZ>Fn z+{3>b@m+K8kFNN~d>hrs7CdIjoimAw9hX$QvMr-4D1Fb!P(@~q?2bF}PV+1V%rsLpwE4+gQUJTMs*1MtR<0U2_lZ~LkHc~*;d<(mCwMLuJuGZp zU9eqXS3y1HZTR+%U5cAfD=-&)BHvh^$Yf7IH z3h#N*he(4)BGd&T4sXHa%n=_NRKL>9t5ruR#PcH13@BFl8b70mW=eX7b#ll88In`4 zRTUwboa9*^)EMPnkQO>g7D>GP%w&)bvTG}+~# zW?j2vt5tgULR%0mQf^zhr(0#8@1JqGw|G&t z0|Y;}8bS(=9b2WHh;p{-};1o4cl03 zcEpd#nzWoGRJlwtodpIWN#Sboz;E`z)ry6_OdTMtOsC1`!Ew}|UAw8lU@0BatMYWS z*>2b49tY_d{KY=2{>qqBNH6NC)2UV=4rI!$NwlJ1?c3nSG*0xlO}`u30uDT3CUe{; z2}jf$f8YO|sKz?I`*)(65p+jw3K%IZNHEnOqMG3!qFRw{nE{b9pY9q%#JHW+FwS?Y zAA)ilV;!g5ts+&H=XhqNY5r?Q#2&z@JUucbjBsu5VpB}PBdeD8BT%R7luv>)@jhm) zAmfu1fT9xh4WyAz>>TKWw)2j@;Nw;lvsIJCW(#NuT)0mAxv>k~I0u?N> z(20Q)f)Ku6zh-tY-Bt7VhHg46ci{V-B^0JhYYmWnJGGVQ zeR;m^#Q0&MdyX);gi(NWXCJcIgTMX|vfJ~#VQLTA;@-EGIU@>7(k~9o_)@JMg@YN(ydZZMO1L8Av7RkN_ z3a0cUy{*?x-b3Zd2VN0iB~ak_@R7ax5EVsiSIrMv>D+HWYnI%;X&#mw;6t7t*upNE*Fp);b2#IVJ*VNQkdg%zYK2(B~ zsmyJ6bB$*nh*DvVyiCv0uX`IFg*QTTz+*s?Dsg}TjFFZeIR$l4Z4M81 zx`8=EQ+#i2JQ}HO*(mQrg48H9=^=z>LLi8^2Q%x&4~~v$_dpV2CE7bT?vUo6iKN`%xQrKQs3h?Jh$w z*Su9Z_HsD=_HY9&b>8N9wht>HpTICSm6W2rnymKkc^)Mie14q1=UOWPzR7YN z8JH;#HtMNvtX_SQD@2tj$SRWS;w(0kt!qMB8#LrUXM;6M$0JE!i-ZcM)z!9@aVIT1 z&7`LtRTD#@nEScYer(g?2I|gUOAuVFfF+YYy}Y6MzPjvL6@r%tv-wsX@kqoFr5%OK z_QQhi>x1iB3w#AcCrqp2`;32M1UmCdxc^6PlNBm8(K*NXvCW$|v+bzdspfm{iXJU~ zV0O!5j>PhCX+E$nSo8L~(#<^iIdQh;V~G^K4UibVbf@eg0xMKg2A#(XDtzkj^7k?} zXEJqqihJgAPp5&VX6Ii^nH!V#uCwheES=oUEStjWcze^|(;uS1jn?@}d1cnCM`kTQC(+0blPHg@Z|)x52%~Op75wI)Z`xXBW>4Bb;3kmw zuw6oA(q<+*W$Ng!@)VfLI$y-czvq!`I=s~iDP2&oE1e^A@cmD}Osc0O~-SaPZr40ZUw=u7n*vIlJ zKV?jbBrmyOjBfJ4@0|#E!`$baveVYm>azURlg%l5*CnslwLxgZK+JFEfuMLF^+@%H zjth4W>suX-xa(oxG@s7?f=`P7WHy=|5@251Axtp(CHl{XC zjYh*m9gk&tg-Nc6aLQ7Rp}dUX#m4Ifcar1@Egg{rLKpTukMX_E5>bi z%EutY#z;1P3q)t-Ln4(e=A2*$#W&|P7P->A7IAhHV(TPDnvj_MErRO#l@3NMA#j?O zZ<|x|h9lkfN;sWp7Pyp3qZ>77YHzF~6T)dA$iLa0)|gXvM3+-GF-(UHX$+J^B@WFO z2?jm!SS+R;lsK-nt{9{h2k7uF1K5hVuk#LUR+G@Z>&k^o^R_Rid> zNrLK-$GwZ4j|(?%qy#2oFK8F?dtjkRO~FJJ%t8J@YB0pKK@-6xSQYF#6SzG^*E2Ia6$PIhJj4jQM6kRb&G|DVV7m|n@I8d09NNVI%8GPt ziusfP6c5Ajl#6U%P-v>;sN8yN!CIs|lD6clRg-B&y+HX<{lY_BxKpschIhOuBSyU^ zL|&5FEu(ouk|>zJ&aDKrp^)JsI-c<;v1A`n+T;PWO=E?u2lk|AL>N$h%{?(qs__BH zQ%=MHtFCL~(~!&b0fciZ1#Xn_Z7vy2dJA5$o*wDA_#-a|UiTf#6O{C`H#{^{%{Bvo z3**FQp6fqNtYu^QvjEHkDc6dRqT*`E#5Eqx;B8|yvZJ zV6v|gZm4sdgl(k~=%(SjeMOTI)C8$i8RD#>36Ix6NrRF1SEGcqE@f*~L zm|k)kDjra%7*cCnMz^Y|S1sgCQNJ}#TMB>;(lVr+C8axj}u?2KUShb`C)Q= z=1z07T5Vu^*40{T^UAC?$P8R6fh_qFAW_rmR6MXiA#PTikG{|b3|OZ@5T-ORGoyFK znkjMD(0zwpr@h%ceErjiLOU82Pw@jR*NTO8&6n^lGMI{ zsnX0bz1~Afn1`hIV>KnrPXz`A~gri4I^rDW_|*|gb#v+?Li`%S`3t2c5S5*^Yy%YB%tkP1AOA9gXUr=s{F;xFPK zC3{zeCxu-dFf>;Ys)2@{Ke2U5`UtASew+YH%=bwah_?lL4n+}OKNfv^*+E}i=Lt`j z#*wR#sGlI`v49G7k56pK4;mo!zkVk)&V{~-xI!ere$sWZ&gn<{ftN?tI2WR#-+M-b zzLVe!je3ZTqQo6SNpPSsO@Ql4xF|-*8eAZ!CA&87IBR4$>N!eyUsXH_=XbIv8aZ;X ze>P7fY$=&&GiC|Bm}|Hi1KXTc#P-~6oz{#1#&lxG$|XSyloa9n-8YQJbsDFaxI4%J z)ui7d$8MOFqldDjK?n^oftCt6EQfFGuFyQ3D^Nq~q0J0&y@eKNl?-_P1QNIM7 zyomYe7&V|HI!$y_fF+#_xL+0gLBD?-9}_*F>W|!t%|+CSBO1*Czrs1lZa-xT6<;mi zVd`VsSB>bm65Lf*9{YRGnxXhze@l8byr64$sG-(twKTfA)_IC7NwL)u!*XLO8qcn`>vFQU-aF6-;ou6G8S^Z%j#FAU6dw7(Jl#A4;Fxqi>J|n zN$ia#uW|~mI3D+9@gQR3c6(Q{+%bXxm$O6ifSlugNg9h651(0Dfs^|*1r3KqPX#M? zIP70C(h=(@$-c-)wp=ATrgbLl*Z^&I{~KDspA`^I#UJJ)Hyq#;xL4KpjDEFQ6h{;&bfjLLD(HRwZa zb-1I0fSsNFC2c`9zAbNId3A?u4qSrDr!ps5yF$r?R$cIt&vbL)wSRqPl)O?EIvB`{D;91ncM$V}8aPwX$vVEZ6>L%8Y*Tm!BQBr(|ZIi!w!6 zXr7lUF`DF8q(D6QpBJ@CaW~#=m9$7img~lnX?D;Lhq(@{t%-z}Xi2g(4~jZJsp@J4 z`&GvJKd_g-rUV2R2|!ZY{Ja`wBOJXb6_OEd@0}2%itqM3et$HaVh|&214+`W1v2VE z6BHzX+l6zW58UkAyLsfbuf#Hx5Dv5zCy+3|mKIl_$_v83O5fuC9bcs4l4uX9>&tOdBRD}iNWX|e9&OoaUoO{4V@hVYLF1%^n; z;NYFN#Y^C&dyu9cM%@6hD=Qb$s@7iMudLFF(Wm>n2XU&6i#)B##~deS&7J{FX4S*V zySm74%6w_gW^8_{?nk-+=EB#9$2k9TDsC_{{_joUXT*M%)H4ZoKwEig1cpzqrIiuu zc#WgKr5nP2Zk$V5r;@`Qd&kpivhD=xp&$wo$-{t`SD(KBQqC+7;0pNiIk8|^;{w9m ziF!hdpYt*1@xvv3l$pq5Q6W1?f}L?`cnmz8H)kyyO#f@|z9VlVV)|tr2bD+{2x9pL zSK299>e^PAK+?8R>8~Kb4hsPzdaCfYRe-o%X4g`Il)b=k5QPhZ2L2s?ytP~Gytky5 zem6db5Q$o9DFs%(3M+SZD)*r9E@)T(pD~h(~ z^p?e718M#-9v!;Z)sh4oU}X$7rne1q_|S)v8cAy<`3C$TUMaQ)N=ywg+007$&%;g+ zn%H{>opbk{jjxT;XWF1eJ}q!AjRi-uvU0pPmwBM>k&d@FKU@(DBI6$7;Tr4@1S`)V z^YIR0auQtlsw}nK4x13$D!{HH#23KxHBr9!qS2A;orw0jJeMNa4^LtWW^tMG?Ma14 zr)bBIlpOm}Z?t5(WvICp_Zc{Xm||dvjYe33{5l<%DL9M8r8%ffQ?`Z0S>`zXp0bdY z>N#28>yoiO6P8z_;Jzkb#ey58;&R$h#f_jF0}neNg5Gjeg_^B(T6gA0Fvu(JX!Yw> zt_cfRp;aSX^}XxcQ%Sn~qiv>hnwTHV2>_ne~ zqQPUD2z8up?Fgd7+6&IOK^H|9eRmx*E1+3WdfD*rRRv65?W|qVXBKW}3%!uB40Pb$)%Gupf4YYhvdA-dWI9 zRe-#w9Ly8MZrRWK%xQzXqsG;pW)!Ka`Mg(+u#whcFr|T{c1wxsiFzR{Pa!+Rmw)B% zARu-db$A9?bQJ#xZqknAC2oPW3su-@g8w%4W?ywTSs%k7%RH?&$~&z#!RURPE-d|y z-u#UQ-j93Cjt?Y>PcJ^-(x0>AAeJ`HuqQ=p9Y2_T-EF5IwdkuNkOY; zYZFbCOjlLeCsDa=t)@F%>SiW)UX@q<>0a(yAXrR^`z?k>`K(hdCMrc^O^SPbpcGsYN{Mwkq2 zvgofs9V*gg6RvBA8bpkX#{Drt;t%oZUej8YCW;c|9jb3rb(Ke(s-+SLS*N8k3u=V z9z=}|XK+06d3;r@SEAwV=g-G8kGwOl)l1tW?Sz;Iu=d0CdHI7UCA>ni7CrkWFekb( z{7cc$yYd~#gYBd9@WF8_*3Q?%8$OR&^V4fHUlq&jI(MF%Ug+NXt~OOuyIsV6i#>+B zkFOdX**DiJGV!5|rfV}yJf_Uj#{xm+MR(Jb{R55nmhxJn5W(4A)bvaiVDCyQ56m|( zK~=77t~B7#C=tlt49R3q1@Up6g`9vCPoZXO1%Ah4i9-mO$PS~)!9#P&75EU*24k*I zrJ=O;Qje}%I!mI+z!9PJv!=`wt12^%48yqIUV~kradP#UV-en0kl&xonW>Wo{uhy582^#s1;ICQ5}-)py~$Iw6k}?7Fhf8o5#0BeS`YuoJp7#EaxU zIM(giymsEC8_BLG)Y9d=Z>KRowh2EJ+S>fBOJ54$^ar7;Tso)w8}j5ls80c+s`ijcEWX+&g$(A2FT`%WMpptba6@4Q*5R zNBS9WLcxA@tuIINjkxO~BM1dpIoG9xpUh7M-aK(E7u8xHSF%*~CNjedi(X|@mK_ln8{L|{-mn9lV6Ra0W(byBR(q9@TQct;8BzIMVBRKKu zxXubrZelSb(oQb>urF`P-%otEIUQ^eDLc2U27i2-zxKuY-0=4ow}F#gI1ob^{K~{>#OB|K&^!Fwc^)Hy5*avNd%1#|eLvs-pcWBcktA&DG7G z!h(k1TypCZ2dRh%w5i&tYL)&@42*8**>^>qW;@=q07+P2{0K zg40Bj9Nk!wNw}I62D_jGD<-IkK=+A~fYjFlv>ccUG8q@XSuw}MUvV-xMyczB#q|O% zg6qgsMgG0d-fuc!LdmNfH;FYIC>gxiimm1(jGqUL=-jXeLxJ$V+~@`3y?E}^5=X++ z6r_n>g4BR;Yzo^TKwXT#8} z$U^HSSMlv7znro|V%tsAm&}c^kUc&wN$G0ih?N!`ROuB;NX*fG;ygulX&9Z1eH07^!ld@S3n1Uf-*_PMiuB%8;(MC^e zHMcK`RFkII{%A_QxY(C930f>&BM*)qY%uH$d+>h{gCG{Z>FW6)G%UGt^8*f-zoYzo zb9s4wJ}XJg9pcT2#+TcD7`|=I<)1R&U1^y+((gG`4GWd;dk*iito@ATC&l=%Tx3w9 z(23xWn`{NfHYDV!^s*7+sv)Qx=#nbfEkL!e1lbRW6-zZ(4+&91{Y9I!?ocATJfTAy zt#^w7)v6(D?{Xq>ZRW;vh9c)iw(sSBNv|pIrCwIw0-K@Wj^QCpO7ngZgZJS|3oGyc zk~PU!Qe!hCXl0)~4|(9CT(MLlXAjppit1_xV;i?-fb&=ClTPlCK+Bq@F(Uwr`Xv7* z9szWd|0KoN+;CpyK=hl^uVeOc{91PF=q%6DrG%_?k?;%1k|MTOFA!V%H!0_Q*YT$> zjh{apd0K*X8;?m;Bf-zD3oEh}3ULSr&^{=k*8}WTC0@dH34&^}Tg8BwRzVCcCv2Jz zMyBmX_?@@AGu+POC>CYYYNBnD0TtLg4z;kn{pInrUhw{}z_CyYN6xmW1ft*pI0n7^ z@z6rYw~jUt#D=`sfkq0!*n1q$*ETy?^8A>+!6Z#_w6*}UA4GAP%wK2afci{-#KH&4QzrG)wUvm=Rl|=Q1|+^;!NJ zp;c6nNn8Hi3CO^F3EsCphwaRrEedPdJLd}qK<9Q_z&1iPD+F#@?n@JVcNZ^R7u%!3 zUyLUFV-hV0p^p=)R&$T*uXt1&cD`{2C%G zP#P7Q_N7u;&zQa^_g9zCh5zCAn@dcbV;q`fyMK82k_8vd4 ztQ?;HOmA{7W&vQ$fP;B?&V=^s67 zVB)dOMkRdBnk+Q1p0R_&Ms_>L!lw7DvAH5HMPC{knkSf^3J6va6K>%8yC1y&M{xwd zVlX*Pii3Xs18OdI8Fta}#SzT6K`ECYHW?3%oR%ny0WmAjz_U#SD23Mag~?nf7vf}K z{lGJYH%`-~*j`3H8Bpcghbgl)Bo1jEuCignliOEkHWhNN552qN;)<3r5Bm(p& zCaYmC*hD-8I*@oD3V`nABVD@ngx8XWFOBS1@p{t0u-Szr*b;+&ZqO{=M?_>7&T5Gf z(q-jpG3#LF%}p4y*otF%8wm!*;1v`oFJH$J`E{ER;n}%~yS3Z0AK)8yB!|SdrP{gk z(+y?kJD(UN<=hPWDPB>CZ$nb)eM(aB=zm+G_X53SQOlv*FpBg}?zf?2Xv-ZZtD%s=Hmwy)RRf)qwjmvj7Q=g+ zU$`8*2NesG#SBlyisdLokkq?Rz9suT>YkeT_XOxl=6dn_EIkik^a5<^6M9x{>*sEj zqHgmMT7$~;u>|l+rt1WZgKW-^V8?gapTe`6s^r{$f}S-JMcTKFIg9NY^o2j9-2Kvy zk=tc|UkEjeAttyxnL-4&rnSZE>d&2Lt-W=~WRIisA6J&EbusCC-+T5HPP|tmO&+#L z%&nUoSD+oRrF3JWh3RViz|gT7_tm{vlg<$;%AS4fZud@!j-xIjeQiQ8ExEdcY_f#L zC%+`Kavcv^<(km%j^ZoIeQs$*uA)4bH^z0|L4a)9QoaG45hxQcBRzbhL{mArMCcNa z+Cu52`Arnn;N4ZF9RWjQLh2Qt8$H25xaOc&K6(l93H%>*(H~1G1cya`6aWYE9qPaF zrv2~gB0wJc`);d$%|=zK+V;Q2P<{1$2atRMlKv1Nv5Dw#=sHy5M0DCC%K2a)z7%6k zX)qgW(2V+Bva_{-s;#P=Lew6vcRRlp`zRK`WK^fU6cF7<0~7-?Lc%1-&3jJAoY2(l zc9K#6wNI4BU7g=+Te8`Q=gm#+Uhn#4hPXoK=~;|bthgC)dUsN zzgNnHu&DKh_OmHbWiao@V6<5wu^a<@SoZDMiZ;(de9ohXy4H^SSXtgj1xBr_--cO~ zk?rCG(N;0O93IU*9l+dq5kU0y+z|zS}w#+iG!@%CeX zMx6-ItEf8YecpdlQvGV{)K{SEVMbzWO`RWjt(Abq?f1@ z$JQ;16FEa-|Io#=G>i`Cg4=ZTC~|wW;c09r9%GeXpLXwW~2pL_|HJ-)&`Lwu_&hSNQ^@{4qDrRW1~b zlGF_gU9JKif1|ORVz=Q<@nc%~O@%+w;q zH?YrCvR9-7a9-r-1DHmFi&{xFa_=a-W^Pw5R^GfJ3zkvXdd9m)e5#PcWy=f~ zR{NM(Y{R2w&C5vVJr-F#s5#PE;{6NDbGf@_otdh=`1wf~Jm&%|g8~&lRVUc8`LRLE zERL%}_l+0Gha{}SJsrm;8X7gMqlLmGaHr8_lL&btl|Bwo8rKTJ=pY#VXs*?zUMpW5 zC|jL(7LQ)~=C3eg3stF)y{Ftn4QA2c?M_SsI@C}~(B3=Hhgg--*{TX~ofoBYKf58X zFLb+t2%<2MEmhT!;2a1j&EYQy+J05Vt0IxYQ_D$>0^K5FFPg6lW8=itfH{WJm>nXa zHn9{3CFfoBf1|6Kp|U2(zC}q0wM&@R zV;|%bE5RGDI$2cTG{1;-^9rYY=CRSndABwWS;cv#oYF8&)602h(7wwSoS^wW1GAW=+-!uh=I;V-O34EZpCN5LHm4xkY$1FRAL-#22CfGFc^Z)5sbUO_Uz z^B_|IweyzdU|9qeN1gXs$tW0fL?5_vcnA#NFq1XX4MV&1#P1S>;=U+ZOODol^K9I! z?`*S=_a+3t8j z^3=p8Qrqr^VQ3L9_(&-VBb?kgIh^kfdQ7-#RSYNBo^a3Td$e|~G-QRFo)}zR(l__u z&#F1rL}4`o8SJA^scA$fZAB-j;j)XdrVwnD)^3E(6fw5xTFZTaA$Q^il>p1ckyz(F zNDRqO?^SZwGb+L@0Obw>?#JYPt18%xB45DWJOjy&-62t=fcQh)9#-*)a*=cksY8hIl!v zXb|KB@H;rEjZr#7IQC8D1qb*YIOg3q0{jj{z+eFp)99Hn0OWAM{v9rhr0^d}3Bc3fKVzkWiCn*`OkbpE5r0EQSnlLv0J({cvqFxfb?&#tB#AA0UfrC6xSj6lYk%PRwA}+@ zf+p0MCR})jZ}H^4 zNL6R?(+8nk%7e2cr!^b^Qq`tEQq_7)YPcq9kCnD)wRT~;y1G(pkn%IXoK&2&0wz>1 zF@U|8Mhkb3bJ{I#k)Q!Mc8f7Jt-;d0DiUC!{wy7h`S>?7ZjC%q+*J{x|R@?%(O1pu7I=zCjOq=Z35zo2mwMze_j*{1L0G>kz` zp0xgGRkpo44s``!;Dc~j)#Gd2^Nme`bNXu>d;s}^#^{K^eM6c5oLAyA6zL>=lb|eu zxGIctMT0T3M$NzJTwvQ#^_CMKa6i;(edfxa5*cZ(McGQN+Ic=W4;@M zT6x{~6sR!YUOa9t-;f_a29Kv`9}5^{Vzle6)|RGt5|+hFnB?J2$I= ziCi{%*9@}YwbsiL?)&gj=ma8TXuMS8W!`$+l3s)dlFVz%_0}C%^hvs5fGQSqq}d5E zKk04ZneaRfIkdk-_>UrvLMd3FV4%wuks+JwD$@{M!?!I;DM!`+A-dgIX~%qwQ*;v->kcRiP6$Ra10t{%2CcAm zM-4Hie2KeT|w_eGONr41ySa=iKr8IEB+8A>w zf=Zc2kR*rH!EJ^RhHmQNhyJ;v7+aR!=)o8zD%7A&r41T__3$B5KMi|lkqSKg0+wjC zXS>1d>KSioh;O^`uX2*brZ8fSc9^d8m$T0xkK!#O#3Swn^Bg1U?wTPU*)hN*Hu)^_ z2Wz59Mh&v;r)Ts6Vt271Rq|dtKUDXER30{-V$>})^U9~gK(3{v6ChG36r6-UjE$vQ zwy(*UUJd_j6v;BOvemMMI|M= zCD)?m@Hqw|q5wi`zu?6Pj+2Gw2jwCxNsntsJ~)CB^~s)J`1;+6vqdg_ZN6Rer@tYR z=^=q@^&JPKd_DhaT=a)!NM_wLOPvrW=tddfm?ArRo-U@G<+8mDbwx9XEwgwX?luMGD%lUbe?6iD!(1q;n zdzq*l`fjqg_-j}4YE#xQMTWZBu)DZHTm^Sn>kpLB&jK(`Cl0Ca&1;+$$#76@U!twL zR_C>?r@g-$;5uD*DBQqB&EwAvg3rUsVhiot%z)GfVodRe&ti-bBV9WRormEHDX>9D zw^NYv@6QTGvFF+)yIno78SNWN5(S`|B#*>8`^uytY_Nhtt9>79sT=OQAcUn4s}hz$ zWRc4<>C5*Fq2)G%Elas~Gs=c?&{{#8COKPARubO2+^)l=dMf*L;D>AL0R=~J1$K8QqG+c3u34t%rqPgt6DH}T$3h1s$(s+S;&4Dve2L|x>dWt zk&nX{O7$^zWGSj#b(lVKC^KivIh*NG**Ng58;Hubjhl39QZgl@;AZ&Q z8cz;-WobrW%GN`#@M33~1Xc6V&40(ElTOLV=NW{)4fQ9@gv!xjtY>frR^~-t?ij6n zyE<@A@xwMjP}c3|^_B*1i^91pZvDiWdX9=8iMVDqjXK{M;UJ(spaSnB#qyTyhDWwx zr%HV&I3kT;@3}BnA3Br3P!~tTIPfs(5K;X6k@!i8jUU^k`I8{Ky1mdWQzf5J=BM&& z@1mMXL9QaG-qpv>{U`*_Ot8_qn_M2hNb#En;i*7emh( zop(=E10k(P4jj$iqi}j>%}!VLw+P?A_|X0lmIm)`ZqfnJxbg4xBXXuL?)FaB|BA>l zfZ!Oh^A%7Vf>ztK4UeQ!izPwE5yY8*@+r-Z8VM(YORg|Re0ZrlDe14~FNDXg?2k`c zIPv%LMx-DzDEALuKuIf;u;!D)EJ@0LK|k=QbK3gmt+j5*24`LxV_w~fE)78@O>+j; zX+w*YW%;J5k+EyUr6Sa)M3>!Cf5s#D4N_M=YM^JnzU>Yo`$GRtW+0K5Bh74?r>0qA zgtOa=Tvm7{GzkN2(O+$vSIn~c!G^;D{m8^N3_=w-L!lEvue(i=abUR^ja+|<8mT-0j=zK6 zLXAg{-t$sm?E12V*`^0$9h7L?eIk6-+>Sl8~l}WR-;`H5I0Oxzt^e^tKF8 zqlo9`&RWSH3I#%-#1^VgBVlrr*GPkQCZVo($i72`k4v}oqIrxS+Bm~cbYu}+$!T*s zPlcDdsI29EYH1d6D1IG9-txMA z6*VkXyK_Jjogwl(DZZOYrw9em6xXT#X^PQSAHPoyIJ0?~dcP%2&KYq_$j%x)XB|qY ztq?K}a!p3KG^Y_#YX>Vila95 z*PZ%o)0Bs?SD%n3QwkvL`P`pNL}TJkzT)m^vxG@|2tWW#0C{)QN#a>=DMm55dlMaf zk2Lx*W&YDbLid|T>Qli@$@T>ceXZJwk4QEgq3+Zy`PH?TIrT7}h+eh=W*)j{<3qNd>}#sym!mDGlg%gkwdmh#w{wWLK2 zqU=qC)1>v%WNdq#jlpk_R@sUiV4j|(e0y3`lpNxwkY^<0ml%nf5bMm1$WyQ0y z+LLtH2WX`M4wFq3e;g*;H)zt0>7D;LOlEuxs;U@lWp@~%&qPXZx%?Tp=wb7MNrq_P zj&SiABgbqJcopFKCqr!rLivG(_%V6|7*8k6@}}6$icniP+>%AL6pb;XYH+_KI!RY< ztul$UF0PPm*=D}3$zmPT^r>>q28%C7C&-MUS59}Iy3*sbH<%BKBaHBjxOD-VgOpgy z2#=;?Ffk4BOxkqY!x`|?bF(ff0^!0x;JWDqfJ+bnuFdF6k3Zl7P6jwkvQT)Mcmi|& zZQ>Hem$l*4=L!H9^6C@7VG;l?-*bS&Bz)Wv5AOC@D+VCM>7h;W-~XAoqyQ!^#%DkX zgU{W@NQNv}vEsRdx#Gq)b79({g41Ddstzxl3q%yN!KPKc>+`HbWRM~5=C6KXc6{XVhDQV{{we_%p_UaJ^D8Qc(VXB2?GCn+$kGdn3}lSn40`C68dX? zm5t+d0%n2@_R1A9T{hwbf-|)M!I)nCdP?{iMTfwczRs)1kl7zCR^MGhK{n6ciG1Wj z;KO3tm?MtY6}ywCQjWq6M-OQlnX&D%$eccELNB+q$%I)9dxr>J{Oed>5kQEw=ZEF( z1tK72g@{WhRN-f(*Ak#Z!zv6Y^7-*=gGsnoiOr4}hq;G&5%x#)$%J*LYr0tLcy;CT zJi4IW1=~Xd`j^Iuk5T3njGuYnq(a(ksy`N%i0#9!Iqjf_g0OtdeWlv~e#wu#AG+m{ zw4odn^Yl7fZV>lXzW-b)1qrkqI3y4?CmhNLcw7Ski&6ed^S1x;R7UbY|6&^|J$7pV zZ?#hzaNeQ-njy`zk;r_jMLXDKNx~IMr^2H6fe>P_1Sdk;m&;d)wQIXfqmJdZ7vjV$ z&)dyRqM=kM-Pv}-jG7b{cDJF%uV{49rOOGYMTaaw>uGkiPD>u`t)9|L>WS9W9p+iM zH$^05Eo#dFS1rxsdot&_!TVHj#U)A>^*WM=RqGEqlHZWqv2moU%1n5JqV+=a@ojk4 z7URoyf6r}%q@3YS^3|Eqpz_{nlSylhCNu#a&Gy<|>}m_{{z^^>P^W=-i1{!29+r1W z8pQpxIaPfb)pH|d%ScWl2IO}FQcunXFCabUx@eMkj@Wa8VkF*(546eobjp{l7YkvC zlDQbCYp)X-^&R3bS^J)DExuXAv+Up{orfSXHr!-iU;yO_KWI*crmu74)7h?3n+894 z`R%}qof<03&nb|eDExZwuGSUWhAe!x=RO}M=`w>4N#WCFj5M`645hZjEAhtJfV}cj zBrh>(=@hSN6cr<(57D8dnT}F)D0Ai#QtR2l*rOGryWz}Kz3#pIh#h0Bn#4jEhUc2~%=ac?Fb_iBAA(ykm%h)zQu(C^u!~F9 z!H;0Yn(FU#Sr*+-_hhH1o)vnhk?hNZYNU~|^8W8fWJA32lx@dB1O~Zzch-(n?CUFc zZd=;BtPJ&+@O=ycgKR}}Svpn9NSbkKy^HINFA+mtX&{p^KP-oz19cPm|69%e!5^+< zVYyQSj%3k)B_NYjw|BBJ5jV9nbux6ZclsAyAr$~70%SD0ZW>^=$G%`YN{g~P>Q%RW2px}8g7{4eBTfe!oL!Gt{;$`9L1NW+GN%2cxsKCuY-8g{}IK}qzz2Y@L| z%1XnDGx7AJjF(vUt0_M8k7F?GurvZ0qI<%<9BDi8A)iPld?^b*hAbRF?LCL2Q~{+c z;cPNN7OXsdu3~&!Pldm-7Oa}lnJ=Ie-zZn`L6fC%+PKpB!qSRi6VZDN%Yx2Va1Ppv!GZQg?+`3A|aIP=mV;h+*If5xW8 zV`9zS&psy*j}V9DB$jQ6$xNk)#2DKVN$M>Ir#d#dTx^OtMrW|2OaGi?i9wZyl?XqB zbuGoHA+&Jy$(D>>q_z@Ct%oG)ZedB0!>+WNV=EYnwTt&MZ5&8S%YLbM;nY8rX+TZE zS<1w&g;5eb#=H$_twyDCUGuJc)49z(*M^on`=hv966I;u=GxG7w^`+`eJ!tbEwH8K z_53MvLQrx)w;FtZLuoa#J<%La=U0}3k6R8ozxjae>56zy*ZJ*`l~8XT8JoK0@Wy#n zEg!`n=pshV1|Nf8u{c3jaEI+q~B9o9t;j_cVwzCd6#8 zc;)7O!;b7x#%*~m#&rajr|jEYtYDfoR7uhbZYh=D?|;035`I7`HD|vv^V`x!_m7PD z3jDD1eGc&*qesud!zE}4?(ROi;LL9*=FPfIid0p)MGU|AJJKoh3j+=3T6XPReX~we zXKMh3O8|*h_Sa;E4$BKC1D82*zPh{Og!>w|ego&E#)Nrf#pI!ts$-f8?WCEu=S12o zZD!qVv}#ziT7c}xRH?yh&ezM{5*g3_&;BL?kI^Yg)AH(S*2r~5vRlYA2WL4n_f&{%mx9PDYcr|sx$rd#zQl` zX0#KKv&0MrIMEe@vD;*plfO8%q4@Pnfr1k+j)$TNjZ4o6I(LL$B#V6^&JOAC<-@0`W}mGa7t1#E#?r2((iw`1S-l z02&oyhIoOn%u5G)Pl$##$CY2N{=KkIWA+}w#8Jf~&!y&oz(*?x zKSg!W*Sh5O(KSgIggkRx`HKWIWSK0V4bigOa~X+Je&ZR}&l@P^Bg;Q9R^_(n_|;Mc zDB0KMB@1=$n{>oaEs)fmKW(v?z#Ehv6b6pt3bAtJ|KE)}CAAe{3R z*AEBh1kVqMAb?R4x0DkOar5n$8+4@$h$A*seSNoxA!7He`x3p_BDal7^kKaz9$EW zHf092EUU@delz^AL7<||z2f7dYjG0C^)Zj)-kN!IM&(Sz=9!F(WO=Q_zwO%b7f) zgNdvN0z%LcW!M-S)Z+*8gMv&`iA*ueCsYzMw;myJ7c-x5P0%Zjv}}1+?-2)SXsD3 zO<1`)V$%SLsB|&|Hf>9M7P96V4UrR_Kok}OPoQGSRRgL(DY5LoNEc@cU}U@2*0hK~ zwewO<45y^*d?gB9?viPvJKy(^A7C6=pq8(?y1?qK>+AiswD?YW<~+ktRg&35HS49!ZMw zU#}qp2$b`5Nr*!Ikbl82Ek1UNlP=E~=KIkNXh(}3UyP88L|;HI1`g|rC*%llZ9%yS zZ9kc?h7#uTzi-dK{k~|w-f;TKNulV0$h%?%7Tu)7?rmCz>ytqZ2bO>-K?~!&pxyR5 zLpb4#4OppK8mQPvqeUK4-&#y&Ti3O})=BVF05 zkiSC5fMrZf-UyDhI4e5L^Z&#JT40Lkl}M9>HUeZuiIWu}Z&*k-R5y@A{(vkI`a;sX zm-54or<4V8Cgl+SaDRR@Of9k4m^V}|pM}%5U@e1={gamoQHCYehh6x!5Pj7z}5FPjk>tIS^cm&oUBjFq!=4`Z3R6C#&@E zuLb#S*=?{O#TToagV~ST~m#!S#oFPGo0Ak@y1wv$^~PS*1L0`$#2FJKuyyP z)@Pn{aL@t4$RU#k67b`UDvN(6V|-7Uvv z<;cu3;zJEY2Zt3APNDq+NSv6zMk!X~A!wTCIo0u=~Roq{;YpA_Hj?w4VbF_2N;C? zn4Xc#%zD+0AS<=BAnjXAbt1{JsEn;o{NWuIhKfT5G?y!H7K5_x7wwr<+{97Y=uj3= z)WA$r1J#LzG^(6@s;Y|{RM4eQumIc#;%9Bp9^(&xN~=Ty_Zdw}ox3`=%b1|}1hH_$ zAw3~pv>3tJ4w^AgRFd31LB|KP0z|yic#wd>lMsytB>GqaSoN>2Okh_^_6T6d9C8DJ zl@z`9eIW-h2K&=K{Pt(9@|ZiC1AQH#Ap&93J^#}6<9C6}{7Z;pK5BR4BG@&BQpsYg z(ccV2%T!aUMA0M$%1bIEya}4dD+i~P{VSW^b?Byk=ItNY>yFkhJ%vY);=|ZXSW^;o zDV&w80~bdY&H0fE-{O`+$(_UYd65B7FY3n+0jyNwgrNe0j&LP5U}3DF;1IG0mf~%b zMvn#vq7=N?*S?ww^5=3cT; zOpEJ5%6L8I>PSb69TzjGWd4$mU^Uo17lRZy?2dvP&O4v62QE_zbNu~ntZ7usWk0FtKEH0@^ebh0ep^N@D)p)J zC=2|G+UDoS->Yr#S@TBi9|eEf>%*YDaD1)N#3=>T=Z0}o`fpj7PE#1yYZD7q&XE)k zZBpMt=1gk7NCReaXu%=kEve7Ab#|f2P6D#tNZ#T#>>XH5w zih%J+VDq;T2{`Yn>Ozb(Dwe)CT#TpOyzdm%j3=RFyewAxftE!eWu%zm1|wJ0A$U4L@UsCTd!i2S71?$UZiSrptPs3 z-0B{JWQu~^0xX?i=ilSWca*}!u;A-uf;Me5rGzdR zU2HxZD=19TSjCF*QuGE-vo#stNG9n!UdOKUsVXBQ!>%LzgBDzqjG4|5&} z2`O+dh?NkWU3|uc*Yr0CjomqJNSHChm_-??v%jBnJu=C#YvVr=F2Ts=!$;9T?Z zc(%_xS!A^QYTygMDw}|q8J*BWd7C9)2izffb0PyHRt6UnCQbvs4I1e+{QGKu=3yg) zD@u}iaHk8!II=^^K=O;$GprMJ6-PmHQ|a^`PJN_R8>2asCQHnR??(o6tuUIrP|pv~ zBY`%X0Tb^y@>|g*^z2OVr!ue>L~7^^64&^%tBA!A!F`7st8mHq@)Cb-VyOc1 z^#=y?*jE<1NE46S>&I_J6Bz#JUqXCZyu-oiG~9#55wZg%CPsLE&-wU92b4Y0tGhD> z3S!+ejLad_(MI&F&>zRuQy&#iBCoqtvI z=NB4g%M~es623$AsH;?97;%p+mVjzRGQR4PxfhtRI$HXsb5FG{cE55(qaOjgYS7U* z9y-(=1S*u%ReXMhL#5)Oz93L2mWs=AEv}VMlDLxW62cRgf#U=Twf$c#f0D|Dq=HB+ z%mwls(B*7l#Lg)kjRu}!#+S=WjJH666c~hR<<8-bs->^&TL zOLN#dKZj}CtP-irUf#TG{Dm-R6Z+0x*okLdl|s?C!!CXK4BSYUx-A*MYTS@s0mJ8P zd?&Wh@3S_OM%v!!H~jA3TMXF973XKjG#&vNPd8mUH}|&nov+oPuk-31!BLa7UA5ZI zY3pR%pmq@}Z!}58Z9uGI6BE2b_!tt-mW?&d4^o2}-*ks-3ok!E?w%LNB~1ou9znC= zq-}K`TF*@(5|4-d&^ou{;`2I5j=$`R33e5RuPtRJ6Us@^hQl)8h|Y|P$ulCZ5u38` zOB%i`S*&s&`a+n39m({?ii|1DxnE5!_QL)y3&O{7X8e{bGo7;zxRuyZr@R~;61L_h zb2H<{j8G%tX_D(3R|~ePOLkeHZ+yVY^MJ_~yr;1!mtXKO18UI@hUS^j!{x z{``Sj!8l+?*5yq`Sr*xwv=H!pGeMh*D&Th2SfFWujyz}9M>|l@4Xf9-z$q^*Sw&s% zlkXwcPA*Wk>2lwZ23q-jk+2o$Z41Njk2-0ku%?rq z?E+Rp@kpIYUulOk-k3YPpc8cJXw`N+&gEJo*F445_fQ(Qa*5a)5xJc9Fc186Rr3-sTMKrboDBVI0~ytb0^g_6b5hxQIaiQkA?@C0PY*J9UIe3)N)>eheXp+gY>kro!zsqcV!&ZItuxB#B_R*HG`fO8ZOuYStv)%&NlAex zTq+^cml*^skWzQ%y=k>DM&ys^@tTi2VOi%2( zS>h$7Y!!I7cGOlxxD9Rb^sXP}OC&sGW218k~ z)*T2$Mx))vE!E@(CG~0>@0Qt%6z0BI<%>2??)qGbDD7dQjUXU}fPpDRGOi*G<)ms^ zAbxSRzHn#%eV+>o#ghsStRddbh)%4J!HEI2)xON<_%pnD!z{Ev$TDv=_DtC`;YWPU z_~^%|35pIhr_jpiRr2UU-jxl+BaM_oAazNmk2z{NNGJ2#SCon?D-JZ?r%KB zk;Y>yZ}w>dybS}LSx`Uk=Xp(x=@#UK*wu~5klpZ!$)3-P7ZZAAJ$X~L@qJ+5K$1{C z*0)}<{9OBZG=XL+?A=@_XmOs|x5BKu4jK+Xl2Y?TN(-lS@GCEG`B44C zcK!&_AeVPoc$(pKnbCYwmHQV0fo%dsW`5FVK5cs6NSKeQ8XUthB5u&0x7{|&Ctd@Q z#B^CaIEiq->57_~{`U9(rC(%*$C4(la($W;{59L{=f<$ZM}gV#=*%bX+c?R7u-_muST+7 zO|Ah)P{(y0!8?hF{g6&*D_u;+oxc^HJ2}gVBJQL^-QL6mbj5ezH1$DC-YDv!UYe$? z+R2sLk2kBj(|b3KvXU@B<$337FodW~Xfrc{+{K^o@JL;}EeIHJR;CqA+DTA>cIK>+ zn(pdD2K)YXoV^KNan~eW6NEp(W+w~^dIJLpmL2%ceUVZZ7Cp!RNW&Z)L^5k|H`^>; zu50wg$PRAUG-uHSzJ&sRkNh^~>#@$~YgdGgwru1#`fbY9rN?TvY1TpjsuA>yfc@Il zVjxvmpymdzr9FZf>F76|;&NR-jUvV$8}2{fK;Z)(T+%+l7=Gi1y1n4SRo9?G8(e+8F!-bQ7@3!q} zP7^1@A_4{kB!jFR{PrGFX6)eTpBOKhUNY+}5>cD}%h#7 z6OCtx@!~&m^Z&ikbT@~ry4&euPiR)sZh3a<-Q4cTTz75T{)yu#2T4#4+2TpWdxok^ zr^H;J>Tob8jD|USH{K22(G?pmb)2!fR8?qiOzyi>)v$Uavg{_@KM^YM4 zrmkXj{K6IDjv&6Y3XYXCZLMRdD)L)q!Vxz!E^ImiWQiF`tvX%gK?5}GdbO!CjHys) zX@swauE>`pyQ?b0l05(s0*L&gYy&^;38N^A|FT9f>Wkf% zkE{&^oe;pyWcAitQgIQb@45tpTYfU zM%jFBVD9m-`ykHX|9c#OGud}#ys>s7!g;7#`wl(u8HF?*eJNbraB(QFt){^Td3fvH z>AGR?=1+?bknXBgBCQJw&kx@?2yE7CRn#luz{yKftL9CRPpN-;v5(n7rnZJJ;1CzJ zLQ)M)#(9Hm?rrO@-n8T3k<)HlmnLcB)vAw6B^@^zAZIJ9w^pjK50BKA>)nT;2Uq_c z{B`+wS>Vpo-qCT#P-kB@T@A#I{Z3Qe#L3}Bu^P1|shF0M$FU9}_t>Z^d31q_%l>@r zANql{*Yo)GZ@STcOhwAqJr0S0Zx#h$Dx&|7w^0Ds?El>X57_Phqh6*F<7TJC7`N57jfNOGZtH9~xUBdKU?ds~$RWgjs(|wy8b_E7&((Sg1Q>~e z44!}=`Y>OZ)!}vAe5F*EFv*(i>H(Q|t&p(;MM%Dcq`V`iLkHZU4h@0jjFN+*omeP~ zX;D?}W5xt}D?!TI*g`Cp+GEcAvg8OM2-pAIrMN4Uau`c1&_!dzNU(-jD3mBX@g$K3h`bYt7ZQVdMHmZ7>ax??a6oc~ z?fy||1BkpUf>7)6e9cVsjW9iW-c#Ql7bTris#X0&-zOM@h+8t<44R=% z|HqduAHgwV-JgFe$p46<4S!|tiUEr8H1vNX83cUX!ZwD^&i}S@ol)Dd-{%Cx;nZQ? zqIT*)^If8-pRVbxixvqCBh*$^A&h1Q*vI0n!=u)|_3g+2r<62%Kf9$tMzXMcnH{}f zxf8^!!7<=)qA6C5g z5LgHwwzPRZ0SfMJ489ir{^h~lofZ3L+@2qMeNFzGNe1!TRA{M)L8TcqSYhKD#lJw! z3%CMBBZ^H)nyiX#0EIA;=)2H(BTF=qj;kBJ34$8TSQv*rt^#5J-^;Tq(H0XMt8LFY zeE_aPP=IyCA9*~_2v$Yv7Ggu|cNoJe#8dmJ@Nv=R<;Uu0&r;}miTtnQSebExpmF(< zxX1*4Id$$dw-(}7R_tZabKnoURbn-Ee9G9K$r5xkBpw;INyHt(N5)EQ%o5MS%3m}x zW(Nz8O~W<2`#4SO9-Ql0gn0tZSh+dfi-Ye<-JtIu7d528=ID+rZ1fclDxMQz1=5)) zbSU&}0*$zQi5}{neUCuuxTfFl%7-a=-l+m;br-f+$*u7ur~z|8aH2Iq)*m*k0i&}` zXDBUE?gG&?2>Ir$)(%68_&oBLS;9IsxD1RcMa^EKA?fjH++kTr9WoZa?e!Ba{KI_E zU9C|f38XTy5ez!wU-pVvx!Vf5a;|-8CrsFt3{-{hz{<_qNf1z^Nm<;7!Hmd~jw_4! z2gi!OFkByrDfL3yd22$>J0s4AY|rQ`d>#ai5_s z(iFm$cx>xFyjHDP!j`JqG2&P(Pnd5?i~Pk$Dv!HPK09ieEuVo%r8`Hr2aN`bAlnr-|a7toWWb6v-%Y15LaM1f?a13wHW#7IAD z?fgi@U;ocECu|4HyTkQk##mg9y*#whB|{Rgk;4F^k;QV2T@-1rSuQo}GtI_I(e)z} zOVIKJ^>~hH1F$G5wCO{tvP5tam4LL`WPuAY+yhewP0~I%y94iA@q9 zjHE*UZ^V)R6eoK-7ehc+-2ce1S~LJ*n4IWr zx$Js`f=F6VGOVoitnc1q33g0i*3+uLKsKi*JkQZ5z19uxHjO`4{W0r%*_{m#xQ#(( zSQw|%28BdO`E+YyGZ=8KpXt}bpVbL8v}znEaxl^)nb@{!u=r8a=scrSMX`d&R z>M((1*3U**o(4dTwF7dO>UGSGTFXL}kd(t0IT<@ly^i$x`S_cFG@`xp1q1hz;HD~3 zsc<4tQ@}>)Xe>tP35}Op1Xjd}B-$OxAgsb)wxDW%VL_5I*+7l%^SmSKu1r&p!wXNe zYq3mhr!jID-Kf>YK>c+@?-XQ1-%2#1AtK8LrlFgbS~rxK@RKLc&(EWv_4}Cgix)3` zalCuPrrQ2_Ku=4w8_}HrY^Vq}l&YPagYaDZ$Gjw7fIQgbE>+}`B6;lnHsdj0jMQK{ z?A9XbArIm<0xn;CsQlJm$N}vL zq-XG0iJEgA9sU~jeO4rv@`mf$q`?VOIY%$=;W)gs3byN-K%GQ8KlX`e(dQWaDN-?m zS;S7dRyO>5MQt$(0+aXm-r3owy!y9?|47~#6aHl@bY8CmtRL(dB*>yzla5&BtaD77 z8cc3Mtg-(cS$s&`+t0zrS)i<_=AS&pr9}<&ve3z{fw)@R z?%5wQ)=`KmG(#{`?L^87;OpF17aQE;zO#Q&+gutoAS-L>(fL(`C8}g-Mb(P*Z))P1 z#(}UB6q#NZLl>3iz}7Z4Pf&;tD(`h}(&43PQGh?kB_V&!2Za3WW@BrJPoSt$AD3)H&Z4tl!dxWhGb5mG^(Y_jHDTap~9Vz z#l!@cxTp>8%aMu#Wpj@{DbwC+q%QM6AUn!gUv09hRt>S(p4@s+Jny3m%Z~zA$y|EE ztc9SpSvY=myg}XB-f3aTOHF6%YQL!WvaQ#|in~f4Gf5f_K1A5S!hVsYR0)#4RVQ3u zmv?(+Y@+BoW}1Bl+GlWNju3#q+Qhg;zR#2=)6vnhH=&EsNP5WNJe1plh}>)I)3si= zThwKDDMKiAK6Ll1bU4fHYYP}~L5o@1E9^lq?N1eBLws%+e5SFtajpP*sq=EL{ zM>v=`hVPOV`wfSfZ}k9m3Qj#z0+g?<;hox~5?zLxt+el?=Cu%A*5vaf!Zv9y^mf*A z?q9AYU9d|o=)(HisQbDH0k(Ggq)pa8Brb9SMqdrqTKHRvIk&8|VFCU@DLTetPH>tj zeyt;69~MeqdoLtntc84tCQo>KZ2qY{MswsEcZ&p{JILHumlMH3Sq#xB*{05r;K6AL z8_nmQjQ+;6mhO^ZsAI`M_?;{ur^^M&OF}cG5G37ydtBRL=>FPLVJsa2WYaI}3#t<1 zCc@RH3j7|F%kPPJx_*SYwso$sF4ss_Hxm}4@jIZC#D5eVtpO|fT863;Ns*y(Ae;5g zU_iOqH}8H7$XY}}Jg8t{+@(Ik0sZg-HF(m62o-)8zS)l|+Mp1bRNF~2Y{GUdoKx)Y zcFZyBw#_kJ3hBl@EfV>9;0TZZOGYIzcy$Puv9f%!;T1v%;Z7 z;c1cFeN5$+zYc2{r!aOYBRE!g_*Bv2@tJSXj>D><6g3^$lLhbOJpJ^Rjs3wV?c1rr zu+M1E#w~P&BT8b=Q9+}o!Bf;j3vPbBgDAf0x%@>IU~)ni3yv?mm3nZ`T!_hj-qJhj z3TzkhlKI&D&MTmj?n2qY57#c=j!!B`yhy5myT&;|S;Ox}YO|nbXUzl54^5FLE4qhOflATu}gpz5scSB_as#b5pl%H+NgDFioX%RMJ7oYP}&$~pcp|5{e^} zF>AuVthrFQW*49MZ9oqGd3tRqyF9A5vYZ9O)68#{>_60LbOM5*@BY_jYnFWpy9a5( z&8~$&gd(K{|ci^Kq zX-9dUw*18kwv+f>pZ52^^~L`HrC`___ZhuH>4gx z8qLkj&3msmHM!N{+JpYa4O(yqCaP#dD`O3cBqdPKL$NHk5D8-uplx2kat@(Cbm}1l zy#(ah@GbSPYazLU`fO852~EXvA&R~`q(Fg+1QZc1i8Z(yQ8I#vgy2;YCJ}Ao))FDP zDF?4$RuRKFCHr;vX%B>0#r8g{D2Q@yQCQCcXVeEk%LZCR)QVnPK%N_ST7`(N?W23* zt>GO}gh?(yOfrfLjV2BJ7ax#U~EEUH7wlz6%^kFvWBuZ_aT zIBO_NuxB3cDfo0Z@~d}N_vRR z3D|?}{A^zVDps@!;q@fmQ7PalmkqqYK-7l>jH9J%W!w8fFd4oEIEahQdj$$!28Wqb z+{BxV=z*JI`Fz@2kU($4NZ+9Y9@9)lIMV|AN>%Jz61Epnl?dAa2EmSpfGeK{osZ6j zC94s#4{?Q`N=tOq@)h~M9bqx#-$e^T7$vNi=!?jy5}v$mKX{8AtJ6sN;m8KGgcI#v zt`>?K+(gV#T>?*jIRyo_Uh`>X7^=qHGBc)z)ifp&rKRfAy@M}LFwCU;dz5TEPf-&**Do?dL59QAeO zwk_@5uQ80GySJhgoyj<3eoWwsGCWNxXa|Wj>l-6f!lO=gc$?W4y%en1Xy*>EVd$cL zunFnd{f%&ZlZo@mQ0YnAYSSENGr`ne5}XIg5p{%i=vLD`>z~yq&R^#oT_Ta`0ql-| z91A@--4{>FYf~X7kY#C_OCHe0SNaX?>f~PivohV{itQIf0RfKxzZEe|n|;B|uBBXJ zKoJW7%s)8)#}=rOF3{LfHcQfP`aPoTUV!aa99L;l4%C8DCR`kcofXUDJ_+l*B1gChoD6g@F#Ey*k!Ny_R=p8sd_r^xyQOf)0mW4>>QX68a6F?% zka3e!tPau6!?eG2u1N)KL4)}`!nPfeQJfO)s1!1gcMm|rJ2hkv^>_f)Ke*+@m(A}y zv`mkxX&>cA&_@eW)+#ESZ9+3Ini%^dbZlY2biRv1r$^D@&>F*anOf7DKv=jekyr zno9%4X6Wv6Ntg<+SzzVUEaKr2T1m=TT^f#KwcOvC2|A0$} zy;{3nIpW1-r8s#1bh=(qA*wU}-i1JrLE)7lxg7>4bC`~ zNRiQP-F;GRCLEpNRpJ>aI+)HCuu~!FA(ESNIDSlQkVYTIN52Puka59H)d_t%g*X>a zq`~+}4x`ty1k`QiC+S*t!K!QQvF5y$l zO5LbWC*xn{M!d?2uLDj)Nk9ii2BHdrFdjWi?LAVyTpMl=-PT%LYyTaM^3UAW3VS-6 z3Q%_t5dRydj*_XF4WQ-#c3={wHV*%Hyzy6E(SDO1(eJsg9ovEkEDyPSEjhXMmpKQx z4Mlw_*g!o*7PqDjr4k8M*A-yAQJgXynG8$U>4HVwUoY|pukZb;H@LZLDF82mC1k(@ z6vP%C(m1zYq6rjkO^Gw6pgg(-DSBFH9>&nWt_Pu8BhmblmR5p^W4b2LPB|D-t=w(| z*3F<+dRHcJKt#iQxZ4GC5J-9A7kk3FNQpJTIOtzQLJ2QxCse*N6h1)}Gq1Jr9smuO z?4UGTy32@+n<{F64&7(OB4g0|s~a42FgROxuV9&y-}z@Xd;uW}h%{?jo}qx1K7kur zBUngGC7Z+%d)NXA6u@39SV1jU1|vmcJWJ7vtTc#Q*qo8p2xbChKJ;?(!WwpUh&$W4 zWa*Ba?>@e0n&svg>57|(p`-v9y)yn?#XoKrxWr5Jeg1S{jhW+H9$?ISFlWKUmFMfH z&v7Zgt#{`>liNFV@p9rl7iSdy`1y0Gie5x3C=SZ94n?3`Neh?~Wqb{}vIKV|X_skt znMhxesdA-gG7XpA#7(fIpxJt0Qeh`>iKE4*B7qK*8oy=txD|qfFo>S?R>0Xro(Y_| z^aZ4{#d5&gHuo9R-O#>o`_Fsjr&k?Zc@urd6+84O1EwoKo2v+%Wie|y(r-_>?L`X( zq-Mt(2<=7*=9UQ9GUSeEaA4C#Pappn6*=a$?e$7;rso`0@7`lAh(o~Jkx0^uLv=D~m=DyP5cZZLFQjibWn!4;^v5ng zIubD{qxMND3UN#FYKbC0jC~bixAbRg?5{Ygzp609P~oq^;~{4lB&1nYs8Mi2`fT^V z|8$^`#?p3fC{B}s&!%AhVPiUxDkh8&ZY(s>OYM3a&J zD-y>63;rD0`(e-1`b${0g5qlDdffo!ef@!EX2&3yCaD6Q9_DA!8C$m(7=xW`3L?LM zShx)Wy!F9m>)tBYjx>&&HV*z7hV%i?)WKc$$Xx+)nii?Sw*oIOKIY5d*C zk%uX=O~7x){5{w9_>85~Il#awHX^nXi5 zh5S*_Feq3oyyV0MSZh)Msu06}{O9uz(d%D*TP}df3D~~__=tM;P);-AD=1Ma5PQSW zh$h)$xES8JYMO2fSJ)=1pVxRe7W9?NtLcwkW`DXl?s-q1=f!(ThNHQRjP;>ll#T2} zB+-ARu zfWO3OD@NWds|Ijzr0KhE3|wOvx>>z|0qb{1(({)%N6t?6E@2RvsN9R%nk027U7?%G3iS{3eXNWfke<9E62H1N(yk$~2G3!p^Q z0w@vJ07?Y7gbNb*3%Aw82yX!g071fg%pyihGa8@D#NOZI*juY1f*B`Xym!2iz6W_u zyT2$@=Z-j%ZSdSwE$mhTQ{4j%)3np1%jsn%-}#3mnQTuS;X~$l!X^`9-0bvObCPcr zaO=;$+B(c%yHl{dn@#*y)BhEG)h%cjt2itW?t-P+x;|rz!FSL$*MXW}lHG{Z+}Dxo z(vbiC`!DpJW4axNyE}&AZ!v*?zX$(8N0fh~YT^R05ySw)wcvm87228Gm`d6Kk~-WB zZT=k{QJXkrHN=Q0`ur88*{J}kTTZ9Tsvt}Va||)MxU5Dz@e`kij_h0SRY5kG}16iUEqg5^TrCDrzV`GCZNkm&8B8<+BQfpO=R@d5jU*pc!uo={{-jeY5 zFV+;UviZVS!E#uzi0v?1E<3_0Q_(865_YYtGQqoKK^^`R_)J0`ngRZT=Mr>dBbV*w z5)9iF4}Mr%l3snCQ!$zGbSjo2gb9c4S{`U28t!M;7PbDwJQi@d@-~6z-kG*?_1$)X z!OpcL6Qbb+U-41vPZM;C)iuxQ9j2+pO8=}9ifz6zIM;5r(-um^wgKH2Ba6Iz=ZHR7 zvRh~vX6G$sJN#O_;9`a=@j1T9lUJB;mlC`r{r@%DM)qt8qS_sy-T|Jv9H8@I`H!Fc zKi~-!Plx}h0kvwIar<{pBdTmZ>SvEjS#&@7W>oD_OC^uxkFx#guZB(TUZ8BX0 z@j4Le#l~UDGcACK_FPf@a_NL`%4s|vgZuNts_}^~)e=z=G}iXsRUDY5i7d!3CvI~d zg463lo(1AZiyi(}z>DoQ_i6MSpmPTCPk$2P_Rx;`{kS(}%%^+9r$yY!oF}b=A)^zU zYG+j4rJ*h*3L*}p;~`9C{rL|omG~?HK}CkLW1^TWRGQhlA0=V3b+@AOvA@ch?i_kO zC^4oR{bSMf5Im(Ix8Q?;c5h-dfWpL|FlCYMr6$G|8-;*-Zrkp-{Aw6L9fm>aov%f@SV&c2V^II1zkAwg@6ohXzkp0p3pC8-2T{D+UL^Fl zJIINp0N>x8IGpmUaL%QiK{p~iKp@wCU?eR9ScIuoA(i8@qn#jO(U~+%*qDYC4IoDD zq`&U<0ev;fjm01m{FN&3^5fkVJ*KbO&a$WFE3I?u{?kj=W zmTRSJxzQ&cL0u&1>p@!JMIf_1&yZ0kPUnKv?e1XN$s)aAHkJh_J4Szj{Qf)A*)|tu z^l%^l;08aoJBDDt$Rvef90qGr>>{msqidwa+uEP^USOX3+SLL6N}TH}(V7GPugR8S zV$z8r$#PcJMHr#{lj}R&r{s4oe77~i7+r0nu%}RIQ0|Fb0Bxykh^V3~d8|5y4bU&^ z7ArfNm~#mFI>@=Pud4q;+B*eS7G~?Bv2EM7Dpti6+qUhbqKa+Xwr$(0*seHdRrlU~ z``nk)XP@~rpZ@i-<~RN^#s^c~JK8XQIGOM`D=UW6;&_#VC+BWInIe&hr2PUxi>jk< z2;#}beYy1IW+d$btU_$&UusfvM7J6Alf{#nMwLe%bBL6_H)aC4HtqwCa-@{^8WFC= zxxYEMP{rGNz>r}SHdk?Mii>d5gM!rAV&ZM{q7Py(?NW9KgZt4F98ps$URo@%zYr|? z`tehbjH2l=8okWXGOl1=AI6%7jm8S=_sa@3tSd)!qok`Pq4YLH;*{00HgSp8Un@e?3fqxBo1D z+{Vt>+Rnh(#PQ$EoByi*siS9xTmXP{0tMg){tr$QHgGZlOqc(0JE>CXa|Ezay54AC zM+-YCjIDlX4;$PqEq)xs`0dg93*{0>CTgr;e>CWc;Y1VT_{sBx? zeEFhNV3TLcH*mweA{I!g0pl8zI8G87%e47K+V&AXc!kl=X@^n>z}!M?)(QXz=MH`Q zRqG$8pkl+upn+?oOwYe|3###2tv!~@NwBR4+eGqCmvTI za0VFD3GR(}p-!pv#|_6rB0#W%w5XbmE_sEA=Gd4=MDIyb7F2?91L-z#Qt8AyitcbM zXR&&vsq&6X<>aA8ETO%yvE#3`3yYrmOIq|Z=<}iKrU8h4@Y?psaMzND zBbtjyvyAq1nhDrXYSmf@mwal!93j0#438BgRh?l9fB}uNMA_xe=0%5HKij1cWn{E* zUwyUgb(#>4hS#W?>H_fm$ll_g^6L9&T`$C5Kf3YFUPdv7I>`!eC8&S2etrpWp!cf=_t8$@CqW^xb@{ zMFA7)I22ldd^LIZTK$3QDvkq>PQzI_E0TR>oU&OO{X-}gMez8jSbAKNeeTI2fyuqv#S0J4ooGGR26{U z;spT+NceyLIsd(I{MVqP3ov8dm-u_#u+$T$FwBZw>ZHrqA_hYtV?f3f^RT{Pc^Gsq zxZ*%gAM3Gm*?@3z5LPW6p4rPeuh;wZkEZD8mBTX=G>YFIVn|SW?)DOl7QzOidvlq(Qca z&_OV#XN0S%BEeZXYSjovm_#Jl#3i*sh5MDp;st3!sS;doWud=A&4jef> zap1CjV-n|O&5Nr5+&e@E+$-;UbIKCap@xa+R&mM-f$!MojF4i5`4#Ha!`mW~;atb8 zfno$Dlzys-&4ZG*H1Vp8;y8=#uIyTE#h=Ru>KcxJts-T6JG+a1eyd9?hiFm6wVJc* zUvla4ef0W>so;?rk!9(sR92;PHz@Q~Z2A$t=-U|iA;^%T?BW@%Bf>_5ULFd_ziME= zM;$Qgp^rbrnz~w`MqJdPcl#rlA5&G}*1H9bs5=d;xoO-Wtoe4=zjTZ%Eg@jJl97_6 zlKxC&syRTvAn{=XU&f)T)hcShhPG1qUaIV0owRSI=x1w;+f?_581|zkb7V*VMDF^h zsp7E27U5vLJcgu`u`TJh;CZV4x1b-20@N{l^SS}DHdY)zWaU+|h7kYQG14+*aJH_^ z?R2|YpGsqdGLkYP4*B6kd%ATQ+*f<*D;rBRZzL(LZcvYtd+? zhgpm(300CKW=+%?jA!mkd<{Bqy+sGy`s@T;ry6`GJN3b+O~DqUYi4z}x`pPkLH;yk z5hpLwcKonOnX!?kK432x%ozwhN^@KN;Ky8NLe5otJT@OrglYfXE|#E+RRg2f?VpmI zp{X+qhT&N<`DWUq6PzO;4gBp?wL**FoA}ds{?A^VlZ;N_3phe?i*19-$8P;l1;-e8&7}hXK-q%wX47<#7gh8 z>{fj zWvh*9n9)JUnP1y9c1i!<LR)zkMBFLpDi=|w%oGX~TSTuO3;iS$_n}fk%anG=%n5YK6~3AwLk-D9nuq$K z4Wf@SybOKzTp3_5rqo~zqg5NvElLL-%)BCgD`|_=3YCDlFwX< z0`GW+;f82*Qn2jo8cIz=vCEtTMIe;(J=GGdn7HAaXEd{ns$7M%(CTi#3tkYQ{~9n^ z2RR_i*AI|dz^U#$8eUsB#;0OQt`=l!Kz)b?+TIHfD4CwtHU%@9js$N8BvpVBuW(I? z;Y*-odltOyxr2QUu=2hL?FvL@Ymr$T#mhMa1mkBL2PS9)=Bit&a!duw;ez`{5EN!c;e2)`EEzG!#P9&|%$lUA z(0Hw5?v&|E=`R+oy;Q-)?v}=Es2#<3N6ZC{)>ckw8r?J76(gvGsW=L z($JpBiC?p^ylW?S)N9u;)GGM4g&e9zy90+R4IVFE_c0R`ks>+DxJgpO`I!IJf?3+7 zLovon3agYf*$0`c&?qC8!M#smOisXK>QYW6AjzIzj`1zr15ZfFZC;snOp?~sU2b3f zBJ1bjC+6Lsn=nrzPP5i-W%(F#v?OgRFfWKle~AHGSXb=Sf94B^Q#s6mnN6VX&b5WK zp=v{xkKM6N6-TMQW;-dOSF(hmId{{d>F5hemH&Kj371wM_)M~G62IkX5i_=`fgLj% zWi4k63F&1;*Ya*}=P(-qN0yKZU{ho=K@I3&N3Ntdeo%BuhE;!}h6hH86Sap|${rSR zNpM2GCR7_k9cpE+d$RjkCsO|Gc4_U-%H~EVw`Ft1 zoGq6#nB2F>mXT;4NRWtgu+>mPGpULlDK-+8cwir>UJwaR)J-et9Z!OyO0^;Z{)HPgV~--#E*@bqPx-rkv>I% zr2T6Pj;$!KFGLdjl7VDtu~IFXtnWzi%{r(P4;3B@COKj`MzU;IKAqhBKh31ePUHlV zlHH6CdB;1a#*q7F_Ls~2x2HthP&Yzte@9X$t9RSDp`~jVotqRqJkgV{GlyI{ym}Ao zs!7jSQjU~H>C;LHU?Gg!cnz<0%Q+DvcnxLYd9$kb6JotI<7|!#DPB(0F z*L<^rysIG(qJ=pw)EXJF^_WJVK5+vn@14rsUpN;?`c`9kEW2hD(A~qh6L0}pEv28e z6H6HKr1^sR-whrV(BGCUvbOZ?5E%$aM+pc>>i-3}00{QKb8?sPESxr4AD!-LYtM{B zrO;t50)D=$8H!Nz#OiA9NE)Eav!&O#*zzVwz^ zpvV%NqI1AqpzlH$4z7acU_{U!g_1DW2UR_KY{l{jQ1TeH?7x0if;`~zXg^v>kx<;w zJ;SuuL9tw{Dxr-WWXJOsHSiK3`IF^{w-DA`*^b@ZvA(c%wqfgT`|<;gTKDB8@+_CAcK7gk?*ALaPMJn#|kot+JttcmAh20L3|aMQPtDkLC)k43se!H9Dh)GA}msY zL2!O>ChFxfi*da2Mi~0JBTC@}twF~iH!eqmfzWHk2xZ}$;L@rFmlZrj9!@~J5Px75 zMnvczQegw91V(nW&kN?_&bWXSry3)>AVZX+)Vf2mKgKaHq+Ns3v7tW#+W5!!ES-XHaKiMxt*OTMkr)988gfs4Mh} zf}Tl;-L6)va$)F|{3!y*(I0^Atr4>-&?}+!>;j9DFx9OtS%W_;lx}E9^ir5W4T7el zm<;WI_ZH#TMRcP@K1ceHUO4L}$QFS$43dTB=)p;#x1;^>kcNjWo-?Ufvw}PNrA{#N z0SbEhi|G7@FHetUyqNk0sSs@;#Yl!G_hChE3Py}OF&+FQ<+kFWO+&SPP~?;@nwTo^ zLzWsg_{SPtht$a_$1YM)d#_corwqZk8Em&aPoHmvR+6VsxvE9FN|!u+J)Mh8C=+>F zegSe$ruFwOkl-{(>F}7MKdV6L-ysUYl6X!R#cO^_!O>a#0aq=neje~1Wb_xJlvSB0 zHuizew?g=QdK#saa3azfOB*F9HbDkm4^rnXn$a^EdD88QXR4{CF=IYRh9euPhteRu zBa@l*j3qKic=lVTEr0hwC+kyOf+~CMr2KTbFV~kj_f!$ABUzLTo=!+%iX4m*UrX9UNmDkc~xZ)17 z!K&c}K3+HvidIkbXig?$n?R+Iw~auS@pem$;Z4tXaxff^cX`qF8Oo6wM1Upqlj)@w zDD34@*=LB;^4@!6Z?+@n3+QBMw;80A2SOK2Ug0!We;1xMo#Xvc8*i4Bm!?c{ z0s5*?HhSrEr<6{tSh^$U!+JwuBz1!K&P~RLPBJ4l-jK_7@&OTPI)4c8zc6^!TQlbxNF?wtbG#-(of$Ae{PaP0ic;Hy^j57r>JtPl^g$-VX5ygTrR z6Z~&R7lPkAG&tCKg;0xuti^{KlXam4Bz&cGJ_+3cKw?u$I16nURJW9YE!NL$!lH^6 zm1mUT{<2G-PO$HPLml# zqCq$x+Etd|+B&g>j9>l2=3@a(TKSlz4(@~vqLzX$aISz#zjGTp$RR93W!`==?T!rI zXU#udv0QeLH0>?@dAjLh-}Wp78m?qzz`4IC@#jxC9Q8fO6P{vNn#lKBMsyq`oRDR+ z+>OutexbR9zadE5Q|T)jglM=8sQOE>Zp3A$UMYf+evu<|%E_aeu5b1L8@0YnGQ?a=;c zPKf}sjf_PS7wKjYx%G!4(3I-}W!-woL9NUy;5DTgXlpWWS&+}LH?$NZIoP#qkmf zA|dJ$Sf3>h#Kyj27EJVfapCP`*;sKmJs8@1FP?Kg+!XZ)EWDDHnWMCllB{$fdoy=1 zzn`|XJG6>%#)i{(C|K3*oRe|Mj8@)sIq5OaRq$A`KVHr=zdtpLj-O<@Mof!GOrg0M zh5&w$Hp57s)r8YZ`A2gHQwL+b4nBPd&j^%3ghP^5r{~zOJGSNyjA%_y8+SRPTJcz* zXE4h!Vhmf|QK}8LXGY(rhnNEqE4QA!7Dp73+!v(X^h*91gTa(@paH69>F#2Hos4c_0ui`_C#I=rXD5wzFq1T2)6g2%6PU(W@zmM!SWD+C_hh*w5 z>fT)^`0#ZG%*B?zLfHC-%DyF+2+Gh7z?3iW!dawG_j**i9ZPQcTV&3E$<16bP`Xi4 znk9_AY`MR`aKA3keLl22dDK{{#hfL0mR(5uo-pktn(|VcqMH;69eS`byqrd|d*c6L zQ-%a?tN+uV!Cv3P$L=EMZ-JZLoDSjzgAyWRKOGQIn^+)^JBl%6eEW5JkWzP{Ak$p| z+{j_5dJo6cj>T1C1mV~)2*`&ER8j|BIT-2X7P`{B7ew<-L|9-;ZveU*yANW74HyL< zDAq7;`pox#6Rfp51=X1jN#>X6x!m#X=08u^@g>dZ<55rsf-Nq`L>zTuuuXchs(XR)25+Bv2HBe)LK8!i3D`xWv4$3)>j7~*L9SWDu5m>3{lL_ z-B`>VJH#|NG9HY3fv8EEP4#bbY|8$?M!~JxErLl zNf<3PT`BbL)=$c<8>cODoIBD2CTRzXy6p~;ZvhCGzU6^e(`ntNEVRwDv|$^4v&uB6 zVwN?sidta{saB0urQ}yWgfc$ac|7^=3-)*(cocG;5mnsxjZS(B$4g#Nr?`kC{HL`s zdTZH^JtS0Hd$i(h=$!dN#T~k!@Y7ZrUAnkV%&J86O7_)P-Prs`rFJPQIHSd4xux#) z-_{q=AwsH;A+Xu&7zYp_oHmhVc@?gDF25(iBGC!#?yy=?xMW}f8idVB<+>jX;No}? z>Xr#oWnA;Fndn|!^k|ivJ%J)(<|5odro~B)3)Z#6xHdm8xtZd@azVHRm02Vs8njM% zrcUaCRB){jLq`rV*GfINoKAZ8X1D#lWd^%1_v++-8Q@J+jXx8M_Fwv{Xmy1ep0n_m zLxXpXu9A>Fp<Y|YE0;Ed!T4#+B1U!{aELr91W+ogJplA z3SbJElnjaeI>z(nJ{fx!f)yR-s-d%S(M#PoEH zZY5Q7OU=9r%M6~4%==gaBFfGVr zo@?3U%2e55Ubc=l9Db3gV|NuHxlU`FMa^hYlh8Ufe(`21DkNPlRWpSqaae*k)B8*M21~|cl@Xq) z=xQVMVXSWFw@gBNSRZZq75hS^-mZL&rW@WcKH`k9eRIHg04EJa_hCD zJks~)o6LTw86m2X9nPrui%_rO=TwzkKg4N zSC6TOP&gbCow{9)PhHb@shjgEW4pHGJm8IBA~eQvfKW6_Q`>^3RHJOiu?+@~Ee(c$ zc4b6GOF+1w6U`}$?PR@h8x3l@MU2JnWPbOJ=TEYB+ z`2U7Ue{(eu9;A930ffU6K(2=1|7@59&|Lsn&(0qI-0>&K+HEkwgi@gq-y$AdfF6{x zLoTKX{q-5 zlC!B!fRN_Jzah;mh)E%ehn?n`dC35^1x`deTWs>>f*@WB|M*1P8=v2%^0SqY%LffRet6{dl?cAMf zpEJL!M}wxw6U!68fulAHB9-~df}V{&q&W%@bNfm&^{3GQA#Fjhm2UBd^LsTFu<+R7 zhU*irH*K78(Qiw>?}2ic6>{u7N`2SHj~!{%8=~J0|8S3ixZ!rY#?BB(iAA&C4NYff zeFS+occ2__v3xt1e%nA;@?lf|yN!Rua(z3~*Zmm74vC%anISH(dTq4foa38Aku1WC ztl~VLH41QJ(H4IOhB|KR3iapn1M8E_b355x-UCHq(0bhOa_{+9_!Gcv#b^ERNAR!b zKd0b2nwVKQIXim%8-3>QVHVLn34wqm6D2@VAOJY_KO^J(>o7oCui}3l{9n3EfN25; z8o)Fm^XQkcHf7-gW&0%xOvhyG1W;NQFU%X(;%NN$cw!l|FRvK746R<`jYeLq4W5+i zZ^z%_85wcxffKlezg(ewip-!|XhQM~nJt;PTd;T%s>fB+XO1w^x13tLEp3<0j!rgnBiiOwr|1%CP=2WO+<~RD@p&Zm(YkgQx8ah z>Vxclj;*|nKs#S$?`oN`oo&iyuNzw&hpRdS@FV@Xz^{c?EBp+Qk@bNDK-;1_#+=d zGL}L{5m}r@w(Jzgth%SdwLoY~emzhWw^-Y-P{UB9px`E?0`1p1JnL#TGb)W|wZ^sN z#O0anPhvfL?h5vag=%qAr>F!KRY(h_{;(A-b(tNIE9>FprFEIs-f;bbI1eGwKrM5HeICo=;InwZrZo&xWTzF0?Dik#+m2D1E7)bV(*N1vAV*iS5N-&5~&nHA>8* z()8nY94j8ojxSwCucP3@VfrXnOJ_Im_9pjNIUCz-p=U$l57`j^Ec7td8(;|!vq?|U zPMb8_qZT^SuZ=h*=jHBwAz{7EZO4=Z?tN`Vi}_J9F~a{a$jq;0iz&ohzcdN3 z%WiapW25}a^p+4S{c~*v`+?VA3FJbg4~S|!^Ty&L%aEw<(Z1n z@Ik=Vm%LHd`yS2m-0%Vutw&6!zKM1o@C~nY`LN?#^1OoH1HCWm3D1IDXO`gY7vjd( z4@pbbON8NV>tz+;!*#}4$!ITFLSZ(p%scsZCFy!@LS0Og2Jzs!^U$sR%-Mk|yqf&X zS-$k;{X#q2oIgx1h%TsrwbL3kuGDbyT`JT2S`Q=Q${Be(qH`o+WBMzn^Jg;W1-bu6 z3`nhW+mCX!hhL3i<2EzkyRVmRg6%(zF~tIMN4s+>;kuQgXMXceuw6dwq$Ur}v&}eS zPceHAKVQ60h2y8ixvdPfnv2X&^w9qrv9Bc2vOqxpy<1pl8E~z-+q_{x@<1SvI}o$H z$`P9-`jwU0tVAHc2w8r}&YiR0%Cz}-x8EPy?mvSA9YROQh{#m_VrzT#`>wCKyJAAo z*Y4lFVE)3J*)H5rFMud+2=Idu|G$SfNm+m$jFF>(sq_Dia)5*`z#Rf0+q{_r1^EyR zfj3u$18#RQe+8`TKm<6_( z*5t56RaqAi7M~s#v%w^8@!~%oNeXp|c8k$K!X56x#(sq|DXg?89^epEmk49Ma&`2z24?mxN(vPX|7&TP0B$|2 z{3Ga9>p{$~pBzv3U}DK+YvF}fmXX90d@JozEdS3v=x?j9o~b{N(G5i(BeA#g^aV5F z3mFUoS&EP9GpJqq&OMm#YHD+wayzO^{VUzSKEzJB_pdR(Qg$@v+Q*XIXwfctesVhe zL5&u{^;M(aWw}oHu&twzqr3)qOz#Pp3GnuD4pJuYXB+q8D4l(G^R*WE`L_R!#`2A4 zlT15tycb;N2}9oiQo@v15zkOJ_QZVp>V*>Ld@F;CRV=U!vw zTw6q*us#e)L;lf8ADd*=t7v~LuARHQ@(-uY*#l1jLhmHu6N-_xZ!DS8#pvyD8JUy@gAK$|3X3dRyWOhD6 zl^qBA4w0MsK9j(3wH2X}!MYf_^KVAkb|Y`M5x_wvaEdeur1EY@jm-MtUQ|sjLxSbbWF}ph+&-Ej8WSK5^CCC` zf;>HMJ(f#lir9*nH*2FVIgf8%cWI(Sy1@jc(*ZBw2H(bye!>SRsO)=V-*es$dI+J2 zH|*&XIWQ0rv~^uNQUqN6+AsPiR*4tnNDZ&Pksc#FuLL>MQIOGho3J%kD%$m0c;fZ8Kl2_40yx2{Q(y zI;4Ob-TO?G{VZJf8q4QKKG!a^`HUJO6VZs|LZ>>c3DE&xJS3zNq=#D+};Ia}yN2v!#2zHMtP(9?Xroc_ijEV%KGN@62-}MM+>oJk_Wt>(o9GG~H#dYE`>pqgnd!N>>miT5eN$ zpi^a+{LEn9)e^WE!pbVZ1s5ur#)J6=imzWbym+0Ode@=}NwOqP`$8;P_%tGXU81R@ zkyFuCS#1_xQw{wU_ga7Er|nymb!z{3Cf3oCpyF7A-KjHqd{%>1_$B0PQHulb8~qNq zKq!UIOWue$X=qazFDHO^roR>ew~}-&{%K}#?P_3Kw|rH#2ZXTjJ1nuu>wIa+j`moK zL~V5g1=G-C(at2rCxg1dHVsya`-IT1|4$dIcYfb(G`S3N?IlKH zNs;RBfu43C)e42a%pIVu%;!m$!Lc-7UB6R;!IL|r*MHE@XSv=^x*w%s3KaXS`zvA1 zAit`m%%)g|*pn-@Cen$4x9>t2(K<5RH|;mH1sr+6PG`GK6OE}g?mzyMaK=9S`=5j} zLzs@*WNGJRqtew_`*@JU82Xnc&+##Ald;$JQ+#$Dq$Qsh)-A;(Sb7C)@oqMbYRKEIdOST9s@u zWW)ut>#X4e)2j5n$#!kDsc$CN(k3$dQ(28bwH%1`1Le&#F-Sn-gAjk-zGZYUKU53! zhi==ib`bbo#22PXYYvfne)Eoll{2LV8)9i__SMyao7qY5zP{XbWcoDMxkMaZ!7M<2 zunSr4BiMWj`Q7)jWnu@_;x@36F((E`I`|!g$HjwqR*@|dRtMrUPO)rED6T(~K29;6 zNH5+C4y8QSZWIt~IVmO$qs7z#;GIdL_DLz62E=7(FO#zb3MCIBzi-w}KSJmJ2)rT0 zj;F-+;U|CdAubBvty&zm)PCH3(I~lp*ElXY#&5-alxW%-)wuhmaI2&+q8!VU%^;dN zIusahYs}E3T)bf}&v63$X)KL_84}U@T|+}p@wFq=>R1spOF(k4l>GNa$6r*HT$52_dW{=7 z)_&*4a))yesa=@9U;ghCqL_i1A>1f%=xRI5eXE4x>tBRviF7)iRpIW!L zg1K?l5(XE`W6Pw?u5M|3tgm`hh2ST^ZogND{~>0K)QZI8$TO#Bd2-okL8yT2gl$#$ znDcK8$6#Ii<^P$}WQj&Ye91L=YW?obYBMf(uJO^orb|ZNQTksZ1zo!w|o3SGTfxG`fblLtYTl3eb8MEF$$+U zB2+KG_66sC=HalmBBqh;KXstGu>)YHenm{ydDzZ0PkAhE4wyrx+?`IrJ6I1XZ9MVx{du7zC zMP#nNB+|-`k}8dDZvQ^H6G7YFDcI*?Xxdq2f;1q zM4eF2con_7Ci-f+9P0rz>jA{;E`{BU!WwE-&K1Gl>ZqX_@MG`W`K6{FevbsTrhg0$ zqlU?swv8(E5UtzWKK!SMq@r-aeqRDVlr{ip*hYNf;-9PQ0#wl@l6(|G(K<;(`+MOC z201TxW#_G>)n)nXXWKIjE-PMd8^bULfmohqfnfNb^~m+d4oeSDn>!tic$;CK8qb%5 z+mK-E7N@?z4&-|++*~hi?|khlKEvh{x0(IwdoklWv~?6^9ISt`9}Ai|TEi@OMx3)I zCmTKPM0@-xUt=oYzx@)r?G@DR@7^E_ld04DmHKH*}i9*Lmn~Y(8gH5Ukcg$3Y zrn(O2!@=){aFpZ?Egh2tpo4OcmR$?<8r|hVyQ4?t83HqP;*s=bw9%cZpG$4xQ$IQHGVG})DQ|iP{owtlIzwXH`-HR*$;Hs#Ns<`OXbd* z#k=gXny8w8)58NAN&rb4P%8iRPypWkPxCWt3lrOa?-~9!AeHY+)(!v(n=JHyW^ez` zGlZ?}jI0z*YypxuNn2C9f0W#$BptgmE~Jp_d)gzEa%-xpCm5CW#AGLuImFw%@)U|R zw2EPXak$)c`Ipbg3l%YVGbN@he$2>B=lwby18=MU5RSneQ}C~OJ19h&fHFhqe+=JR zW9!CYrgoMwJb&|R>mbw+O}nxwRUJcs=~)!R=K3iC+=Pl;N7$ls<+%ZAGs8guHzAsq zzivWff)=Z#K_$U&u>c7hV7~2XBv^E~JMtT)*c@)^L-4Pg(6n0M2-6|+UpFD+s|XDv zkcxb5c48<<&KmAgp1*EFj$otIq5~LBdCc121Evi;MTnxq#=wDVKKl0gyFNP5_8LbT z6_MlWtmiNrfI=G_i!0-_2P)Pt-T3^{s4e*X48yo*jls{L`yI_>Nm*Z3NcF%?_3Zn+W1%;mA`q(LzcM4A*YG%(GIVxqr9%5!RzI#a+vWh0ai&!KHtsbL9P@Ow8IyAYI>2bEa) z-Pe?#2DG1xqH8*6Y8F45#g)(%s)7Tzo@y>Ksjxck$_&(kZrtc9SsC)vzKXMzD&rGz zVl2_qZx>Qm)rA#f5{oL2rdy(T{A~r)lVz%965rWkjN*`NY%yDdn!L6XbMwLlWlSRe zvWkQd53IRv(`C-o*@3*oD~#PJ-3B2rH?3mlCykqmP-xdm@gv~cR#NtQ2$2MH3oFP+{#Tod0hU~%o#e~ni_Lw*P*MngS+0oU$|njWbQ=&4gT$Bof=1>+$(q7 z*=NO&H|Ifuo3LcPRY{X9%dUs#cRuUq7IuwxXwN#R*y5D-Z65zof(T_NSM@wk*VAp4 z`-kFz-cm)WZqLWK1-k5GRme@APon^_ocZec5~p0x)}_Cu)Q;ze?+tjZF9t$JgnQ0{-brfUTjc@^*(ntXqZqd}{Trc<`4>v*%26nA;B8ZN?e0uv&+B#mv-s z)Sq%6_b=f8o+Lp10}M7Ii%!i(3BD zBE?d9JszLaX5Si5K=Ja`#l~#G);1b}T$sZuTwZd#xqaiy*X)J_C@?Xz*z2l#T9Pgf zRG*0zYZ4BkcX;K;=*q!aNPIzpk>lW7VIlFF*}X}&_D&+%>UDgd zsh=Rly%!ZV3?;Z^f&;;!G>BdacTu7K!X5wkDQvwlEXyyJ_ysQNab9djDXI8)QH{<% zM;0Ro7M=Z{Vj=X&{!)_n8bYgyU+!M7(Rd5_{%&>_;`dbK#}N+cGNTSGc^X2J%CX%1 z)VAg_!_vBEP_cps4CDl}?4<%UsL5SKY{0RZn{%E1JH|*)Dn|9=1i+K|){^t3l|Ta_ z2x=eUlJU2mwySvU4yZ}1b#G*{W2y0CLM0K6-+|&g33Wg0pRU3$vOYz(uXVI9vUEQl zK!_%AA?!}^(I3egJkkZ5W`lXh$I16S9Np`_Kzpydun7=re1(-`Lexq^Q&J92Ekbv;6$mz2NdlEz4Oqr zS3q51GJ?VceRYW@E1fO!xgYmU7jXt0&|U``gmK?MK(>kn zza~(2^P&rkVIB#KA`kiQLeR;Rxz;byaWr?p0Wt=ehaf~0 zVb3Ey04>i?tHn}DW0e5Kyc!bJuL*Iv%uN7W-Yy(sxQnxe(DfQE8HW1y1&B` zmtE-SzcF+tE~{^ah?p2p)k z?d#HcWbz)}*a=xoaS-Y?Iaeni!Sgd169`Bdk1A{35-Tp6T#csi4WjpRRXcqOo& zQ8->}Anv0YaGU8>U_3txiii(gYFp+a15=X(Z}Q=-(nfHB`%G1*#!f!@?W&UC8Tq<=$Z!Fg~poDPZh7S*JcP^n;`>7qO&<73?n04;X_b4=??NwoEYXTdB1nW_f%am_$jB4g9TBgWQQC;VmSVn2f>{Qq- z|MfnW5LMF_L1GMs*N<0;Wj|B9NFq(KX#lj6IMvH()Uw;){|ok0g~BJ&P@|W(7@v0! zVW1O8WfEI3FXzw9%C7Eayg=OrZ^`PM;EY5H8zg1j8?Jl1e$j9zait`N!>(__WoA@K z1cF`vI0dY|AL|~j?0hNJtQJM2R~0J{?oWa8%qqFQiVJ-o;Ab0r12>oUPN@Qs zxk7D!N{9zC3CCIA)e>9)UvyXgoBu*qpbn%is{0&@OP_r3Z7iyA8PndLc%g);B+em< z%GK38h>~y2QkTZ&cDOtc@&c1G`a-Rxj3St~uygKj zFy3hvo$y@X=OLIomqwrw?wUZ9-FfI3rQD$O$;_iRJz3ftvVe9-Z z{XVn!L~z*>UAo3Z znsGhMdL0#r?}(G0MXBAP%&`Vm3jq!k@+`pyY$1fhP9;HBZF?7CPix(4F0$AngaM5K zmVz#|jJSK%p+rj%Ymg2_T%xO&hPvua5;50BwfLT*9d(RxK-{CVOn?TfhKqXX$Jm3* zL_X8=I-V&x_<8B~);V&?U*w}$go2pnJdv;^O~Z<^Q_3NpGbHP@jukttQEbT$xO-dd z6pp%O@6|L_Cx#%ev*0P?#X3Xk?k2nHpo^f>!ZI5k@(OTgf?w4JszS?_IIPL@P!#E8 zj8d6SdaWY%dNN2%r9u|Hc%dRUpAb@URyU{y@^Xg<#JwM=qdD#xd};RbD*KPT;|17h zYvd2+&9i)lx?KP4o)d*N`G5wwiTBXxa$=|o>}`cTZQs-P+S zt#FT1RW4I8`MWABB`;ztGM=N@P8Cf1uvMzDAlqz-5GUTxtyugBNv2-OWrmVT7z?Xe zZ9XV@gbOU;S@!XMyN|9j0^cX(jubx+6BM^}ZIPUp3?zziC4IkHh6Snn_-!FMgvDihRNj9{rS^l`Fr%*9oKT$1G~8G0&D}i2&Hz@v zOVz_RamC%P3DnSMH+o?pvQ$_ht+ti*ld=*CT92MG#xB7fO!VK|KS{Al`ZVGC%`hAF zBfN$Gz#xaf^OSqmn&!SIy0mxk_~31OT3}(!7K+l?$GOrxPrWV;YYND6aKzTl>40Gn za@Ekgv_uK!LUv;8eSiMdg*dnvCIZ~(K3i5Lwj~OVTtN6xaz_4Ae-fYpU79NdyZnil z*v}=I;3!$lCd{Yf?CBB?4C04b!NcU;skp{2VRb}lOzMv8d)E;*F7gK07k zez~Mby9l5{q7hF`kw7lvjS`KA_y-q-EnW3g&7y&wMqLH4Q><1hSJmKZb>Sk|v|MP| zzc4^d!JnQz%R3TXh5SY>?{EA8>C%S0Z45y*d((h5E?G0W5|5&1|+d^kt=tt#~M)^B~U8knLl zim$X}ryxkCC<2{z!>)np6RP&-=343NKp%)`0H~?!J%~&6mG<%-s>GqO0 z04z!5ijB-tt%Vdx(7}EatGGi*epQMV?C?ay@2-}j*eo3U+2b4vjW=mt?a%}x6pTr=j1WE4a z{9YT-Z=Zbb+Wb#Aq|gECZyzF9nbuE*e&3vQMdS*Uos9J2G19|af{8yieYc?I4MBlW z;OitgLgMh+Gk+^GWg8`o7puUz>kMKNET?0+ljn~?e`JpwJeytQSKf6oAscQbS2%*I zlZ;^X`fg8}NSV&#pBLsj*tvPwJ4=P-#d8)i)!;jL6Y`fKkUyK+eJ{TS#h^0|>#GWS z-6JRI6vM5MuOGj-n4dccOm_=T^Lg8)k_k+tR!b~mW_r0lcTyR*=jS!0;$2s1Y29cd z5q2CEL>y|C-lb#^#Fa#=1TYj2^%2LG#G3j^BtP5mDPo}7PVb!9Ir2h>CLJaIibh<{ z6pe}*V|)esQu)ZCAeOp$e!<6)T?SsqL5jY4C=HQcc&*hedxj;siCo*51&`Ie!ebL* zqOGnlylz=`_r{7`#(sy#g~HWyNG*s^eA=2H>Imt8EY1yl>pTpu#|vJWsh)5n$>;t7 zQFi*fJtX*dy$bTq6p@=!2LN6Q9I1h>+lB8P_j|x?)Xp|rLRdXRf{>iz40)Bpiq(SW zngKjA^5*9hf!7cM+I_H0@Zc8RiV8ScjY=`&4KmO|lVt)c(XLv+=i==Y%@K_lvwbUj zE5bU#6$XkHNV*UK>+KIDo%UD~MdByNx>r9(XsGO%e3ReLI~v~7Qn{>Rss^^7ZmX|} z&sURy?db3jrgSQ@he({Zp>*;+d>i@tA`i}K@1tS%Wpo_DoD}YL=pfLMp4(D9hPt4k zz+dGXfa0Kl;orTify!89pSCV{FNoA$N2Sh~`^b(a9Q`Ahtj+mWB^jOizknv-lOaL* z{Zx$ESB6UTM8GoiI({-!KLd4_Q~3}^MLb|nD4YY>UoyEYQ0+@S1owR}bl zE1CnC<oCM1sg2YEG(I$RC$-E(|Xb-vLH7pj_2uuabGA0Ft_IFUT;NJ3$C^OSV-kC2*>H{>(LR?@ zd>97B#Ig6J9k6oA_aJmp#oTgEswg9vsIT2mUCtgKr@bFpB~}1O?bhHEQfr#$ka@-3 zZftPMT~?6on_k6d2CZGp!GQ1P#T|X!$0ZT8=QEb%`DvHMTo@EqgRP%&cqv!MYHb5S^DqVbR zcxnhM$)rkd9DTN6um(zrx8r364@Xh84G~oO&H~VBfe2J0qydno7r7}p4ioR7(38i)pm3#R^r84>345W*0BcZ}eDwVBaCBtS;oJN+vVqXN)2GP5u~t15;0g$S&~x zDTeiyfM^*{leer4rD>O++puRebKlmAI3h3BgsST`LB_#8pEdCSK2Up9>WUB<8}xR? z`XU%qfKZ`Bung4PzZ?iY3>U&M8415SwlJ6dnB+fgT2jnf>dr}?#!+Iuv+OO#9|kl#bZp6gB|Z; zBXMabZ*(SRs@|i=_O7lqyh!?}Y6rVlXID2T*Ew^5s~FNh?SxU%x$;GZ&5JD@m_lCN zCWnmOb-*z7hcrLomaJnrGWH1HZ`WFi6mnyEXzn%O~h}|oloQ? zlt%jIcxp^{_EzWRyanKnP1+z;ilXQqF(40RVYZ@GeR+h078%EJ!ar|I66k!;&shcL3xY=%7U1DR|gWXysicGSv zZiySup>bW-A68kBq$DY{TVkd<9`xim7v11KP3$Q`Yhy-2{AGAJbdxlYn5{EY{oOF3M9CA3nn_M?V(;m%_~o z`X0Wg9~68V<89x;u@le#z3cJ+4rkR}E?ws1!NSwW&?8!BP!bd*9NglMR5PWNj}(>g zh;o(B9r3h-_B*Uzjtd~h;yRsggRN0L#Xn5w;ur!ji^74 zYvy#28zj_}>T<8=WWSNXzXP{_2xs#44fS^cFJE&zFg-Y;*iftYuCaLu)WX?5xK61Z zjWOSzkM%v6Av)dIm&*9FRcl^B!> zp|VDOvKP$nb1(6AwSdMZ8~6kpC^dq}H%<*B5E%`n@8p}b!bjAkyG|*R$D=yMS&}S+ zId)gG62od0R~Ybn=-GaP?U&kLv2;M2OfXdvR6vdiJ?I+`ex|=wYbw_M&@4+hUx^B! za=)rJrL)8qt{+?SvU%A714xk;!~H20Kj~BjS8iQ(bm=8=PjxvW)D-x;<64UsQQ5|| zxR#Mzf8m=`fU@5#N`mR0v7RQHAdUI4mv8hYUMyp~Dg7e5ZR{=3k+aUg$D5fR-K&*V3}G9E$%k7`$YiAs zOR0tkO-HxU-)I;$el&XW-t&3&whqY}SK^Ej{8^N}!QN)uTT+oG^R|TpbXSxznej|i zeTS>@fqTJCd}?{8*%aFjtGK|Kg%~s55`}6-7&7V^GzVXci}+;G!8?ZQ*y&R(;wVtc zVj6x7uih-5Jn^34c2&|8IMCLqYZDhW>r@m>EA zizqsJa(n&i<08!((eVJC&)_Gc77-&C@P z2xF0Eh-J4E-8=*trX*Cxlb+twl}L79@1#BSh1RZe-%8GFWHjXQD-lGT)yYW5uE!+Z z(`9qWVRco`;3yqr|==9cVW3hKatsQi#8Q<^x*UYc*iqIc;YjO`ZuQE-G!B z{ll(Qwo!c)l&=1o%EC$2{+C2 zrWNOQ7E31wUv~qXizzkhq&I5FeBGu}@3P6nvAc!Gp~amY!pRAxOz2BqXRcJOb%?$+jr{H(3fF9=6De%1iGt7#}3_p73WtATe9ForEzqmG7M_cyc>VzuS(fwbTGS;Nm@vuqMT{q#e%8(N1uG zln^y&)9qL5uy!3z5r0ZT=^&oNXy$?JdK;J^3F_L;YL;L zPM^Y-dp>auhw%z@g9GMiv95Q4id4SQNqsgjtAi z^pcGB^*+&Ja{8^L#V#PYwY$Y?%WDL3g@zG~nTAK^Q||9NJWsA9%FKgNypvk_G}KNs zG|1V*sVm%iMvv50olCtu3tzP3eR|F_>&3h4a^w9^s*@A-(znP5KG9m4n6)M@*EX@t z0_lNl3U-jYQ)Bu|20KOK3gZ2dXr)k)fauAb;#IVr)2ie6wUYc+Tefi&BhxacmwZ^p zJTe7NI@`zt-AuOKI-gd}%RWo@$`?;k+R8woK3!3wz_@X|tq+zJJIOp|SrA9#n&z1> zN8+l6w#!2ADhjq;o?lyL^P%Juum#*YnB?~Xa~aj#X1ec>HC{HBu`iD^9ICMa#-rdv z%iRPNLj{i4L}CzjFIx_Q%hm49{Q!@+Lrve3<#Y)D|>^P z&z>I}$6XvzIK87{MDMw&j&;^D&^Q$XLS5|g$PKq6llpgB zrj2Nx$2MtOEBP5LY3MSX)HdxROieGY$#8z^Mv~VM|>f@ z{+HP4g$MQldknb)YI<>eg4tC0-3Qq|hAld2EXK066@(=&(8`bSiDu%uFUeI1qN;l; zE>ySh^$WA@W7^k?Bip34(U`Iooa9B=X>AwK2;0fjN7TEOo1v5pa{Fk!QT+}vN|teY zU0zw;MMc8It{&X&oS%2+TSI%NQ@4-$uJ6vw?DR+K`ozcUHaUi*xjWZ2njeF~MhMc$ zN{h_n(6H{SA)F@Zp6swg1-KH_{2`pISSs}}6M?rA@4#AW_e$9jY4sONTCq{CGDF1{ z@_-d{3CUi!aQ64VDhH`TTQX|NkcI#Zszm>Qav*O)%n)>3zqE?E78}XX1-&A_Kmv1` zA(}RH6&&vc_zMOFn{D9Bp54)onC3AAHUCcI8pCkh<(?{^B&1N^?T)i!+=lIg-7VFcHc*ID2e@5yYw z3Q~3eWRW9(!b3boiEDJ@u4uQh!ea(6$+MltCQ^*#$(rLijv)Pks%RhoT#8^-%-mZe zR{}Y8D3MU%8;aah!OpPvojzhajw0$n#|6(55u$(;6^NzJT~Hiy_mwaGotrexSZNA1 zzp{vqiu%#mO*?emmd!joQY^kkOCUeWRvi{+Fzmk})VG((>&Zn42W()u!^UeI24l540D;|UG#!oFyeGZp zv;)F${deI(E7#$vk?(<+#Aa{@)w--+gBS}FTY;upW*&&u6o!cH3;(1nkJx3;no>;d zQ~NcC&f{y&?uS8F6Gfr%MKy1Ospw8%Od&g@6`ukLQm=hr#C`b&(!rM@o7Y*`w_
kW0=3xeDD$EK}U3opw7X39GGkHgS$eo1((4mkv77sYri-uV4Q;1w`&~O%tvlC^PZBh8d4|Bd&BKF6Nwtm`p*4 zhotGX#`AGWcEE|xdghTyl)OxgjO}}Zh9cLaJhISHHG)6(;VUW1DVze0eDI()0zP zl3uMxI9PzG{@z_F4Sh@R1dwcWU2A7o)19mwY~Y;|_LdU!Xhr%ZW#@33w5~$v-&<$e z>&(Fqcrwj3o1#F7951JKZfn!rn{S4bC# zCY57FG%3K)z7rioEP9`8if&%8KmB3VZC8r(OCyc9-r!OY8ylu&o#n0Iccs@wt0i~nihJOs zn_H0?a524}=U)eVduL1MPGInFAxHEdX?S4)YWl<461O9!8oLX`w_1ajLWXkrFP|tJ zt9@E(WTvXH4*)@T;K$4%6zg&ZcmIMR=hB@^)dF(L|DccJ@+ef)&W)akVWlTRK`zpv zlOkrG2|(qw3Juzq7V*YLS{yT)pS@;ExUZ*|`XVF(UH{%5xsnF#BJ82{L{om-( zij=MV3e0+@>%U1lo8KfI+y6L?_Zz@bHg6&)KwHe|1u#2;Hcg1=eN zR_kE(3J^gsh{U0ARt4pnX=z+c){#@|xa2xdJumL)`k2c+QgBJ=+mO8h%G(k^Kf{iAHcFs4-+yuQV_DZz4jWXVBs* z{7^XIA$+{zx7bdhszf$D2KMZ6%5oOSlsgc|mPe$NA-W0V6mms(=;jlS#F;?eIL{Eu=N*XU*(bubY2qMeIG zfKhc^G9;=JHNLbc_%xfGmC1;?3J!aPhCwOTy`rYo)$S*N=E{l7Wye(nm5t{Bk9}a+ z5%IiG?_K!vU{+^vwz`JKvy&}uEa6%jNVc%lxzy{LLbcb)?`o01POeMaZzRtLV{8of zdg-8!6Zm5ubF_NDcs^G-hc3Z#|2nF;@ffOtcl~_?@Mpup-h--9iHI-1KPy$6sW+}t z9y}OZJDV?%g+zo(oJ+ws`~D14LWW#7Dax-6%K&! zm|%QD(y}V?>Q`s9`Xx<&r=>vIjWgd4uVIXaY>3-6L-Br`-3!J-WMI8e1^Bu1l{xWZoI*j}y^0?XEsWG)tX5Xn+uD`FTnz*j{d&rT0t3KYN--g)2P!4SH+ zf*I{p#uQM0K!jQqqQ5dcuA65nNXmi~Y!OfV7qNVCkzhi(&=P{K`FXuIr>nAr)Fx|y zi;=)ww_(x{SC|1x9o+hU#|_6?%!V?BjF)L|yxfYRz&fJdP_c;J+mn1=-l+qx*I1r7 zJ3BEq$2-B|6f4-KXGkobt0osrMiHce#IamOCs$8jOJs$3KCNlnlRXqFWNZ%|7i-X@ zIX6lEhOdm>IXl`s(jzaoM|bGOpsAz@yuzoZIyY(P51i`rC-7m&TL|V2;tV+TZmx_X5meB#LdCYYN4jIo*pLl$i+6Q|k4%qetGhzbvFk`XSq7-=ySh$R?I z3T^m&|2x`17XkS8%;c2i%vy=FVMR|%?MZD_qDOWWU-l$_l7@486fK4$d3$U&1Dm zDIK@8&;%n#UkURDdgNDkWI&hvE;fg*=mqRSa5&OjH3aprrI|wY*ml9+4#- zea~O?P&!4PJL7b&Ipqj&Je>r4AlK^k#@wiZPYj`L!D6-V)tTJ)sU5w&ckINw}%){e>c_#M&PgUjFsD z1dgl`SKzL#90-Ddb8Mn(ugAGE$4SC#7(u}3(}3%~KN(<*+#2ycG;{>0Lg88j3ml~) zFydttWgVtnKnk9SK#V?v8G(;Y4c5s6r__52_-Tco;uUtZIy+oja@Sobdmo&p&s*#Zc}(~E zIUILspxuMYp8E&(u8pZml*$FrSl9<9n|N?%8%!EXWwgCT!%)qQ>lZzxKDv|qRT{Qo z&meuwLfvMNxB^v}TR{R)wTHQN+f_pFttpzG(9?nLfvYb0s;M(r<5IQ7ewU zdGRU%xiDRHH0|2dSsffv%*AV|&U@&hQa0DLxG@($aH>43`%(6}+yp5L=u0PVA7zBK zDg`i%{&L^5rxUBG>_Ck@AU~`y`h{&n!Mn2zq)6py(s%V$*1>J4sG1lm{{Rx%Bo(T; z+?ipBLLd#~f?VNk`?@C@RWc_JA#;L-q~$A@i}7T2N|sf5yP%4SJS_Fq6wOH7Z|Nx8 zklB$_UQ9h37HulZdf*OqE{31BtM})En7+RTUCxv{AW@0x5ircj1-pcEqC$4r=ScbX zI<60BOPe}Bv~T6{C+}#(T2YiOC?r|eU?+q>RA??Y&!~C!ds;Brb*+u#B(ESw)GrFx z4^C6`8}^qH+CVSrl(c|H;$=SPMn$t%OUam&4R7kcscoL@4b9tMJ_GY8ziKr+Ge5nj z!q!Q!cs_?9aEDmWUJB7bVzRMKK35DPJYy<#t5jbqD;a6(2n}#8Dnzw6u@;QiC8uSYpxnQz>rvaS!*mN$Wg}Y zO=Ly1SK?yAGqR(mE`!A{sINhG2Iv4Q^@Ne2T)Ud@f)vAut;i#qmDOzvBiqmWWx}OV zs;bk)XgU}p6OF;5!a=h0-Pi8Kn$Rx_9_(mtCt`<7N|72lC_nbR-IcA8-+wYHfqbje zYJ!<~1AY3|aKLy9JWRY&=UvQRoq|J3^B&$1=R~B2eSy=LJj-W`h zhRiMwTHokfaSHHzJ#qZYl2@kvt^=fmUaHFi5d~ZFrCwUP)SxU{sc@PtQykv!c!%?E zBMhyXAyzACBRf{Wci&W%-1Rl1DTk5{cu} zD2>|@vvMLS()GbQ+aT)u7MkFak4BSZZ8Ur6HZrPFE>~6UPWA`X4IwVEu0I>+1QT;*Z+!jt6$ggwMlMa?Pp* zYA_#AIRTdpF*_Gbt6f)y%s@966p}q|DBSzM3NPuf=)J6Kogdy1t z2l#Rg@o~&r&Ic!aDRyj<%Ua^pTh{$ZPOLg15TEXRPS~xkU0pE+9N^b%Zm5$E^f3Wb zp!}rP#~PR;3iZN&alX8OcTKZIxWOM+VjRXUkwzL7$pmI%O_7H~uUwLEQ^4fpW^LYlSf_;TSi>mT7VGdg4`euFX# z!A}dpy@4?M zkJeZ#1F_qLT%PHYD(u(O^7MNj21|^|nvFuN454R68OCPBEDu?onpscOt&YhK(X_L_ z@MR4Q^N9s#$$TPNMFxe&URU)SsPXZ89Wc=QxdmVWa5+|fWjZ{Cte6OvnYK_RudezH zMPx$YvcPHF$Vh;R3VkN^e`!oG8zpT4UkK56DWdeztr9ruV|=)ws4W(q81^R{#}m2= zfYHWk*%2tBP$Ugo6IY{nJCYK^S{TL+MKyrHzoLO0O@ol~PaHAW{{U*B0Nj^ z)4AtqOpDsn41AKlyO^z!iPBdRqYqM|Vc+J*umF4xA|yI@$9z z9Fr{@YHN#Z7%cy_-*4FBBi{V3=ox$gtNA)Q5A| zK*i(nj!da0EPMb0>c*#NK?J*=(7?0y#PHGQj`M@xDOaG9Xp?9u7?A89lJ1=gLE}Ax zoN1sh<%WI03F4)MIP%a1Vf)reqd)70APhdyG#(|O$+xB%3eG5P65fjCQLr{YmY zYP?IQ1#Jr09u|OnI#C($lHXKaJ7J(5HMzeifE4IK1#&2Kp{yaaY>~NGc^Xco7m1pjnY;ZaqVOLLS#ST)_&ml{hZlj4N?Dc zoQ7axBo1qWa3xaSJu^VW&NqO687eN_Q;e;91r4DWH`$$PLo&!gT8j%`wc(R(h3QuQ6*DgFbJ`h4{01!W)=9 zHO_aCDrk2f@Piq%g$bC|v}CdZbb`rSQh1*n*yN1LMbgu+@GOWSwLweR%weN`+)3ov;Khe+s&0yK!}4jkF$KEeQ0zT_fO5^ z$<&v>nolR$%G~E>1}5wYC@j9&&DO|AwLrqz9JiG7z~c-aL0!%4w9NQuNrZImb6zUH z@$D5QHL=Fd(>Jrp0P(3=#I)LMnZj$$nba}_W3HHmSCT-=RQqH%^Sq^s+$xg%SbFju(i zgW3L=o05jJkQcQUJl^gdn73;rIAWYgu8~+C>q;{_>>WE(KmT`bNz|6vlopM!@8|pL z=ZlnyG>^ICnhi){p_w~V2nz13Z*ZK3pLH$kf^D9QxsD5?w~DIqJJzTL%UgYdttP+E zlmIeQNbyvJ?MDzDLkx(oJMgUhjrTS?yy-UCoflCdpwT+8wwBSX$f@^7R`}pk6p~42 zw4=nK6yaC+JTdfU6?B6ZRsNbNG#BQ`3){S$q3JzrkEw86>y-@{K3DX@i zy^&_txcMoE-Z>v%j_G_d+ApN3wGjxjrdzWmmHyPMl}1Qp8CpR%>B{R9)%^m(BkU?O zup!pG)1MI#JY1jGriRv7O9kyyp+ut%%A4pg-t^2gm_J-?vo=$U?7ZZ1OpmcL4m~DS zoj*xfi3U1Ls0RK68$)-!PM_Up=!2Xjbd~L0~dihjhqouosXpJ*Y4zz091D z*WcN#DmYHaTZ@BHQ%g4Efg+h5AlMy(Nz(w6#&M^oi$#q+bLHet$dDhY)sp{kM6{eJ zkUvskt3y8~3cXkVxq~=+1nw|V$R-Zqm`QhYI}s7Gv#i2!obBH~T%j1<9VZLf{{ZQf zfu%(_Yh8c;aY*J3(!l=Qt!{p|l268{zB%A~o;DU-8lm*9*mvTB!R>ONDM`VjQ!agA zmqxwG9Yf!pN@;0eTbNO^S@(tYdUxgM_`bcnkl|?Si0ad?ABSAc7|}=2ErD7kVya)s z;oZ``60LAbNS7Iyb%{L?5_){8M0&%7)9U6-VJ=UeYHeB*qDnc1sG(eLf;eJfX=3$J zK8hSxwIckQR=s@!UBa)j8GFYqcOr8Bb>S7Np*JCZ=%VtD!pLa&=cx3U1l~xe@5Ik$ z=p~5>(dBl)D?r&V42?uUn14aRGS#)CVIU$k+R^LMV>XTKXw4#qO=B#w<=PxCohFhS zl8oahDnG%p+=oYsf@7QkHo66ug?%wX4PJw_F)#M!DkvDjDiw`jMc)h+49bP--h4XKTG)xAP; zcs>`N_}yC;JsOAsAZ!fIeXkm`nG`GoZdU}Lx_!M z=jjLtR<^D|_&~XSQI5Y;f!lS-jNMG-OPK2>&0|U&VrvqXM9)7tJ6WtdkwMTlbYXX4 zfBheuEchRl>M4HP^-v@JU*Hxh)Grh>m0?BU_UDa}#{@Rf-&38$HcYLyuc7s`-4*?Zt&B5dnoP9@cxaSw5Vk(cwHRQV zV2LviCOCWu3EZGHu$$%I;xyE2jB8qrsyv*jp|(nd23QQ9)<=xQ8%whJG@P>1VrZtf zHK60cZmAb_qxBzlrL$d_2zE9ta7pcd_UEgyr~BS&9VDKw8gzTux?SWuy6%?V%z(Ep z@_<%@GoEcXFE*bygj(BhwzXrXfzSzX#m(X`1Ph0LHLxa1uRIdw;JKj&)5+rTqN6Fm zF#^Ik_dwwgB&KdnhqWXPAlv|Dm2ffXnsAkrO`cNXc>ep(xj!d4Cw~o5zjA@9H+_YdqG||B-OdVNDPhzoAcu&L`ksiB<=7%A z*>o6{gQDDAZ}E?vewkE}}cQ8*#!Ffbwj14rDTM{#XV{4%%mQ8$;)+Ef!>zua`+qVqpuyChc4I z?a59yn`O3@E!gU~;21A{k$jv0!t~-?AuReGUug5$G z2y=z8DuiQTZ)#|SO4>~Ybj-a%EF-}_dDCw0~ ztYryax8jqLGe8$K*JtMbVopNr&~+{oqHk*=L^dkvAB4Te7ALjt67I z3yusLRq%YoGy~wj`}!pZPt=mN+GGfWr+6WnjoY`I_V$9R&-q>h!J5bFN903( ztE-WRei)EOofJQNT189MD3cH=ZqfKq$FgN&_-VTpMY(UZ~sGzT`W@|&-g(cxU z>KwAWgmu)d0@~(QfSVQ};ENOh@gXUd&`5fj zvy^|(LwxO7JClAsrjr5_*qT`fQYI|4LF)?JQlol_Ve584@*ilsIM=G`K0)gZYDl|L zL^o$|W4cX&yjHKte^*#$(%dK0s>XFNT;IvZeBeD1^!9HAlQ##^w{tpMmf8uw|IALj z4P>fKUdJEX`Lt)5{@2$WNHWZSFJj%B`8!w7`X5Tx|2Nn|%GgcN+}h~(t?Iv%Es|6= zqJQhG*Noa?cVun~%xuAu_&~F>8EWyI;KF{s0$)^SAs}uf&KfNE)MJkghu`3%u?v}8 zn3uNGbQxud7fLS*H5+)r8L+5i%`b%AFYN!N)NqdS8;eb?U_nI*AXRg1{R?dXx=K9x zg|HJ%JtCa4Ed6@cE#RaL;i4%+Qhy=rwuUS*_WvofX^lz2S(2{qj!K2KFNQqIthvt8a-5o5NCUcN`_k)z0Wj}bO~VZ zZ?;;%`UtaP@RE6nTn{oBIYtC-@=yOYcvn*mP#e{bm68Yp>sPe?OJOGr+|*BxK!r!_ zj!bcBSVDY%iMcJ}%Xzs;iQy4kkIL8CH2gK^F#ZyvC4LFf1qU2B(_k)vH#^Z}2S)`3 zoS1YsArT;vCJth?aByF5_T1_+?+&i&Q+Os32H;SGKjvndi$T&-vy8Np8m~l2^Y8+3 zy}?&;l9)t0NIaknPNQg2Jf-L*ghYg^-Z#eCV z7|p0ge}YK3htTg5_hSMT+d*2!)m{FshfF)QY`j%{bT0%g<;#g}2*lR8PLzI>RS2Dn zBNcNY3>$SdcH!qzl3R_PI+4TfEE66wPFTIN;Svow&U--7t0>>UcM4-&w+^Z|EC!2? z(Du`$K%`ty4wC>iZ7A$SLAZ!L5X%2hMVq+f5+_N2gT;1>FdSTqb6lmE20W`M+{saw zL@z!ywggmC8&jt;$V0K;QE{TW9A*H-IN$Ps`({f&@I)aCOF|S%ha8$nH)Kh<9(%R*1XjmQ-R z<(N2%SY+qcxT1OutoCDCRW;sa)`({Od&_(lvF+hS!KTx8ow|jZ2pzn{r?78&L`}$9 z_#FTOkc2R5+`E1dlBO&#Ip-p-I5u_DACbq`Y`x%d>J_ZtSy0OAth48Q0dd}vA+Jb` zPFY!>(SAtb7=gT^v}eg8@%F#T5~6p#rgwNS)b3csfw>i5+D zPuTGP`_#+XI+~mOVv~P+>;JF3Gf73qVVxb>>!qeOfo!yv)Tl&mduzF<)nI%D-HbG* zzk7K7KWzBC?5xk1u6|%dNz8IIqq9winJ>hxe{j_XaYVug2*SUIewZ>S?k|M}Jxa?d zm$+V1)A7ZoV8u@GM#eS`@lmohriV5EZIVel=(-6eLge^mvN?3FDhly0nJV#@OjTb0 zA2OA>nmM`hc*8o5@;paV;cz}JbgAXbol|`v0;Z6Qo4~1bpXx}BmX%E6JLp5^i z=G|d=A-%ncj=mNxa3wrtfCdRCzj!Mi?RD`4NMHh3E8GElCN(ag;JWr4jdktbo(Ki| zoFaI-gceuUfxu=Dk>{%$J0>k|=Av0^D)g~KXmK49dOvj}+Q7Fx@-V&DaKoAB?f~{( zf1pW6yZpT3FA@F$`xPi@K9)aDaGF(|L?+fo95*14^N@{_G*SB|pCrJL5oi}f+?cC& zY0+JODKGg1a?LMK`V-dkl*0~zvQho zp%`q!O}toVhDzgp^gjpQ>s3O)Z{MpbgqP2nTVJ+|PwsYhS0*B<;xF3*i-t zt*ByCWY(6&Bxe^c=&+gX=K$YSH43Av( zPFZB`GxScz2&HR~TOLGs0DH*lnL`9~vUI~fzwkF>_qLuhR=emuM_pBS#6eBWPv&Zi zOK{ZR7HJj4*YmXfavbdH%4)ce0zWOXy1t!Ri+t-G*M}7|qG&=Z9WT7WhdoF8C1+C_ z4T!t`r3Hf&`i#R_%un%J#|EfXZ=t}crgi^8n!%*T&fWkSD4%@qduP6!;>Vplw{W_J z7CQ8?^jbiz5{!8>Dw@62{9dm6ZlPAWS*=V{kHA7+w;!PYs?q&Ggm5Ly$4tCa9}sftpO4m+C%xT6%_mg?G{u+w^lwNmlI=vG{~+7 zLjgbt8q?PZLyaO`7ra{6hZ3OE?eV5g`P+3~#+A?@YuH6~aC@pi%9>03{`^|woS4yH z?8N!lBEb~6p2-i8h8L_s(w{Mq7(ms zvfxXimL-IOi9#K#lC<)nb-!`^eDH_(NN^&2vlbKwS|d0Qc)1NUTZR~XmDk0Qd5n!9 ziErSC?KP_U&;qPPrg*ux((}L2^AaqM zv*Iv=I{Ff-9+F?dQfI$i;6au~1TMkS$hM7%~$R*D@+>C-6R zs0N1HKa`*BPh4uZFZBO&^B<@*2pGbrc{=`V{NG6be>T6egOjC;sf4M`Pd(7Tyj)l6 zn$AS*{{*hPlu2Ff4gnvi==F0o(=b|7y-@Tv|CB170+I@4NMOYlJ@u5bl9yiD#EuV4 z15Zlmw|2Z=s7Y5hVrBK2#Lo6$3hAF=_Qz!OE7boW734oiB|n7yFBYg45dCTwsNX}B zIi2T+1xhmW0)D`<6k(uhpf0Hg#{MlZN@9`aWX$R(MFZ5@d)QRWLbI4Gj?Eq~(OO1o zO>-Ush+2$~Z;$_T3T8LOlgrZm-w!2k5kh%H{=ur%m^4ngJFC1yUG)PM{6wgFJ`MD=R3SGOsgg61KBhwlOsw2oE6%SfL0@ zK>V#GLwonHG=b+QL_SyX!t1NUdSMA}b(SdU$%k7}8jf;Obe1HygUdhdSdTT3JD&^~ zaAa}Q|8$uAV#O2wwmXEm?DuhJ!F<3A-9p^tkG{ScR_BXG)W@8qI0^}56P;*d2swxo zDJBFSLOHgH5U~vRmON&JpcMWBG8P)sJg0?J>AM7o6QJ4%{#~*NTq#8thqx9T0P{)a zjn8rLhLWcbI^<^qDbMxBL-gtMa~%4?O{N3yezg~Q6b+4y`_FIjjwbKchmxI*1DiMdf=6&IB`*(sn*I$ zK!q}ci8dA=VvWRby^6z{6(*LhfM!UsfFOK+#U09?zzpGnosKh58ViU<(NV%tEA`h4 zs^TngFK??Px3l+3Mua*)b@|-1=fIxJ?8FJ0K=Z}fJpm6@wn#SN(3lqawlFO3^_AAV5&LG6;(^X;G zoTEsCzWs+o0a&|0>r4xrQf$wKM@OOhL-e2ushr_7Z)hxM2`6+Ty9SRuA;!jZ# zUEgZUj16+lTMRCC>T67=8XG4-T~!wXA~&+5{4#*+*HkWGe_M=|v>e|`9ESqGR(6q&8S0S?u}{2$y*8@h`o5r;8he9&9VcV%xF9Qvql#W(`f_svE@Q%I2JuS6 z(*5)X_tL=f^lC%7YM!Z^@an>h3}rg~dfvRFwFh$ByM5v{RMl+jY1yGpQPQ1KXJf); z*}XQH6tcE!D|2B?fnXsg$VT=Et$hwRsm1I5JUHdP%6TsXe>i8lqLMwI9&`xyAo`6UR>u{r?cAYiIhO;ko~P z4Z;6)jqU&GaruwBj{hFtOY*;1?d)XyA7A))=I1y|T?xyN_Fzo~0Ko9S{DP37^FPm{ ze?iWamaX#!8`9Uce*Ma{OPNYOZE060CVAJmeSL{9_Lv=A*O>_cQX+zKFqr=(h3(h- z6%c`_QjrY#YrF{=VV|yndp$io+PY5*@XW5+@ZQ5dj$CnuQ(HV^mNc3(s23#+{GJ4z znv{$=SYRRC<;~+0p%xE8sWBQB5~G?-H2^+&r1Pwk5nkFpcwM4&xCT_@h!8gEu=Ic+ zhJocDYSc+n8Zv4ujgqDUK}8sKXILjAeLel{e$ExFo~~m`b((;SBMwBwtf=tP4B&;j zJVf3D#%T4F3zQIoJuy8v71$GVvC#*BHUT8iXB|uLu+O?w+T+qoAgSSbRFcUm$N{jB z6|W%zCGHs+I)xZa=AzXg2_y_>4J$rPGF<^F59T(`&W^5tuOn@b1$?;oRCas#`1wf^ z-=pWvDdOWOk=>@UK%;Wage-LOfkNh@8+^EFaCUpi#f849qcIDRQgvaZI{1~(y{X;P zr$79`7aMzzOQ$5kh$pnLT=nmPVo~jeM04r;_Kwu7P-%k<#?LsdEc^R-L&gaCVLXN- zNa=FbEu(d8$AICGMe{Cug84fE39ov~wkGIcmMCs}CwP$VkzgItvtPtP4;&-qX}ce# z5y=(MVM^HhZKngxS;L=vp&RbIN8|R}pX;+8Sw|mB)*PvcChhL{eNm~wz@JMCWp{lb( zv7a)|vn!F-J97}XE^Oz4uvdbPTxoI4m>5SJq7i!bH-!q9a25+j^7D;U&od#@ ziOejP`n<4HJdBWFOddh%g1z^o8H)^hV9mTIV5Y$EK0Ri6a7!H4y^XZ3%J6|4_(|{6 zRNdh*Fu?1hhPZp4KGp%}RB!o+w!Ae}RQ;(-hGMNg}KDL+( zVyti13f{lS0&-T~MGeIF_3!odeWX(6#mUjZ%Z1sy>8Zrmd#0Dm6Xr=5$PSEr7+J$H z(PFUlPmjvaF-iHp`dkx5<+66(2|zP6jQ_M+dW%`y3&N^{l=(J0_-vr&sbn^nqTbe(C2tlO>ftXwv8%msM#Z7?XU7Zfrd{L~oiVZ4YjDd%R%x!x zKW#?mm1n~f0I46G!Qpf1$_`UnLUDAnxV zV7SutRN^%9n5^tr!oSL=Mc-(4#cz}>~m%I>>+0o?w9 z4c~iJlsTqm6A#xtAt(HiYbXgpdE=9bTn8Ks9|9Ggqgo~OYbFjNjr!D{^bqXg&_>ko zcDG5oQm63kOcDg-3Pw+*T-#%q;~sR({TAh9DmQo??YLR6yGPP5V?7^+`d0Ng@+^Kb zDa<(}abp1y&Y>Qc&V#EWajEJvwKa3Dz0KeP=F{p5JgSs4-adLDuvH5`YOcZrF^Vk>gB?o<35nmABvmQ%o6yd;~@2Zz@rd=0Yl;yZ^swe4f1L&lOBw~HOYo>C2!B@p&ojum|zV7#+nyE$eEwn5KE1&AW?2Ylpwp<$3Q0w(DI??v_ zbi(^tN{NaY3TB$_S|G1@7CTx}y&UVd$hS0SmO#OcFMwzIR*svxD1{(DmwQibBixnc zthWB9$<(MZ6ra{#@#h*}ekSY1x)u#$j8TN1Hf|BZl&2?7oWXp(u_B(~Zh3S-&)l%G z*L-`C9qI0NzIi&c_?>!Juty>~yN?}HabCed8LGGB26j2zc+ziPs3=M`GoBOY0O$|- zUH#2{=mTy-JY(t%Z3Ok%s;j9@Du%lc=E_m4v8%V#MlE*zwAQ+Ci>DWjIet`XvexzJ zLMfDRjPeD?-{0fH9?PzNiVq)BUw4U z&YZ%_)eWz#AP+pttURc+#S){D)S^nouWYSoalEvfbuui+UuyKItJUwFSrmG{`&d$Q zS_?YAvrW$xa*W@`M~a5P`56u10^iiF1BSCqR_yUhVw49P(Ow?k+?KUW=wAi}cPqjd zJq^Yzsxw&pY`ybul51$7dCZ?TiE)amUEiZ-18tpAxZJIdp!WTBsPkkP+9zv{lc(?MpEjz4z!Ug9E!i+{pEQC%Ho%|I);Jo9c6^?aME{%=zJ>#G2xM9jt@_0o_^(` zfOIP{mY~KS8Sg|6+q12p=tg66ZZoB&`F-oNSS9umyY@$9Mi^(_69VvxX1w`&Z}OH~zfsHTr}&yNEVORjNZ}UP9M#elFSDFZ}Gi z;abAGVOu5WJ^rhY|59D`Psbx#N@nrckIY_=@_*xg{&_Y0=L_JUfB1g~?*D&E9gj4& zls7mK{ATp?55{uFAd$el1kRcjEYb-bfF~aq3s*Bm3?}d-)3gxpL_MVtSOPKJQ7rG>d|kLedVmBhOa7Kd5IE?A?7kj` z6|?1nWJ?P2q%M=Q23ZVwn7rm(z5Mk8Q@TSqPc(;whlC!$hVX#G6C>(g!q7}K;hJ(u z)rq@ibVyc8WEwL%(!Q3;RW?RLPXa{tz$U>pC&GC0`phQ0|43DZS0^D_r*a*6h-7D(Sm~t7j^Fs znLxm(@k0uWO3-tCfK(T}QWms>snym0B_bJljf~|K*>iZ_`f@;t=a=-e@99(TUw}MS zuG-Kt16;Onu8kB>0KEU1BU&_hL7l&!pfTV|L%O+S^j~}cR5}#f$lTb_2M-biHac?1 zg`9d^7&5O#J^TP6hH*2R={!`Eo=h>ii5!}3raLfX{^0C96DMP=HPEw#(a6Y1cJ{{| zblB4FWMsbEK_vSYAxnptAw#wqmL$6matuV;3Yx;&)}{HCu*s_HGD1A6YRO&BB`kiH z8gfzP7ERsKzi3s+(hRyBePyrItWEq!wqB|66zo+nkYrq!zOsUqHbr}{BR{wZ%H>xp z?82hSW4CL65(W?VPa{u1N_>K5lb7m2yZW!oS)^mSR~X|I(Kl_PLWI4$lj2n1nmK7@ zHuMRm+r$|e6D&^)Co4E_rX_?g;v~iHpqm4ue!R}n+@Vq=48FtNYseiatgs8m_9aqR z`ZV#FrOu@|hLBO9FvH5Sh1QFUkqsJIQohn|M#@=`BU{6;T%lWly_B2y3>-iEE(0@* zR_`}|#^GkBn89#Ld|K}J&KDjBT0wPg2Q_2#X%G030iY$+n{(Ult1J0EpOQ)7FosLQ zIG$YXYn;lVfsw&Ra?zQKo4t)6jrXr3uZwR~E$x=KYtdF$S5S8TS@~l;e)ZrAc5FO6 z{jk;Hr=h{<+JVs>qSr^h&%>sp`ZUvXn~$jxF}a=2X5#g>#ji|7)SjhNbh0I=XIsN< zT1!i7^HeHWZPt1K?m+hF-S|K5FkKrLwJUbaLiZ5zSgc%rKk0mXmOMikt83 zdEKwlJL;p%JD@>pwYygoZvMZKNKB^ZP+cdlwZCsdn!nqsMEZ@IDp$>*JqT%ffT9Lj zqe{3pL?SBndq7pM{WSZ|`7|5Dt5vFUxWE5{Q-J`OYn&7CyS;b{{gH)Eer`yf|0O>m zYUg6<;`#4xAyX#>CwmXif9E2o>{xFwAo#)``n9zdlREFaY)E5F!a8D)(q9HAmKLm@ zXs9GalaRBTe!t7fVYwHFOkvoZyDmBD?|L=CY)4(QXW!TG?22J ztK=kBRmr$-VAr(Y>-1Z+oAKLPURb~mTy0LasRZ!T>@6%HhXV_~7`n`G`>|qSo~uh>DWgV^W*fd;%E?|{+-rJ8 zsSawI$b8|%?L=r0rGPalH3w?cKVah8qftwcX1_}qUSQC@4ijPNEJ}fQdl+^D-8V){ zn*U=eQRc!HFZ{I+-kNk~((Gt7FlNOUYYc&|Sk2&Xicn2f_{b7&&>ou-<#8z({Sp_J zvDBRJEIr3WCzJFZ3S}ixC_!irUer%E3SSg2D3pDN?}{vSeI7iP$2miI3scmf%VBjc zSa+^87gwDvhTR3lvgy>j@I_6w?J}HVm%RkivR5Fmgp))Aprnp&44K4)TvKRNu6z zhS&io-nDq%4&>d^93HsXWQ(E5v(Zz+?mBn|> zXd2M5fDj6MXw)||`~vgoi~Y3{2qt`w@~z~oz!OrHJa)kTeLQl|k_0KLY~XqK5CL>U z+j-oDIDfG;Aa;{r*3w-#t*%lrtAGr-;<)L{=n6sSj$Zum^%P^tGK2@TE zw+flKVXGiEp<*J;fX$TOPKpgMpcz<8e_u-RwQucX2dUNyY+LAG975kq;i?CiJw?-5 zbsAyVl3g@m^Lf>YnB&Iw5VL0}JNxz4c)FD)rMG|g*JI}y)*$wkZPug@!`Y|+QYPgw z9t>OY(f*_Um@F${p-~;Y4$Gp<2WS}?E7HT1ZTfltwAtXtnyh2hfIHGfgYjGQzoJA|! z`kCPLX+TTslK)Xbab`xg>)r*P=5*)fhihZ4vZ8an3K0iqgvA*G1zB*&w-5XSYp@CUUZ6#gb0xW~}gyVAFAkC^u_|jgjMy0kh0&3h`Tw46(5t_|=_9qC?oF zO+|xlm@Bn6*rd>inc7$<-yf-8y@34)my|(M1jcCCjbJGCo4{70di}8w{G4E~N*=3n zD3EFy^L=i)ZLZ@)o4@aGQ_=cOtRH)? z_!PChN=8Snn6?FE7-pD`5=gqyJr#+$R?R2(_G6e|4uB424j|;hLqUMUOfPDxw6CB| zxgH$nWxaC-8+GaW8!!Semrs*cW4XhWP7GZk;w5L!z-S)s0sFenrdqe9ljT|3Q==rB z|GUopiAhCJeKZgZ#5sk_Ouv2^ae*`BgmH#2va#ic)6&){fxlw7Pq?&0Xa z9dzl}$)5_EMz4dVb}D2(S5+z{S`GKj$A!_Cr~h1T*dJLdcXux|pIsW9=N#c|0Z=4f z`dN4m+KQJN37iJYl%eXyxW-PJ)``sHlUF_*r>^0Xi~2d2p|1KyKBty>A^Cu7oHT}% z6VfHJ*0+Vr=s^5E>lS%|5R5IvvwM#l_WM6N1q6U}eUE^hpyl-O52l{|D9-ul;tUbhE}A3&4PPtZW`WuK7KVfi@~)e6aWSDyPu1AxtbUOPT{w(ZQgQm z8CTCNRorP>B(bvgtm^l@U3Xw|)lrvw(P&<z|XpYDXUzp-RU1T?Almrj+kJBAicvPI^uNv(O6Qh-*Ry?~=W+ZYhL{+Quc=)_Tzs z>o*rE1q7AF2!Gk@ny6UknyOR>mby*qS-yt6$65oro&?&!WFqo=llF`lkL!o&f=f5zhXxzdk&_&w?)&kxx1igmEsHdRS(S+2_G}ueBbwzgkJ*H@? z7%XAswJZxRy5)0T?a}1y>qe-UCoi?>hSEOU9fH0-MVy7{3Gb-h>qRME{N?vTMJIJB z*Mbsgb-|jhk0>?Og|PT?MDE}EX~Yr5=lh0GTzQ7V)tyc1RhVLq+2P@m+u?Fcv0QNANpIWTOyk0e2q9TV8obsO zy4>yDZ~{mKB1kG$TwT8fi6ZrS?(OpU3-i4{LB6KQq(sB;=Ohuvp+|ck;&GlV8Z$~V z@teYN9?fw*p-&`hl=3>w;^QE&cLXIk)#b+b<_@vwA-83XME{fE%#GDZ+;EKPXenWI z{3?m{-biCQC=UtSWzIuJef@gR$~P)Bm-Qb}yE&H zPAPq{sT;a+DXo~57T==bL!vMv#d)?NW8^U#xLf1pCygacA1zf!1=B^awSVz7ji2JZ z@7&G6lx*4?^>C|KAS<#GzRm?WczxazXAj2LKyYz2p;oP~1finMDvXL-x^i*-D01re zE;m8gyMVt-@3G|WdrV-IGG4zCWNUQH8c_8R)@!%Y3c-^^4Lp0Eq!3h@{FjH&?#&uA z)2qu9)&2L@toMf*q){A}`c`k`Pi>})$mDCEu_&KiRdiST=M?cV?UCIoOI0ws4gU_Hn z7ZvC2i<9tS7tylLhraP@0rlvV_?oo8qs9@~?}$oyS~*J$?h`(BB026#fqX#$DQ>le z%@K$41T=OmD!c*0a)4jucmVrAVt?iYIPYm(O8Gx#`A_9Pb(mhj7qg@-p@K}y>sxx; zyLQ~=af?pMbqS^6-rok3dmN;x!SDu!YeCr319t#}+73U!{xIoFnn!&F`+)U?cI-OA zf4oC%M(=`T1_o~h{4zP7{QS#Iu@1|Ke#w3x4SM2F6h(tS1oiEue__7$91Si&2Wl)A zHNq&}*v2(+MRj#h)n5eOhj1zY1rSA00AMFqG${CnD%fI7=|T-rgE35rfT+>tA?G;M z{Ur&(@_=+lC-dpzV}rbQg%MwV&4mhO4jhZ16Ri*gDKKTk_JKY~^fhiW&@>W@4^%X3 zsy0*Zj~K*lC5!f!LFa$>Q+g350QqJTe-`R=IKdU#mT${+K@Kmj`TEwM8A`d)e+T+g zHKds}GiN$^{ADg3cu52ZkSKBRTa@W8+!!qY@@i7HM~!0o zJA$yN?zu^Ws5Zh&{0NdaB?stp_aRv}nPl;|HNxg5d~c#p;9mVr`hHSOUA()S7-z3{ zz3LoF12sY#P%`4E`CaHKXMCdpCB*J?^jIme!EK{zh%PJyG?xqz)Fj*f92g}zBs{(~ z6j26Uj5v+~sEbeg+CK3F?!!tJfQVAKE--x%51^|!IfP>%R5g?iQUo9_Ve2b|)Ufo= z3{q|HnjJaiUx@7E2t_wnFuuY6o3s&i3m*TDsk$T<%2b5Y2#NEd{<=$c8QkvT_ zk_nwbe8MpN@D9g_qkeP-fcrj&i91PTduqU0aJ)TOl<`m?4`~_WR%Vv^;M_Q;5ZLb& zN@VJZjN*vI=V)|&_or7Cv1Y^c9>~?oKA=EVM;1K@mgoj_ zpJ@JB-6Z(+a8&lkQF4};jyvMI$9#$R!~3fJ^x6mM#?a98+vA^$(2fF(ZlRKr2Xo4=<-`0ElrmVU(l_= zY9eFZUCKNQJUY~aBC_A0gMtLP9boii-%3}2Hy&@E63C?Z}e7VWM`6t8Xbdy<7tsor_Fb0|NNAQw!P z6H0O{w>dF|G6Rw%$_a|#cTko}bn*!*{ae^VI_QDnCAx-$DHu2T@(vA8vHDZu%$Nnr zc3{iB$JPZZt~ARLP4e043X%~gmccd4BS4dKZJ{$b4v43Cq)91Fz84zViUPhirA>JKPVLP;plVuxG$S19JjY3U_G*3RyMIWb~jD zWvN(6zsy;YmWBQ?3YqF4LHIiOH?V7?0xh_>n&~X9gX;C4#ye1|5Sfz}f^< zXkuH3U0EFl0sxWAp%X_23?8h#%u{;yNwmd^VQos;U-x@vaf#X?=c3S1iiZ8)Q>)dzmM|xLl|{YJ%awIfA%G# z_4=#LG|+9!k-0dIt0Q{V=5V&J-i%O&S!is*`Fg|Q<=a(Qr}$q>>U}X3t4S)&G=(o! z%AS1W6z`@p#t$E`x{P257~y76H1!6J@*L`sYk3p|)~_=~+aLRepEP6tU0jYafML+5 z28!)NE(K}>caO(i48v`D|y zJX^M*WX-aGM0ynVhXeBA4e-8ClaZh;uJ!8|7M(RZRU(7{vlQ3Ia7rG7HAu28inSB!I@p*{c=df4ONYa%8>MR)n&AP*aIp*);Iln;rjI$W4Hty7u+lWxp- z4(*EZ5B;5l90s#i!kIy$kpx@A=eaSq9@oVSSMpNzlMUkTkPGiLiLdRy@2_o_#tJP< zhRm-MvcrUVZlB!-A;Z=b%ud<8xDr8`bv>h45(aI3H$kh&${Non55$q49xd+8S3tGa zBV02cmZgD8tY&DM@|HY(znCixx6KjzGxJf8&5S0*lJ@FHr#03XG0?Zi^0tA!X-?qx z{jOJt`}9jJXi(@!Ww9oiSgT_YPQyS|_%^B1!~ElWK<-I!p?TE}BA^Q8>aGBeEDBdC zSd+*ij-Lu|VbWm--YTRWW+jh;5`5?Er&ur0Or_$9Ef9^Op2AXl(+@i6R#70dje6fW7MEOv~CqHw}jRnt}vc$Uuad-fW2+T*yM9K zEp$R?r>yfvr-r{5aUGd-@AaVJ>v*tYFG0FT8SSxSANn|$K@(k zDvR!Lfop(rP>r)6nt$4BIamm@6Ue1&wim;S#GlI8^T?aPTQRSQY0|m+LVxw7cV#3;U|-M< zF}Ev-ufAn_pS_#!Pd||#xoAI$!2cvd)$&gOIcy7hrkg4TY^tKkZ5x3;XwwUF0edSRl`%}LCj(?=r-8>xE*x}y zH>1_nF_)ulQb=OvkCW``g)BK~=&!?S`DK6hs`5()%g8J_fS=i!X1EAZ%cuyb>oT0D zMvyi0oed<>-UQ7Oj+}QT>^*1*Cw3C)n$?x#o%NFp)Ez8twdVt&dJGsUBfKmH=On07 zm5y(AJ6^U>qcEx~Z7d%)vAC9~?p<+1;JhmB3@_sp`SB{H#1lt#Vfn|BXvMws@Pyvd z56~rp(iJ0xeD7f$wQXu6$zG4m14jx7?WTjHZvOi8;>dJEP79BHaq90*%x4wJ;Puo( zWbaMPq)j2IzX&j2*sR0MoT+iHQTyK;+ASC%hH-kwG5*7TE*_Cn}8oGc}Xf1QX$d^?za?ykZD*g6FZoMyfU;>lQF?_QS_I*RJpL4L|id1 zQbamo5mIQ!6ZQRAlV&F;^it@$+4g$4RqfWhx@rN=D|uFX*>yq>4nT~$)Be>?TO4$L zxH6z!1STL_lcGB@SU)(hIBS~f=-oV^oEH=TQ=CJCVGs1JW>$I8W@Q3)r`_;w@zZ+i9?;S0&xxF7;~ajiq}_FII< z*wAvG8FcJABk&%=#Gy+~w~08pzdx?>V>+0jJ6HYuz~)YqePUxUt`C!F88<@Wu*Ee1 z;Mcoyja5AOZ*tmGW%>iMH5mn~q#XiYHU0EiOZx{4NNMrCU$@lw96jaqobfox&zzJc zWij-moSMP<{TKs@w-%Rs^%6wvv`+q@dHq^V%AUMl6hwe74EsyG^8FJ9AIH{@jUjb>A zxiY7_n#x`SLNve#$@>?3xN!5X4XE2aA8jpiZ^o~DzDW5zX=V3c9yn=E|&Io|Kg^y)%@fSI1oPZ zBW@VNno2>O@+l{-x6#_DX+oqvl(d_|5QOaZoAl;M%(;`dBW`?+M=Ud&*0k9w2@{&aS=18y*2D4*)+36Sp*L#0XrphH4ZfG03Y>e@Od7BNqY8AC2dz)pp(fbeHm zPy+XXh}eum<^pzyW+@>^Qj`WSpiL&icq0Lq0wO0i8j?{mK$5_@A;Tq+80^Wwn$+J> zC&U+d6A?f@j;t-w>L?I8Tt^QlCqdXX7!G>38Suq`f)Ww@L_o^`V@y9(z$MOJzJ)?u zBj6&8CANVk=fj4XkAwOOFFZoogDn6SiS1*Gh|s}ot@F~ipaDd&&T~jQk{c5(ZI{qQ z8b}Z#vrH0!&mwiZfuF3j0{?`_^sTtnu5@EB4-uPu#6Zcu^2%_W$u!sFb_T4 zHMu**K3yGLi@H0Mj=FUORWA7AbFJ`B)xok~ZRh=R`ZagmH)VTs+~IdFlsk`)!n#;5 zxCKN788v8hd<5$lmFQ8#9u1A=)#4w5Kt3NpIf4U{ zK1tj`mjUNuyyI%HvvA2pF|QoVcq*;qPk@V75G0pOvKeq7BGG)<02@hfgoXDL zU}JT4eLQ?DCiOucSd5^2CZ{3eBPVnQb=|s114g`u)SY0ypIGiP!y!2`i9SVNy(Gyd zNbt-7EgU(vqpIJm=Jn(iZe>_Q+u7gYQh3&?cxc2o^m23Af1d(dhoVbEv=^E*`pBqi zbY>))d)n$;)gS@vyW=IGZ!&CoQp+`A!qoSn-u7k-sxAQ&+LKe=S^au#XP-Hl+|DlH zP@4tn*^q$oTLBO?wgN*kr>r+w2pMGfaE`0|aGn5EWOPhqZ3vJ|Kbpn}bIPAw0z8b- zo=lWC1GOf?CF7(3ACYje-5kXNod%%C5(h#<&D{AwUnf?6e2v-5KYl1uE808#dvPFN zZOwoq>EUbdi?EcQs?myY!1x9fF2CMPE+DeFy#dsWV*n@-B+ia=mcS8B6g5lfi!f#m zok((Rk!BQCvoNIC^R2>xh5Bk%Q*gLvI_n7%t*pt}ggC=XC10B}`D8L-a(#$P_)_&~ zDzgpp3Eqc!A_VLr{Wwo879tD-{sp+jt)AJT--ta%T>BOiTnuw#2-%wGA^vmA=QH@4 zGe&9Aj}C%JnsVhAHAH!-xGFGTjJU`7UVbd460ev}3H4-Y%2mO=H{6b}SmEy9ft=QF z40=F1%l71g*Y`xt?)CeO9)7A)tJDiKe%?@yC{P@;`tMU#J~q4v$cV1(@^Xoz#@PbZ z95hzvC@RC_MZJji+?C^7D$u{2hJX-Mjf)itTda-Nlou3!rhsfTSK5sVN*DF>M7CaX zkIhvk8FAICqyj0s_4vrBwn&Aq6zApHZQCtqR}9?Tgzy;Cd@t1|NMb&!4ck|6lqNb_0|0|FEOk2 zwm#&=NV;OZcD?R8|{M4H-PrMa+Kk- zN!8SB_#3H!GE(a@+TLe_3fdK=^GscWnIJ5EZ@JxI#>n=l-(N9j0V?hKdU^g6R1QU;N3uPAAHYl70fAy3W zyGXgWYh##WB+z)1aUK@tV zQ&3$Y?P@9^u9k0|JV>$4FS)2=n`J5qgT$s=UYfMaSogTARt5y@wST&PSg={$=(@kIbwU0^P)RQ_wI zZ5P$iEi440lHq~!DRI_aQegRuZ@rh&V-S73QIrJwaK#>>{?|ElFi8E4Izk#g%z`|U zjW?1iTVXu-bExa?^cue^Y4NO3c*4PC@rg*HTZ6xnJBsKR9-&)@-Ut7q(h@%|=>*R2 z&L6+sdYML^a(U)$QI2vdRgD~xH758RNS4;EFzD&ubI`Z_Hp17Ej2KA`E=bU<93gz) zFmqm;wye6|=)gy2k1+aW#tTE@RjAJjZT8P^FM35CDSz<}r9s4_^$(e@4l@;8-6VsU zPoND#u@)_VGUz%XpfI-%GArrj+il}T_taYO zpuf2ka?_)xuvyVy74R0JT|Y>doTYGcX)FSCNbKQVO1VQ#_*Ad6zHtu-@2f|z4GT&t zjRV8bORTN7?oSl7B^OoaOt1FV9=fG(5q8%eugh|s$}ylK7Izb1pd)3@W0hL{&JI-y zfMJxnl%`VZ;=n2Vv@%f@0mKU1$TI`fvJA`aXUxjt_TjO*^Ifk__J#9<|8xt(H=x&F z_R-@tjtXdHye(EHnWwKd<;8vwX?_}^8J%vM9(r_Qe06r@&ZN0=J|NhbT~I9e#e&(` zR9yo40^oVUqAFw)%AfSOCRw8 zcDo1s9o+-&sZt%*LQh<~R(tM(>&=$hLlyiPeisU-v9wqV+dGfWw6#Hu^2~vwFAQ13 zH6J`El9In-98UAgOtPB^<-$*yq_V3>myai~+3E5PV|lv1(s)%cmekg#foT@~V=1|+ zYa7)UWr22D;SE{A$H}fJdi&7}s1vIBMiy~+Ge74|bzo4w9q;c7p|7l6%dwcQTh8LWCu51=ZjMOi|Kq@zenbmmS!#q&{GYV3)J?W5ho=Y)&gW2!1a8A<6-i2~xspVU0lU($t zWKc@cBHt*E!Ejjy>WE{O5FE?JR-9egua*sA0aekj3ad}XU5#1pai+3ZY@~>36$nJ+ z5IKDyEX}i0M>xRq1jIS~7WIFZ9*kTnX4cX!NNGPT>Q`tg7cn+2<~ z04@JN?7ef4E?t-QS+;H4wr$%yW!EX&wolo%ZS$0?PT96K^}Id(bie&|fAjU9Gt(K7 z5gB*nT6gToojY^yyw>kh^p_DPlDH7Jk^lu$^$)m{dfR&r9tIv#{g~R$lkYhv=9aPL z+IXc0qI3XasN1m)Kj*3V5V&vfA2iR_hv9M@2Q& z!VO*JfDP953GjPYgj@D6;Di{nE}-|}UudL@a0?uvA}NVYx|086z-doo5P3}8(IEb}suuh*sgBMFO~7vU>WS~3|M9g}3k+rLp);V! zQ*48N?iHMlagnB_d+ucRZWOqP*2_@*5SpxoFR`#rZCf4$PhqW)%Kn*(K}?!s+50Mx z7G<%*12>ZaOG6r}qos+LSWW5e_{`j;YmV9QjNOu7Zz|E8&BC)Fq~t-F&Id!bIA>jN zZiQ_(VVJ;-a3mys?!c{RypS)`;aL9+%J_+qU>i8s4(IERFp#qRJ-<{bK$&* z-_gsY9))u$TG^=^ud-^6mPsL_xEq$r@`sfuXtuT?tcSFy3nAjJ=^rf-A;^h`Tu5x0RXTx?FoE$`@c8Z@1q|!*7ScB+WcL1 zqwi$u_{|!kH@0`Bx3M#EqW{Mk|MJ_vy(#~ds#*Z`&*OJ3PqZQcfY5(8)wi@)`5#ID zJ#uhE=gf7TE#)h_2dE-DOQ}j~LN3!JgA9434*BBsCr#0+-25JJeB59f2#1%3;*Z;& zt1k5IH^Ppe?PlWoB=NmN-g~Zqaok(H23vKjQnh>Y$S#%nMFu6~rsNSFMBg6Mr2Ria zss4y;Iwmum*^fRBcX&=hF3&2vJ{lc*-i3){gYl!sBhaWtnoJSjMA@i}hneM(CdIqpb&kt}9;9pSHv8m+b{M z4ijs7pe?Y^zUvu09suG}3Pb!C*cM(>e9vw-wH^*m{@4Amxc3SN`4Ec$ots>TtE{Mb zgc^t^2`&U^$5p}6BS#ByqaA2+K)j$UwX2fwqjm6YvR}y8BPpKZOt8iI7jojEkr166 zQap$)e>#JnRRt$t^=VTHg1v#ZOdllUSNzF?k#9telB{xmpcjj+UPKd*_zW2XhL_a@ zmjD66h0?xdyo|S9w)v7E)33@PAzIrw@7&4K&ma6KLFa`f53Nwq3+%V!X-VDPR{#Yp z#gh%GTU>S~B8(=1+AS|p?8$WV%(&JI&dSa$xM$%&9@7$CF44I)r5{0Oh?8*XbK+@h zTHXA7W(dxOqkA3>UA43d4GoQpebW-P1kBqQ$$k7ST{jrDRkB2xHU}Dzr>Z9v0%HBoHdw3D~>i5Ca%P0c;Zhaq=_A{KPmOGxfWt@nZr8XGoF( z6DHC`3gec9+6Gw|Q`kd@qL`1k2h9azpxRZ?A0-8V1V{<_X)_bG2T3X91=Tl{i|)@i zZA5?Vg@>sI2^b-7fYGlOzzyKVVPNCuaXTED1mo9-AOEM~{#C2M*hRt`m{NUZ$Uux3 zAQ3^i9nY_JaLXJAR)Nv#C85NRv;e3CczljPrXgrY){^N)RzaBno3Uc#GtigM;F{34 zKXyqE=Jggdm&(Z@w7YM@w%3bBuD1uL`I^MMm2qX?nv0u*o5yH|@K+V~Qx##Woy{n) z-!EuH$dmnEg>_5<7n*lbYIIh5W6okL1n~;sO>tyQcE_QB62A9fJS&-6>lg@PTij9@ zKA#WTGtcawMe7bue}r+d3E+>R^RY*CYm(?!62O5tG}Bt=rq+#*uup%DAhJ$*bi%j~ z0;8#Ts))|oIu!7Pl~i+7D`P0BU!XtxSH^wORqq}lY)pZ*@B@ce`u91M>=+E9{Tb1M z?)Sse6y|;_6Q0Bhz)!MROshwS2&}=2#pmnV1)$tPiee~r9^>0;5G-id6+D0-m7}z$ z?80d2?@(w#gM0^aBreUM5krL$`%&Zus#ShPhP1y~5b822oc(Q7(3BC|1)D58*zWe-g<;XH} zhH>b)N3BJ(SauG#NOjVBhHX_!q)?U+g32c!+7@+!}xkuQ-ciBcXsV zy@je0iFe}QvcTIe-G`gB!<0#I!PWglSkDPZC^5S2t6{gCSMmTUJ9zE7qIt-M587~Z)#=)zIXXhW^>So(l}B%O`=IAo6e zQ&ld;w@Vs;I@g#>$KU~?O@|u$%!1M53BQH7V-e+}zNK z_k+f;?y+hVun767fQ(Es+WHr1DNu|Yr{%Z+%msi-qsE+Ob%TZpay6&OL(wwc7zzHzZK7@uKGp0m58CU&|iv6P9Zv`_x z&mP)KrB0e*gHPr1g=SXWU!TYJKJe3mMdajr9}-YQwrfMH{OmNUu_1~CYO08q^Z?u$ zrnM!G;?Tsb``x^%eu`rLreGBNf=`Z>Uf~7KDtjo+oR~G9W1qSYzf`I;G*eEW9;CgS z2gg(zJ5&yk;z^TKVu?qe6?)J@Ak=~P7bI{H_GkcSO#>eHPsi}TAx(e~=_WC6g35CM zO)+zlGt_}d7{I2hnD=0ngXS@A;F1_4kXpR!v>|Rr+xM#Jj-dEV)~;Wn59Zxui2`gm{VH63r*|-J<|^d7q02 z!tbk@M0b?Z}rCf=qF83*@j`7UJ^grw7Tkz^gsps3ROqWNF4Z467 zCej02N`b;*6W~?TjL=-IUb85N$4~)IpDFuTwZw#4G>8Piu!uqMq}QTk?NTGcxN%Y@R+#E_S!9(8EL5SO>yRp{1(i3&<(jUc%Dq03CF2_QqLy7<|M5(eWy1H%>d-S{;>$mYy z_hQPGtbe^Suh)aRQ7=Q6eCwQB1LC1_HthMQ&{?cr!4`02PQ`j7Yuo`64{7tUn<54> zXT#8JFcB21t^?F`e=XdA)vm8pe$%JaAu4alpj3DGe-Ho%s?9Z1Y!}1bOR&hh*VhAo zj%odgiVLbjb%crfj5@7##Do5%LTJtgL1WidOB-yL(cNxu(q3yG?F3eA)kK(DLL=gx zy9LTJTku=%X)1HCPNGNH969JBgRSy?U5CbbygP~k`2n_!u>80i$nlth1h~l98dKEa z5*})Ng7YinH4REjL|W3yO-FweW{C?p2{s~)SsUM0!VjFwt2`UUR`2DxhHi0!(jE!0 z+;fH)GMu3q3_*c9zv%4)hmzC^u z2)K(HTS)D>d}T;HSVgW$Brn9;dxqrj2Zk7fnqH~MKWI%veX{c&LijRg)0J7_SKffc zf+^@?#FHpuHC_sZgB>?So)CsN12i#Ot>_Xp8h(aYXV6YLj{GotH!#B}{eybsrVVWc zLMyF~SgKWlj(U^|7pUh5pZaR5XzGkn?!vv*F{dhZVVPNqAe}EaAML*fYTb4i&tPsaIci-cRHPpe}pY7Y18y4V%$~?&D$E9HUg#nVRZ1)gQEU*Tqo? zY}Q!e&sXu}+{nw^36I=Z25w)*WR($LaZa}hRN__sv9<8&Tix=d`8*Eja(cm4o$7v; z?!~N3Hh0*x1cXOR+*SoO=%5;*cSHHrH0CQfonZ&?dO(x$l@s~(0!X-fW(EExgQ?lO zv!ef*0P5(%xW(JdJfKa0W)B&VWI|DA=Pb}^H-SYqN3KZKt}FnIvyEn!TGBl!@x#*= z_h86r?iDTfX3KT^8XL!2@lW#3KE{kT@A*t#-)WQ6 zH(j^{eE0VWqIo>LNDL14>oW?OtAU0sa~`% ziM~rUcN%4EzCT-A>s`A&9zCW*yO(>R>V0t^XZqIHYR{inCp^}*zfIuyR~=6phBxTp zu~Hj9tuNa@Dp?K(#<%ExC8$zu8VyHw&1}!~sD@{Fh7)nSa7fWhTye!IT5b#)w4<<( zLc5ODF4!$>k8yAqe&L$4`qjDgsJvvc(ghK(M5x%-VNj= z$9KB~@Ua+w(D9`Fr2EaGa(|eSJf{n>?@p}8PcItPpQy$?T^|mS11P3WL&T?>LLaX>rI-h6X)iC%6(5D| zgx=HxNX4x@9?a>}F?3GWxsYjP&vOMgZeI~r5I2|SF3}yGy{*JqJgnI9T;wJ^p*Etm zYzk-Z>-OVE>*W&14wXdLl$60+)83E`m@TGXbFoMrS?n$G;XQJK9SKQf!}YiuyZ3-# zrelb>w2C8+Rzn-*X42Bti$-a0H+3Ny_`00y-)0V{t2LMNxk;sy^?`~Ig_LXW#gSD} zQN1;0Bl6(F+;HCXbzu0zfmM`0%tB>ry5itCXzkyGb57ca=OOieLv3E|r-i&3Dobzh z>>SAvyu%yioL2XS3n+u(Bc0NgIsd-hjK_Rp5B=70k67GI2r0#*4 zP;_evCE`QB)*+Q!b+N4FGn)s<9kz&0pK=|MNKla9cP*%xgUw97D z0e?tqwUb<$o}8a<<|{TTsv?kjnizU z%GZ>Z))Q1pE;gm}$7fE3%Hv<~w`J@(-ll6P`%1h1L8APK5+hPz4;bC?4}Lpr7U_;& zUurw@k~6!UXqYjX;FFywYgYSBhHBg|T>t^qhkPB5GAoR}vxa zp@UKrY`$X>qCNRE9FymQK4tze-w-m4g!x&)Z2DT-DU3ROVCGzpZz(94@PzB4X3QIdWKFFEqAh5EpDbHPaJpfQ^jCC5NZm(PvTV z)Rq*kbZGwLgZhYlYI@*9e2<*KRr?Msba5y0<173slJp5a-!vjt0rd!=@!`7dw;%aZ zZzFS*GE*v#z}u%855~b>^KOIC%2f`$^)Z>0YKX%|d+Pp6gr?t@&ojNxfbIdz-99R` zL&Y+cS72Wx_2>ND?RZ1td}`A-zUnH9|w5) z;xar4KH_;1bl&g$lnJw4H`WG-hK1+4s3QzVE}iwqE7BSLYB0!xXPl=6k}~ZV9QM0zyVZ1ldcRZ37LQPFhj=QKvK+LwIc4&A%}E zAijNxwAO>_6z?KhghnRrQ;68t5bN_v-BT0q*~9RrN0!!han~{{IyE z_k!=gOY$EVh^hb2ll(Jq^{+$<$G=bdzMYdbDE|xG)4#4X|F3$Af99^9*{yRReXj`{ z&4Qx2EdRvoc-x6p|*f`g+qv3 zu;*aLf%9d)zns8zgKS}j`p+Ct)_8^m4_=At;E zL~DE^u&VH<3^XacKQu}Bj{gW`^G8^q0(u3f6KeSHlI;<7)ZS+ zsu9^k!hR=D7bl*n0Hk^P&$$OXJ@jhr~~vHn(^A1}tEtu6S7D|#0;#^wf0jd+PJ zhQsD;E^-5%d1IUvS^gmPCtxa*AYcK)k8}UM1TY<*TsIh?`#ADSjl%r}^GIN|VIB}h zz%plWJmY)rSt{*`^5FAc0k93Y_ip+AhdF^K#5Lc-cs%#}A&{3R;-XzRoHCL5unD|# z-1DoeuC=e9cKDZKyg2P04F-L@!ZWElu17+*1V4~BWOuji&A?LyhOqeRz?Wp3!rD`< z9a=X%13xPdsb7((@d}WC(tD4LHZrrdrnk2uCS01}{RC#sDQJL=NtRI=oQZd6OioFI z;Mlh#XiEWvFSDhr5*Trbt8Chb7)BM z>KXn|Xd^6m!9=|K!J(%DQIKah4-(TLDCbaCrS|fkJdSAZW!;6X??dv@J?x+>vM+M7XwX<*YlyWk^I6Q=FOgwDu-n z?oD3eoWhw(2(EoV_1N~7bBAv4)X3ToJ}czc?QR>yM0UG(n2m&@Tx2q=lLd~l5>$BWuh zUtS*IIg6e|h-x|=VNaa2)Q+<@gjHa|U4!Y%UPx&)r{>=eR~tJd6U~s5YaCkbF>};W z;XK$0@10LkaAsy?a%6uWfiU@VzWv1eRy&mFbPtP*K^dz&n0`m7jpXH)O)uRqFCAIr zNJJ+yA{m^kMz*$p9aWcu0oCtTb@!=)W zb!2~!FZc7v*13h2JZ<+LEp#CvoBpUOk@K&j+fV(rqu7_Yv3>;wuHJmAy)+8Q*uo6h zG}6}qS+J2oZ;T3X!8Y^ST*IO1rW=z~Ah>?Tet#gDFsMM>u!9S00mN=M;;7$lLZNHM zdV5;xFWla1B5rz z*B}g5!mo@0&R*t*#i8UJAkC}S7!PwB%wuBQE)~eA>YLpiy&yR>^)8NBu&z6$>|9-) zeEysE3TkT=A{BzkapLil6g9dls=br$3Adw{+EN{qTUi4A_^H8@9W~bG}jNuA9Hp2gynKg$M zDgq^oKc7dxOCl5_7TXId?gM&x24d?KhzvlC0iDfj;=zqxe&N8cl801m%pF#CBj|O)Lj= zId+g!#JFx21+>3?66;A%pF+7QigolAv+{tSco`bVTz7HU%*%P?`uV%Z6+d^^^J(t>w}t zh6Qa@r^+bHMPv>+)p0aTIZDnjPo>GJA{FW*+;wo|Y249JVy@K>iC7;2=lcjC6zVoJz z(*Sgo?~34aS|9Ik@WkW!LXCcH?}3A0Fgf%2sh#=I_D;gKdwpl>b{A~`3G&HkKi*J4 zs%apeB?`|6z!=Qxu-}2`udh;(GFH2(U>L|+83dN!S8ZDIT>*b2AR#;A1N;G$ZdpZ5 zo2ZrufFO0vIU-I8XU8TOID|N9T>_Pw>1kuf+MrlULnf z2d^GOZY(LIa`2Z=zzD&JL`-nD_3hmzl}7n!2RbOQ4(DY+RJ3NGQ>RvjOJr%HRFcxK>s)zAOh19kt|dnZl}BsYOOFpggg`LoN?qig~8R zqc!mLrg*Zp@KaKE4hxq?BhFyHP7`f-9Ay-KJViF#xHO((h|iGFcTX6jcK68=gL8&i7rY97X}KwvBu zkQ(1L6&jTBargC+oz_U`ZTJ^D(SaqFeQc&fY%nA-3nAjBB-$kTd{gF6sBbzEvFtzS zMB}1v5*VR`jBTb4KwD$o+@o<8ao+zoo#+sF11!X;+pAv~(u|PEz*tb(;`sFR*z5fSL97@WP=1wG+5VXcio*{S%?PX5s_<^F zqhb%9;q&<7+M44ts4yFD|Pnr@wA?ijx_b)h+SAA{^jLIpa5A?p`u79v~UY$UY(-^JHXt2A)b5sz~MPdiW zc}!vdalKr;HxmqRi@Y98T&ps|tSrDSeh~wnLFO%HFF$Nh*xP=Ugi_|sP1yMbJecPe zJlrGLzK1i2at?2JsjG0`t#C@aG#(Rual?YF(be@BvVwn@@-25)(IwS^{~MhStvC&D zB_AiSaB15|ycnx1Fk{Z0{bhC^d8CsF8Y~UinG^pHcCp(IK=6v$VAQ162Gea1qc#xg z;9xJB8opj6Xf_zNv(BHRsJ}obh5daE1RD(*yx>VB&^yC`e0ntP9cY9Ydh7@Oq)j<| zRK;IWd+YKGP9P0aQewUEgeSRs0Lmg6Nx0n}Ap`l&d^3W40;01bQPk_?gS4`-@_jO+ zUrF;Bb&*bKIcWAtp_R`hB~mBb4;ls|-Gh{t@*Wi=B5hCKJx>@}>reUk$D{KMsT zJP~d1mw{H&M9jNU6dp+6hR8lo5CL{^est3LIUdmrdCFbQMu7=U2Z;lJiqeUT%b!U* z{~GarS`byrew0Qjv(V33$xoGY9qZ+PJ$CBbQ@Ad#{ev#_M_>|B8dYjmyMAW7N!Xq{ z`{>CdmfQYwQf)1#$M33@@NxI$N3&5MX0C=PoOpPD&*rj6u+vsM;J%W* z>cXEG&Gv{1sLz8S(QR?U>1S4`qf&)gSArr(fh0&oVDen)j4dN(mK2efk%YkIZ_!3LZ}|sLTUh2s zZET^Z7g^^QM#%tiUicuP&NgckMJAP@S>tc3jNNG=A=s?OQiO0cJS(A;nDP z^2*D(jrWf|K=34G+?r>CEktdw-a)kMA~i!hyF+jY!F%zS>&aG)O99%VqqKWVGmtG3 z3cY}5p`tBG5$dersVgtx=&y^A?xjCUVHPTlR@NbMj=)Tx7a&}h%jl=Rt5Z7l{sx5t z(eE`1?PS+plQEKS-fbH;aUl#zXj>RF32Y*;FQr0#*0IOBtllr~M_P!^=_6-{v>gU! zLqliaJ?y6Cdq64iFet$z&y?w!H49z_Ep zVyyhWGz+3aO$XQKn4CSWt=0~8Nl|DlK!iH}cVSpMKuI%m<8rMBUxmQZ*MRKE*I&bQvvy|3vJ?ZNyWceM0fT z7YZrYo{>V=%d`&PsdCbX7bH6c!7PjIr1pV>F@7l*Jl}v!pzvK4$75u>(e&x6$(RP$@|AdAL;RoYh#SR&hi4 z{2RRU%dr%V>1)=KPxUI;(4|U^w^Ak5Y#xOazQ`8VeN5`E`_G)iIraRQJWj#b)=iZ5 zufT)H>xlLv%k^)XdTlwE)z5)^k5b&Wel?x3(r?0#9EVDbArO#h2XoH`1AA=nkbXqu8%x(8st_TDZbSRIH0%0m_6xV!}MGLWZ^Z6e!5) z0HbD3O>FA=NqK}tr>Bvf5fNEn-E%=} zky(&RwVi31V{b%46<+E*r@jF{n$}J;nM@M5778f^NlC97Ru-%In8KzdDgepo?%!bO z2GwKP>>dmmTbwj_r=DIRCa32p4qu0B0u^p4M&bcOH)v_0!85%Xn8~?)tx?ydo6-a0UyTgkGKflo7kB;K--<+lQ`OtcZ$iNg{e(bOI~j5Q6cm zQ9J$D%OpDAgddi|DA2Fj7`IlV&?0jEi8wR=T*~x=fFqh~a{4DYGHG^@9;b+zEIf?i z?6=z_FL3<8`2jA3K-}JyEi^I6(G4K$GJ;Z=QRrDHlMT;bAY@j*ez1iYo}R;d_<7cv z8M1L<0c2~vca1+&`9Ol+EIZk2q+d6MM68wVdjfEk0x3Yl%PN6uW`6U1EYkU%?k&IP zKL(uUD>J@coaq4^KUiZ8NZp>z6`rhpclR1Tx)N%N-tcX`8D1TL96GbEL)pwc`DV=GtlWiPaU9u=7<2KXO+Xl{)_@(w zA_H>Pe7?SeGtigF^|89>LtxWC`U2o*C@(bN8oZQag>N;W^fMGsxK#($p*M)0pT&=y zyG5jsE}a#|MIKL9JR*Gl!i2vWtWDst`9m>eeVa_S4I8wf0`#m6l^kIQj^MY=%AK?oZQNlEIj18Pb|A87%HtVzA(})U2;poOb}Aezi2$xWcj?ilWZP$X(beG)BXTOrPz!PIR9E1qpq z#uS2df;0*R4c{C8Frab19?dlRX*y{~82yFn&*{N0Y*EvdEHHnzcuvfU10abM`SyTI z@?iWl`|G-0luJ8j5qrCqH}~{sQO!YT zi~qGP-|n9sNi=E%wJnuto{FgY$5b#uFMe}&PMJ@ZDk?2>55LCfG7=QpGaP37FTT2> z!K`V^k2equnUV+v1}5Ud6b0pe-iTUyr?AL6x8E&I_rpLl-o5n!tc)eUKsp!%E8plJ zuPvx}5WmaOHXNn?f%j=KP!R0*o?qCbHOI)$BMAyv++<3d4sI+3xsO!I&!W73uwsWg z&KO#fg>C7`j&dg*u{@0@8By%-PU2vpYJg)+@T8a@&L@0e4Ph%f4C?N|(-WD*ffn#+ z-hEnq!z}+KPMZ%tv2!+}sIY0+Z@&yT-QA_tjw!XOU1x)5au7UDql-+A)JS z(IHJexo0bboI2v6tuD6Y)v{zMLvgX)Tvgt`X=a8Qjv#$5eQAjO(P~`(`as{$$kIz!G-1tm_GUSpyKS&;RyQs$=hmV;lZ70BTs#5;@BOft znaJAIB3hgZz^dFMp#>{7zwHVn6_UO&==!zdGF9FtaKa0{NBH?DnI~c|Jv+`SVD5x8 zU!6$PkSAX>_YtT>i9qe;X##2QTcyg%wOrheb~C08HWs(*45d_yty`!5ybhu!Q;o!^jR_R1+hX1H%z#IJLkHZ#pT2?XQb8Szl@aD= z=jGZX*-%XNXxL;L<5|@K+uI^8#_4Ha$!Cox2)*`ujxi{E)ucPa$UJ_Xd zVyx$glFAvQ>E-B}8?8XKQs~lQY3s{nZ`c%m%6_ADsI{#h!XmNX@@C?J9+2tWzCWBY8vD= zbEic1y|amahIsXRKdLW!MD8QKza)XkuZ@$}a71zBjc(%0s3~)Hw~R58)8K|&_3`>3 z>=u6(syd|m&WtuK8h&Vnbwpf?J|l|I7houbs<#On#IS z4vcOPei|!wUB_3?886~XlKPTfqiHVYNupyfyP1P8Usye4WNTsUaXwY&SUgAHf-~nT zTC-ov=s5>5qU%}MAUrI-4+++Il$N@oU4c8Q6|HC8{Hik+BK?T>xM-Dp{if_Z_VWf? zCwsu+65E*lQ578Cl>>8U{N+!epwkZAOKSEW0&4Zp;Vel-^ne97coV%FK`EbhLTXQf zhI+*mT4-#Zx5fNMOOoEUCOKP-BHT>B578h82U;l)187o#UtGHaAOL2BwLWdg{7u@? zAkN8sJhTen zsbw!_oM|uN5}H7ajp{S3 z62-`?b2#cyRL-u4a?i zDFfa(Xlb0k2LpH>YA-#;l)?nce3vITHUbCIzdV?s&;HQIKOU*3M7cgikqSqY>cupK zbQpz2LB&GLw$_GPv{zazX_A3L_oi28<2tsg-_7j6!8r}$l$2=FA^+vTWPh}p@?30# zrL<+3+?d^n zh>4;|%&6K_P=Ob(fe=Y6=6Q3KB>L|LSbhQOr+0+8Ab(ZsX*awCWA=O}I7JTZuR8ua z;9KrhY<#wTD7SV1?}+zlB-a zvBZLlsf&x5`IAP#xwm$HsHum&7x0>&W454n7}g`zv7=2XX|ykYNFxnRbcY8HAGjTa z-^dv04OQi2G{5P96@beK13wE~j7RKy_{hG5zCD=u>CiOp5@gzg-2<@Bpnvf`mukDF zZhm_(4G`NGH)g3+=M~)F%K+X?_K-0_Ax?Lx@_@IB4N0s@b)uM|zi+mdBifKTs`a8v!|rS` z-E6?{HQ&N{V&r+DW9hg#h~VbboP5=K z8?~g%OSauqzdxV1XFk%)a2Ba^?i0AvUMNES=j`6x(9$l>^E^9Z@p`Q2d0|fr)@I%R zbQjg?#J_eegje9rv1QC98CGQeBvXxbJDco45A(b@R~qVjB~y#-zrDcT6bt^mA>9^Z z4^O7!a4=WvyoFedVsOwbLV9w^)#*}?pa;1l=17!0S51P`A3rfG`G~3tS!C{Xt}7^? zam0UUKlNaYNc3C*sZx)N5@zeYfV)Ax|J=&E+=YLwnPorV3|lt2T||oHy>W!nWcnGt zc^AT8a3y!iPnRa45ycj1lhW&CN(a)uz$)3WxehXx0DxETI)T4W`#$(aRsGYM|CzS) zKgMAFmofh=Ed7shB>&sE|LmW`yZ#7#2mQVMtE%*0+x2fT|EvTxwze>}{Wpy(1i)X3 zaI1YZY`$Mofnfj5M(qDEk*tNSsj;Ks59fd2x#<28)ud+QwEGR|((wr%C&%d3Xs*jk zcX2#`kOil+NO)XpYny}6M$k1`O*Ta$bNcE^(C-CvB*{`6FrcY&$uWDHi_oh9hbhQ` z=xOPNJPA!g*558VcOs&;<0}Z7`0UJN=-y`ioK`7F_4c#)jPr(Rz{xG?!OoH^iMqxJ z5B(zSf8jiiZl^nrYRBW?w*$Z$j*k=IX1Fe3DFzyOT9BVUm1be0qagNdNZ^s&XiK@CEYHaEcTx>y$B-3M z%yR~WDH#k7P#@H89WjdLuCuh}$|JWv31A*}KfIw$5u-A^$Y_!rzCcn^8iA!*7Trbw{&Eri zL+M%P5a1bB{v(T~5aBE}D-(1fs?g37DBHuKrX7Hr{xR4cKt$wjr4=nzVk;JrJzMXb zlU&(1>n)3MZ&SYO*{!O9A*TGme4<^^K~ucsu%+)$c;=6(H6|! zkV1_6314BoYU~T6ni~4on#-WA)@@x?sL!3j@_v8eNDJm1Dhg<=PCAEF+g1ByMP1R= z@Tt6@J#wL^`b(iD|5}QFApSg5zanqorz6ML&vC{T%_1aqk>`d06s5q2XY7C)kr;_q2;+jl~cF2sn3jfMIeb4uk4ck2Mw;mCB zu64V32k?j~fcmb>b3yOd$}2BuUca5q-`;N3+h`%W%sbl!UE4%>Q4KqIF2~;b+;5Ri zl-72wqA~s=I&KO}QF)uHq;z#0g-(7 zL@JCjhm(|@@cbCYOOu*)1M~s<;c51ub2NK~yQ-w*07V6Cbyd8Ytie2|jwZst+`F*g zQE%lN1p>`dkP$nOzka&U@=%rD>HJs~)!ztkD5yHR9W<{qM`@EndLM!0G5ravo!Dz3 zo4t)oddqR+L4P+3zBpma9!`?CQzAqW>dHdmG>)+$DPTOY9UBq|^J&gfPN@*vKQYda zIg{CyAt5HD56numt}_%+y||$n-))*+JiS=e?)wZiI0Pc1Tgz^m_iov!qKldyW7-z@ zQQT2-%!-!Mk6(bG93yiN=~I1jt6FFzSX@40`bCx`yfXDCrD-Fgvref@2S2=I@Q?CFk&b$S6PbiX~1`I2L&r;&4p3bpFEV6)k;SEIIhjMaKriHbg z*T}>ltL2huUdzdDUCPxd!;+DD&)L3xu)l2qhV?uAuOZ`_w+LeP5{L8ZYraH{8~l^V zn8PgU{iewL08}*9mxQ%}E;@f7le4?4R%dj%tsp-DCaYd5C|Z&eQzza=A_51f%o{pd$F=Bu#O;I2JXT?)QL&*GU7O z@Eg;Ub1F6HMqd#@zv6zCpfKw04+N&z=z2>ZhN;gMcFnuC2D6lX3S&Q#xqSS?PBHu) z9nBl)C2(}L1pbIhSp|sS%c??{~2DSJI zzcH388KsccL+ih~2djnG>soLF+Ss2wrrX#fhy*B>BE+=wHFX@uN{NcXNtwGQ*#;|g zsh?`f`K|*f?*-xZ>FUDTfhBKeag%fa;@><35p+mmn%2HTMY4sHf-ylfTm5*R{M2Qu zU^svlu;^w(tQy`AKBC*q=%4BSFV4O>I?`?1H@0nboQ`eV9ox2T+qP}Hla6gC9d~T| z)xPJxd-i$npSRx_HOHz^-}%-cK*T z&oySzOby$%vSfwc*>>`|L-(#ZoIMM%$TNg^O)SDN;;`j~Rt#MHEVm{bY8pdB{dsbU z7G@ti%s&UF<<`%-@lcDDwvHs3!7tRpV^?IWX;Ai+#C?82HgMIm$k{y3?t~YfnVVB4 znYcUu)Ase=bN7F$eW3nJi!=8a0<{J(?H<51-haTff1Ug*>1<;2H_@$$x045`>BD*( z@(y)S6Rq>WZ$-gitT-|0>CeEKwP(eRE)%K(18HrzSy0^%^E4|PTXi!|wPzs1MV))L zla`F*B`Dp1otmoPYg1<6SkR*4XI{(b4aG*|cf(&ch)9kL1TwEcZ7<(8TD?AN%a^~V z^=SGY@CdDEpbZ)X6qtHV2|?fpzV;gWXOM`r{+Rr**f~Tv5>?!1nPHeIR>0x!rMucV zkEkF;U4mN+ZH-_a3oxs$-7QBPOv9i)k%oGN$~<1rN_Ddd7N8bQoeg(So!)2}9lObdTP#yGHrI#_4g*u?CT#ch&L6t(&z)6r-|~9z zJ+NlewbB+pOe%Dq9Ehh-hKaEuP2tkUuDA*}!~cG`?O(EYt-jdh z0$}4H0EPcK8)Yn<{;reuBy9b~#=gA6y7p_ZHOLE)0m^=|VD>}sqPXJfk?KiX3+@E0 zFE{Q}dqHnzUAnGE&!?_9a6upgj#+B>WtsgQQ3)CJjr0JKh0Znqer+6s$2Os?>x`a8 zSVJ-nN+d^@*?1NZ!H)~~+?8v$ko8Yaeo3NyhjYaKDtLV1MCbejS+a#ChSDPQAy0%a zqT6hf@?R`wns2ij^s zj1T+1V4Q>dAkF*l__({F%fH!`war@(w@5#K>E`G(IcHTACVJD}pgft7Tkk_O%KV>G!L^jLQV!~2(WRQCpd8+BJo1n%;e38T{JZ2O&$ zL%0RoTBb}vMRIUVUv{0j%t<7^SJNx>zg^*fSs6nav~-&QehLCC4gP;DmI~Ge9{&lY z2^*1s^SDFn&dSn%udS+DQ^Ypuz)+Euz*5m{^_-+A7;~x^O$e%Hht^;9?knxtBBDt_ z5|d6%@-ydoZ$k=^r~LU0RWVeQAZs_x$e=V3V~0zxPEPpaoY#~zdw^TDRs}R=hY8l7 z<(i<+aGkZ~sN+^{PxEleudGhjkJtm=UVtf9udP{c<~`C1QV-IhOr*ZM3^I{2)Vm0Q z{NWPYvgoU}}GsTYfJ2S??8wu5T^EZtIR9y_wiqSCnv!{y_5+w^d zg(La7xWp?0d9Q#U9D@c)(g@Z{*i#(j2i2AO(NKeKB+6VowI;Mn%YjYcF%K_pl^8G- zSdL6ox5?yVfwnueC|teK^;2pZoNf5al(&DN*fPB&r5_`(Qs%Nr6uQrm zyu>`V=W)QGj-Sfe;85IwpFX71L(BWg+my`v89q9{Na*17$4HF$VT%iff9UL{+`G85LjXA2^hGnkg15sNgV6rwHCkmvNZJAAOHL9S#*f=ZH1K%b`o?~Z05LOo! z-KL8xZnnJdQB}Qa!lTCBI449bTfG_nD;z9N*f>`B=y(7Hr8n#qtMOQB{NodNgs+!$ z)yOLr7ymL8FLZYc$>|(hm@oNHK7aZjeTHN)2OoZxrW)u=d05f6mP0vyqp69^a(Aga zRehC62v9gSPhN;n#ou!J$N}pK1CDDtnqGs@O^kRhoFkVHd0TT8PiHyFrd^q!3CWFV z=4oIqZD_nIoyFZ|%2Pswadr${{YwJxf76{N8W#j60cWz%0N6GI*oFoFfxL^mSO`0s z7&x1#**OA^@v$^;HTZA8LgI|oF9x)cnKQivBk3%*QpOzIpg_nqS$m@}Mxko?i^=%} zv7vykH^VZ8DojK#p4@URcnMg$ zlpjscO12014gpyr!8|P3NlHZC>OBl_@&p^>)t^HoGsu??7!GIzt#F4OVYMMTsV+S9 zf>VS34@39vf2gJg(RhjBwOCXgAx+gStf))+WQKj!FnDxZx4lMTyM{vdO`hPzS-Xxb z$Pc`#i1$g!_Krwu?~flkLipJfRz6v)q$6ACz{(~Co6Sm^(-a#b70QMOZ{>xk#yo{y z1sCJlTT$y<7o*mIH{Z9!};Qqi<2W+Dv(EpA?{=b+-09F8+7Te02*t-0k4=P%5Sz>6uv3^4pdHH?m zz|j}&scc!5Cj*+5ou^7@1&naN*APGh4cO-_zq}AJ={Z{2E0T%4(kC*mxZUtZfQ3v| zu(`QaZ#2l!;-phgGxj{2g#y;XG_5lfv}!FKX9!ktF$v2)0?vAE{04b>c3AcY8>>P4 zjdVZX_MvNQ`wA8j`hPiqtEr(PX(XiK+&ao1?0@JccJILG5!zDf#~8?pT0KDJAa(SRkaB;?$K2F+%&1nC9*VPLRR`&Bk5ogGTZ{ zQiOKcel!+7f>f*M(`)_2BPd|usb}irewE8#r=7OE6oZ~50)h=Z^h6?@0ILc|O(hi* z4qew>(L5T@e`G|7F%-G&13v9^m0pe|khDS<&z1gRW-8M}zL?Utb1l?J-<_RV`a*j; zSIX|DWg*3lC!XDsXm^=RFMupqEBadG3O|s%ORn=%?D(G?8%Q(e)t7cRL#}l+gaE^ zO2%Q2C!TcPNt~fb^WN)kIQRz zqrfzY{4QsZm&_wOkJVTj4Z0ugbH=mbxdHl1?Og*zz36kVozl~&i)_5EJ@G+kdwY&GWu$5x5T>tt{YNxXq0F>%od}*{D+#Zbq3v#*?#jo zS1b6sPpC~NueYi{O59`_oA(w{rs|5aXj$K{qPvC_y9AXBe&0Zyh!3=~r9WrBa>2h+ zs|{__jb|QQ=vTL@qfya^uPt;knw??6gq%*F1){}7V{Yg$DV%i^{SwWoq+{sK;iHwA>&+@W zHT^vSH(}2Eg7|NlC9Y`~(1&Xo)&f8$4B(g^;eP<1awg8g|K;TUdlT6I22kaHxgm6Y zL-grg@xLeH9U2uNK}9nr(pDpSp+#1+XyUD{N;N9JZc|LS_MT$AG8l;5yIgiWWoI$K z0SEVd!`zL;Y;04~jLfc+m6vvEXvFm7FU}y7vb>8q<4E9qA3%IZZ6t9f6gZB0BeH~m zn&?0U6GS~s|FiLhX2JzdeCY;BRDTC0Q-+`Ks*#DSAk^3M13J6vmyG5kCXdy|rwM0q zmn6k8*h9u>tbN)rxb_taCEkx`7sj83-eQd>{Ysuw528&5S1tmrdSp^S3D<={ZDXJ> zD-!r!L7o#Ok|QRWpqu!eELjF@<0wi@5!mGE3>x$h$i(Lj8c2iBFq=Wq4~(U7O|SlY zjQdHd&EW{*$wRbp-=ru_v!cv$+hm@TCe13?JTleCqe{LInuxVt?0Z&z8N$Dk4ELmB zeK=r$5a@45&WUu^a4UB*Xv3bo*zdOz82iS*@c1adMz6bMxb#QJ4I2KG+bKyd#%rMo zQy%I|z!e=-)N*V{3Ee3{+3Q*?3wU%^;Yrkcfp;?bD0UbZ}6MAw2?BOReAXatm0#jO*QYgIg{{Pwfdo z2A0ZBbLkVc-)Y9D7VV5gasBRLY8@SI>M=ypP5Lvrn1>JiScSiozXsC@eZul(9huda zTk{0Lt)N-_+Q2JYpa(X)Gp)LmKF9ChYj=yYOTgczGwTzu_5TEDZ2x5KDj3+BSPMHE zIGHP&*xNb&-GFOR(y?0ycusVEhg5O{g=C20Yof>-nAT;-i!09eO;DJo$=Y4cM;T`; z{e0#8F%;P@44P=Tdylfc&T+Y+K!}RfEHG%yLwW+GjWg+FE+K3cfQK*op?E^5kSH!8Ae-Q4;pDWK* z?{X;AVg@qn2dbhsOT#^$Q#SGL^c8`+Y*?*ZUu6xxp=9)*pGj5G>OciMPVbv@T+MKE zUli>R^tL?7v{%EW!1W-E&8c&=lnC3TwT9{{@iS%l=KYrG+UbQf^}{q%2C}SSsWu0X zY-m|dM{avNmr2DFWs4L4*!7;1{G5YuWwn;fwDeA#_>*W)))V`{y&9l#6RB)YN7Xga zqB${{)E*LnBIWgi!yQ%ZMnh1FaB-dGK)R&ng3n%vuXmunz!T^yUlnhJ_j|eC0K;i7 zgdf^^gD?DyWVNla%hW;8n^Nc4l>oPB1ZwvB%G|1>_EY(E*{mMMGVYJ8kbby1G9m z4P2a9_#$d6W`~9tQ{&z}v5ONN;e3Q5?@A=PQKx228vXu9QH9w`5>SONWBm>OH5lwK zrQsM$rBLJf>58u4DDqS_~ zZewmhMGWKTvp)=*I+x2^2q&lMb!*aZ2~_`w*{ec=p|Xlb#g+M${lPgZ<&>F#0z!%sYb0!~DM0*>E+K;}h(fR7>h z17%J|fW8%(00|zO042;*`%4@%`G=pV04B}=gB4Z*Cb|G74#!E9-E;Ym9?JqI+5jfX z1B(dxK@%CiZUceLnE`|4Z@(f-iseBfQTZSX4Bndn?yvB2rBKSAzv{Vw{^)AsExPKy z2>#r$5x*C=<1YTXZXLPL`|T>@ciS@J|2gsYM)lG5^c4R&vXU#1*_CF5pg-}D(H2HE zWu^-uaMytuKfBpP!w95>`7pT&sh@ck(SaClQG0awsZ!5)Y|(+JZ?tokQY-yR#D>7j z_ylZ?=c#)M3N`i6ya{Q{f@o~=XWL@W62)2fZxByAqF_gYBif~Z#{?ReJj3C=EF|V`EfAL=2pf zVSR!LoJ{1Dj8R~Ih7Fv8;TQ*bc)G?2*x01ePqO0^1NP#S0b7Zx(5-k?xGv%v3|C=I zs`FlYi?+72ns;QdVuQyDhE(FfXo3Tp@%3y z4H%&SbgT=w4xn-Xg#*YOKoYuu>wpmoK*u_O>pCM~wu`l08sR!_O|zYsro=8=Q$i=5 zSs}A7?65g!wirw+YcwjgZ!1Cvoqn_|wM`wV?U$|<_FMOk9S&c*r&?}ZZV47kHC;N9 zfVYdSmp9TDXSP?#HMk@pfDcbK-MW%n05@3rFpGz40{(<1qJR`&qy!KYfQ~f)e*!?| z8iYV+RKF@se1OW!psNxeq@bvbKjLNNu@JD&!iqij?8DXhNtaQ>g@1Vxw*)>IFnk%o`d23!i5Mn}aGm;Ygi9H8xuGeirE& zQ-hX9RzqvN)<;XaJF^r+2D^X1J}w?O1;PM(+5Pij$eU1vYjV^@JR&+Vm<2M4F~)i{i?24Y0~E70ghfu>IU#V|#WrYa2+ zGbjw^L0wF8!dFwd$&jImVAWj8EGS8k|M12IalWeGI-)=HcqVAA*%=79%j>rZOx$79 zG9T5PBy)Yz%kW--MIJM=cZ{Z`GPmgddn=s0g@U2QOHsA89I&|mBJL^4Ss3Hj7_8}tCdQ!SR(Fk);aVBSx`^)@8%<5FuKy5PQ;+EHtV(Zekds~B zZ5-z!^XDUTT~b>nB3Vyv@0x8yAmE!T8`VKeYk@7^FjG4*F^PGr24zW4VPmv#Lo-qZ z{KlQWim3?bT$DcQ^<6n5=GbpgU8fh(G|s;0F0_KyyYu866YGh3ADb!o%oS16lu06wZavQoAYJ92% z=qbQHoaUbnJd3Jz8gKy(V@zfHUGB2j7ADmx8D!_&ac>tw+HpQbbE{0rT)g0lpw2$! z?=Vjh{h3Uvf}fPXC>)QNb7Cb~gn%0SGJR%hXt#Kr^ueY;rRt)x{=tkr9ospVf%k)4Uo2oFn{0xHz= zL-(?yy3=(<`_RQp*yoc`Y5*!(0EV5Na%8-+PHQ}1(qkIHaQRumkgFOpRXJGw&2(w8 zIxt(0ufwj2=3OB#=1YFxbrAj_V89mrrO9r0IQq>_M8C2l!KjQWzZ6@KcL`Q8Yzr6f z4L$OZ|71?}a^{&W(-Rn*WinlGAi7$Louq1hYP8as+0k<>5uFt9 z`#1S_d~58S74nYT`fWixEzpK!CXgZ0SDW$tjpk_`<7}$Y^Tk3*`E01sl5mLpUC86< zAqV`MfI0Oi^?B;k!NXjOrrU^htTc1DkQwU_k&kbLUs}Trng=FIW%6lW`EKn*36M`4 zmTOKIxW092+upTR!WC1x?5Rq7^0l~`KuBcUPk(+fk zow(vILY#^j4_ww2QD=+N?si)@^ah1@$Mt*f0}ffydT2V)65hHLB6zrUfitS~Ch=v%9cG#OYoNGouco z;)-4(=aFLOv~F}eZ5Bi{qgLyc$REjQAynfM-;HXjznAnRoedvOpFR)%updIbW#A@P zIF~g-Im=p@G9Dc?4mSvF&42|_yIQ}kYk%vkVXEv>-0w13s;t*ok_og9lZ?MGLIIN$ zO7a&sbh?sF_j$?D!thy0r>~%gb5*f$y4zAguGD(|T^-%@=LMqwwgFA@!KU8}y3ht~ zMHp$z4(VcITncHZ0`6O(o%E(Ol1#TG_p;TGXe};SAUqBExShpvlUmOo&}Y*K%_c9X6~zu zlI<&!fz^qodj5XSH7zk{Xl9=8k0^=~@<6Lyq+`j(Wn*}*F}U7Qe#{0BYluu!+iP(K zsjv@#T=JE(6pGD~wWqJ0-~r*qHfO{Knk}ZeT?5D(`)B+a=s?uyQ!r3DEEk0`OjTn@Ltuu&4&}r(;%nmg zc9L})YQVP|!$Ls@Ot6h}r_i*6NHlOTz21VRpdpEyf>WLm0!_hUE<61NrUN+5Y&Y4< zC>Jq4L6gM$8*PTAr_P!~YYc&nme4mr8nhosnMcRrpX)9?g~dE0*qy2Pqyn}cl@6l% zx7ot+f&LX?oycTB(n5tUF`QI8tYOT;)Z~du0##MrFyFRaK)%naL`C^JfyGiz*K^}obLqLg${@eitH zmf6|>0UOlYrrZn|-4QF3l#|C2N}aIXVO$?JW;f&1`2ni4JZ&?B9I=>CV&Ds^p&DS~ zDV$%z_(GP60W0bo;CwpzM4Cy@#u{4dNfN)$TSueia;%LCXM=2{?T&B3GPw=)+*Rl2 zd|0TG6tl624lT=`u33j&WryMll9Cq03v9}bg7Zm<7TK9*Hj-IEqLh+Mpko75#XTLb zLO-KgO~>@c7E>CY=C*JL2p3r1-tpkrn0#Iuud%!&CrC3vW(kh@2V!8Xho%(Aq48`c zL*&YB6fBV=D*AB%NlN#Ts4Xy`q^~-8tF`f#H1m`Pbj>MFM(Dv{T>KyY*sd?vSw zXo5yPSf$|L$iD2n4(RhKMj@Hymlt)bWe6&TzJ%^rL*mH_it?C?xkEOx#F^(TOx7Zc zPn3s5AP=Ca(j1T)Iq(awN0k}v-C4raNMmV=fWyvf&e>3v8)OOyYb31~#4(gp;i`Nq zvS>!Tu+0*-1t-@-8LivQea@KPp(o-~`Od@)9Za*(OqHn7y=N3dBX-wd`l731uSK6IG#3c_DJ_Yt=(A{P<(Ua`%RsPQ42HbNOO@H``7wj5B!sJ1t@`n|HIv>-&wR_v6hyDaYsC ztFqm&uU23(!t+fqXfT6GKshN2u2%bJbV=~rgCZQ&>4+{3Q+t5j0ogO8{9 zHO<`%H;DGiBJMSxcvUsPVKLFyIrlU%@iQw z;0y5J{*!q7zqU4616u>L|IE~g?YI5K02exQPvvb4Be~FD3ZtL~eF1@~n-4Q2pq{20 zF~L^Q`-bwZ*uu^CmCtEfFnn<>^D24ZUJ19lhD*UR{!`|YXsd9oXp6Ea)_h1q zXHmlQCQESqWlHEbIL~4*qpP@g%i}(Bcq3Tu;ldc4dN|%VQ$W5|G*Q%|7O3;Q93BhX z8@1Q;ZKc*=60rfX;l-;?k=1IsZHHyD(*%2;-R)0KclP3wvUCCO7Jm{&>$%#NqMM|! zM!(rnFP{XBCAvLViEh8Yc_ROMRO|tIn8$#}l=TmDTK@H@{_mU?#UFNA3`o8NKlhR; zkal*$S;y2%o#&g=T&r3~DjKyJ25XE+_E};I-=Ee6D6_a8DpEscHr<}Ke0n)zfeS2( z?w(`WtUC`A4>MCusWY&*X!KvB#sW`p1rcS6yj~^vNnM97LP=j1ZIiPx2QSY;4BSmu zzkggKz@4!Ua=bzj$EMcndMPZt2dKi)0OLT#la2CR3-#8dueaEgv$B_h~ljmm)Dt7`C@!>-jUzyQ7^7K7g$D}q+l%>sQ@_dDLPqpTS zgcYtCI~6|^@cfJ6@MG(XP~|M zTI>^j?LH~yxHUPl%q{%kJhpb#BMrwEwFXC%VqtoAwQXH|4=DV7&DCWv8P-f1p>wTK zl~?9u5!x@beW-oGHzT)p6Si)_L%Ba-^ccafpX?UxoX#DAnLEyM3=#QFra>tP%R~CK z5LS|bpAK?4-+JhDI(lfdaq>lPf-dMER4?vhOv(Iixh1PZFELg%2b^kbnfTo<=>;~@ zO%Ijv$hWSBapp>UV(t+F&&hreM$vR_-$i#9l`mmiC}*t^_GmbABg{{pH{&rmy%EXt zPxv+F@pR?=Z4vF(P6~E@MOZ>Ln01?`7 z-67Sq39jb4?OC>J5}9PMx`cz*QU~aqoMqPuR{_F7PU}6nE6iIUNAFeCU=q=}YA|CizyX2xMQqR$ z$^fm{Cut9R#u}K}NWyDx4}3u3-|i0w{Hw6CrJ?VXxx#razA-UavOk4PzK%Z2_en;D zxMK{-)wZk$4KBS{7IY=JkDo?uh(Y8!Bwxu!M4C2Ck&@b=OQq&+;m-nmJIyU=Mo9|#zty4-$xIey_J)>ZahzA6e$+CNd*9+>ggg;&a!pt%YdnwF;5 zP!4S81Y%L&zvk>bjyB)n7%mZBk8%Gqz-1CYBj*fY83G`w;(wQQ|Gy+u{KYac7e`wI zqrWTvH41umfec7~1bKS|tO6x4d!{nlsTs6uiDbV1rK!T)(!>fb6TR;+xI6bQX`!1b zXIFVwZvvy`)FD52(PNn^ekAj-lEnP6ZiFpr8J{{;u%wIcz9abwZT&J8K-6x90KE?K z^OLLgtQD-Rd-IFG-w~Sc;hTL0=78ggK>tv#9Wo8y$#ujKpl5VD)A!qXe@eN3B}{x1 zl3Wa}*3~1(yo@*#G2nF5j&fb4q!OUiRk0^Wx*o`v^S#7-cFeCWOcu9AB4|nYb0>Qv zPeYtij=~lTDy6|>2Ns5E2V;xn(In=m1rBSrOKO~)aGxKNQ%Gd$t?xQd%^UWTQ_5oK zeb)c*E3XTO)%3*vx023R2soIm$i=t`fyn8&J*_tj)tfvwv{0qm`p|y8Y0sM3X@Kfj?1lyII9Rb3p>}X)?WDUqz`nwb={s5%> zBl+g~4keU@E9!u(k=rPTYYP61HB^ zLg^;!*yiPwk}l18MVMN=9zX3bs5Q_^DaWRFu$nW?Du0AEblH51HpOHGsb&laPv~wG z4soNw{uOq*uJy z+z3$j_D{mp$|mm4E{-O`b~g3~PEKO#e`9-(ijCa{p!SXDD^fTBUeS22SodAAEjPgx z8-xX_{!-Y#4+$;9b#*P3d_u01=&MIus*y_Tw%ZWbK)TR<=H{{^jAElTAby%F<~+=P zid(v2?+4Cw<8-9iIvhOL&$}b*q+7%rCg_#3D(+jd%}{;?yw+FX61%0iSx0}`I@*cG zah=?~`?xRjv>Pnzwkf>&>(hSsO^^neJr>ZDz+ic7gg(>f!mBCGQ>VHL#v4O)36#zSyHkN(z%^we2r_Z<8M?vt~rAI&kAzhE3m(`t#s;U6f9kMG+3$f4k~D_ z$y`r8pCyOo`m)*=h{c;U`CM>6oO><_ix{E^`e)axH>cQLA}Vz+TfOu>5OfdM=sE*k zZPEIBdZXSk^kp}iIKYeYLx^de)A@Tqt(Ao9X*ii%gqO_qc-6ehF>0qxG+@g#qq2*< zpmX}n!D1o#4JbeBG0t-#jCf(|ErX(4u?P6VW00;qNoY`U;NrF)mdZ*K`Fja=rd!Jr z3H!R9cF>^_5jv=C;Cl|JnVsTlb!a{;zzA}U#pVF%FBbO^U&u5=<;o2Seuy$H1KD%*f(1V|%0Dxlfj+dvY^2 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 diff --git a/patches/minecraft/net/minecraft/client/Minecraft.java.patch b/patches/minecraft/net/minecraft/client/Minecraft.java.patch deleted file mode 100644 index f91441fa6..000000000 --- a/patches/minecraft/net/minecraft/client/Minecraft.java.patch +++ /dev/null @@ -1,133 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/client/Minecraft.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/client/Minecraft.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1960,86 +1960,54 @@ - */ - public void usePortal(int par1) - { -+ usePortal(par1, new Teleporter()); -+ } -+ -+ public void usePortal(int par1, Teleporter teleporter) -+ { - int var2 = this.thePlayer.dimension; - this.thePlayer.dimension = par1; - this.theWorld.setEntityDead(this.thePlayer); - this.thePlayer.isDead = false; -+ WorldProvider pNew = WorldProvider.getProviderForDimension(par1); -+ WorldProvider pOld = WorldProvider.getProviderForDimension(var2); - double var3 = this.thePlayer.posX; - double var5 = this.thePlayer.posZ; -- double var7 = 1.0D; -- -- if (var2 > -1 && this.thePlayer.dimension == -1) -- { -- var7 = 0.125D; -- } -- else if (var2 == -1 && this.thePlayer.dimension > -1) -- { -- var7 = 8.0D; -- } -- -+ double var7 = pOld.getMovementFactor() / pNew.getMovementFactor(); - var3 *= var7; - var5 *= var7; -- World var9; -- -- if (this.thePlayer.dimension == -1) -- { -- this.thePlayer.setLocationAndAngles(var3, this.thePlayer.posY, var5, this.thePlayer.rotationYaw, this.thePlayer.rotationPitch); -- -- if (this.thePlayer.isEntityAlive()) -- { -- this.theWorld.updateEntityWithOptionalForce(this.thePlayer, false); -- } -+ World var9 = new World(theWorld, pNew); - -- var9 = null; -- var9 = new World(this.theWorld, WorldProvider.getProviderForDimension(this.thePlayer.dimension)); -- this.changeWorld(var9, "Entering the Nether", this.thePlayer); -- } -- else if (this.thePlayer.dimension == 0) -+ if (this.thePlayer.isEntityAlive()) - { -- if (this.thePlayer.isEntityAlive()) -- { -- this.thePlayer.setLocationAndAngles(var3, this.thePlayer.posY, var5, this.thePlayer.rotationYaw, this.thePlayer.rotationPitch); -- this.theWorld.updateEntityWithOptionalForce(this.thePlayer, false); -- } -- -- var9 = null; -- var9 = new World(this.theWorld, WorldProvider.getProviderForDimension(this.thePlayer.dimension)); -- -- if (var2 == -1) -- { -- this.changeWorld(var9, "Leaving the Nether", this.thePlayer); -- } -- else -- { -- this.changeWorld(var9, "Leaving the End", this.thePlayer); -- } -+ this.theWorld.updateEntityWithOptionalForce(this.thePlayer, false); - } -- else -+ -+ if (thePlayer.dimension == 1) - { -- var9 = null; -- var9 = new World(this.theWorld, WorldProvider.getProviderForDimension(this.thePlayer.dimension)); - ChunkCoordinates var10 = var9.getEntrancePortalLocation(); - var3 = (double)var10.posX; - this.thePlayer.posY = (double)var10.posY; - var5 = (double)var10.posZ; -- this.thePlayer.setLocationAndAngles(var3, this.thePlayer.posY, var5, 90.0F, 0.0F); -- -- if (this.thePlayer.isEntityAlive()) -- { -- var9.updateEntityWithOptionalForce(this.thePlayer, false); -- } -- -- this.changeWorld(var9, "Entering the End", this.thePlayer); -+ } -+ -+ if (thePlayer.dimension == 0) -+ { -+ changeWorld(var9, pOld.getDepartMessage(), thePlayer); -+ } -+ else -+ { -+ changeWorld(var9, pNew.getWelcomeMessage(), thePlayer); - } - - this.thePlayer.worldObj = this.theWorld; - System.out.println("Teleported to " + this.theWorld.worldProvider.worldType); - -- if (this.thePlayer.isEntityAlive() && var2 < 1) -+ if (this.thePlayer.isEntityAlive()) - { - this.thePlayer.setLocationAndAngles(var3, this.thePlayer.posY, var5, this.thePlayer.rotationYaw, this.thePlayer.rotationPitch); - this.theWorld.updateEntityWithOptionalForce(this.thePlayer, false); -- (new Teleporter()).placeInPortal(this.theWorld, this.thePlayer); -+ teleporter.placeInPortal(this.theWorld, this.thePlayer); - } - } - -@@ -2324,6 +2292,11 @@ - { - this.usePortal(0); - } -+ -+ if (!this.theWorld.isRemote && this.theWorld.worldProvider.canRespawnHere()) -+ { -+ par2 = this.theWorld.worldProvider.worldType; //Fix for vanilla always re-spawning to the over world. -+ } - - ChunkCoordinates var4 = null; - ChunkCoordinates var5 = null; -@@ -2591,6 +2564,7 @@ - var0.addData("java_version", System.getProperty("java.version")); - var0.addData("opengl_version", GL11.glGetString(GL11.GL_VERSION)); - var0.addData("opengl_vendor", GL11.glGetString(GL11.GL_VENDOR)); -+ var0.addData("client_brand", "forge"); - var0.sendReport(); - } - } diff --git a/patches/minecraft/net/minecraft/src/AnvilChunkLoader.java.patch b/patches/minecraft/net/minecraft/src/AnvilChunkLoader.java.patch deleted file mode 100644 index 2a5b90985..000000000 --- a/patches/minecraft/net/minecraft/src/AnvilChunkLoader.java.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/AnvilChunkLoader.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/AnvilChunkLoader.java 0000-00-00 00:00:00.000000000 -0000 -@@ -10,6 +10,8 @@ - import java.util.List; - import java.util.Set; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class AnvilChunkLoader implements IThreadedFileIO, IChunkLoader - { - private List field_48451_a = new ArrayList(); -@@ -88,6 +90,7 @@ - } - - var5.removeUnknownBlocks(); -+ ForgeHooks.onChunkLoadData(par1World, var5, par4NBTTagCompound); - return var5; - } - } -@@ -103,6 +106,7 @@ - var3.setTag("Level", var4); - this.writeChunkToNBT(par2Chunk, par1World, var4); - this.func_48446_a(par2Chunk.getChunkCoordIntPair(), var3); -+ ForgeHooks.onChunkSaveData(par1World, par2Chunk, var3); - } - catch (Exception var5) - { diff --git a/patches/minecraft/net/minecraft/src/AnvilSaveHandler.java.patch b/patches/minecraft/net/minecraft/src/AnvilSaveHandler.java.patch deleted file mode 100644 index b467c15e4..000000000 --- a/patches/minecraft/net/minecraft/src/AnvilSaveHandler.java.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/AnvilSaveHandler.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/AnvilSaveHandler.java 0000-00-00 00:00:00.000000000 -0000 -@@ -18,15 +18,9 @@ - File var2 = this.getSaveDirectory(); - File var3; - -- if (par1WorldProvider instanceof WorldProviderHell) -+ if (par1WorldProvider.getSaveFolder() != null) - { -- var3 = new File(var2, "DIM-1"); -- var3.mkdirs(); -- return new AnvilChunkLoader(var3); -- } -- else if (par1WorldProvider instanceof WorldProviderEnd) -- { -- var3 = new File(var2, "DIM1"); -+ var3 = new File(var2, par1WorldProvider.getSaveFolder()); - var3.mkdirs(); - return new AnvilChunkLoader(var3); - } diff --git a/patches/minecraft/net/minecraft/src/Block.java.patch b/patches/minecraft/net/minecraft/src/Block.java.patch deleted file mode 100644 index e069f12fd..000000000 --- a/patches/minecraft/net/minecraft/src/Block.java.patch +++ /dev/null @@ -1,712 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/Block.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/Block.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,9 +1,12 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.ITextureProvider; -+ - import java.util.ArrayList; - import java.util.Random; - --public class Block -+public class Block implements ITextureProvider - { - public static final StepSound soundPowderFootstep = new StepSound("stone", 1.0F, 1.0F); - public static final StepSound soundWoodFootstep = new StepSound("wood", 1.0F, 1.0F); -@@ -257,6 +260,7 @@ - lightOpacity[par1] = this.isOpaqueCube() ? 255 : 0; - canBlockGrass[par1] = !par2Material.getCanBlockGrass(); - } -+ isDefaultTexture = (getTextureFile() != null && getTextureFile().equalsIgnoreCase("/terrain.png")); - } - - /** -@@ -397,7 +401,7 @@ - - public boolean hasTileEntity() - { -- return this.isBlockContainer; -+ return hasTileEntity(0); - } - - /** -@@ -418,7 +422,7 @@ - */ - public float getBlockBrightness(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { -- return par1IBlockAccess.getBrightness(par2, par3, par4, lightValue[this.blockID]); -+ return par1IBlockAccess.getBrightness(par2, par3, par4, getLightValue(par1IBlockAccess, par2, par3, par4)); - } - - /** -@@ -426,7 +430,7 @@ - */ - public int getMixedBrightnessForBlock(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { -- return par1IBlockAccess.getLightBrightnessForSkyBlocks(par2, par3, par4, lightValue[this.blockID]); -+ return par1IBlockAccess.getLightBrightnessForSkyBlocks(par2, par3, par4, getLightValue(par1IBlockAccess, par2, par3, par4)); - } - - /** -@@ -583,11 +587,14 @@ - } - - /** -- * Defines whether or not a play can break the block with current tool. -+ * Deprecated in favor of a metadata sensitive version -+ * @param entityplayer Entity attacking the block -+ * @return - */ -+ @Deprecated - public float blockStrength(EntityPlayer par1EntityPlayer) - { -- return this.blockHardness < 0.0F ? 0.0F : (!par1EntityPlayer.canHarvestBlock(this) ? 1.0F / this.blockHardness / 100.0F : par1EntityPlayer.getCurrentPlayerStrVsBlock(this) / this.blockHardness / 30.0F); -+ return blockStrength(par1EntityPlayer, 0); - } - - /** -@@ -607,16 +614,12 @@ - { - int var8 = this.quantityDroppedWithBonus(par7, par1World.rand); - -- for (int var9 = 0; var9 < var8; ++var9) -+ ArrayList items = getBlockDropped(par1World, par2, par3, par4, par5, par7); -+ for (ItemStack item : items) - { - if (par1World.rand.nextFloat() <= par6) - { -- int var10 = this.idDropped(par5, par1World.rand, par7); -- -- if (var10 > 0) -- { -- this.dropBlockAsItem_do(par1World, par2, par3, par4, new ItemStack(var10, 1, this.damageDropped(par5))); -- } -+ this.dropBlockAsItem_do(par1World, par2, par3, par4, item); - } - } - } -@@ -929,7 +932,7 @@ - par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); - par2EntityPlayer.addExhaustion(0.025F); - -- if (this.canSilkHarvest() && EnchantmentHelper.getSilkTouchModifier(par2EntityPlayer.inventory)) -+ if (this.canSilkHarvest(par1World, par2EntityPlayer, par3, par4, par5, par6) && EnchantmentHelper.getSilkTouchModifier(par2EntityPlayer.inventory)) - { - ItemStack var8 = this.createStackedBlock(par6); - -@@ -1058,6 +1061,614 @@ - */ - public void onFallenUpon(World par1World, int par2, int par3, int par4, Entity par5Entity, float par6) {} - -+ /* =================================================== FORGE START =====================================*/ -+ protected static int blockFireSpreadSpeed[] = new int[blocksList.length]; -+ protected static int blockFlammability[] = new int[blocksList.length]; -+ protected String currentTexture = "/terrain.png"; -+ public boolean isDefaultTexture = true; -+ -+ /** -+ * Get a light value for this block, normal ranges are between 0 and 15 -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return The light value -+ */ -+ public int getLightValue(IBlockAccess world, int x, int y, int z) -+ { -+ return lightValue[blockID]; -+ } -+ -+ /** -+ * Checks if a player or entity can use this block to 'climb' like a ladder. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block should act like a ladder -+ */ -+ public boolean isLadder(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Return true if the block is a normal, solid cube. This -+ * determines indirect power state, entity ejection from blocks, and a few -+ * others. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block is a full cube -+ */ -+ public boolean isBlockNormalCube(World world, int x, int y, int z) -+ { -+ return blockMaterial.isOpaque() && renderAsNormalBlock(); -+ } -+ -+ /** -+ * Checks if the block is a solid face on the given side, used by placement logic. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @param size The side to check -+ * @return True if the block is solid on the specified side. -+ */ -+ public boolean isBlockSolidOnSide(World world, int x, int y, int z, int side) -+ { -+ int meta = world.getBlockMetadata(x, y, z); -+ if (this instanceof BlockStep) -+ { -+ return (((meta & 8) == 8 && (side == 1)) || isOpaqueCube()); -+ } -+ else if (this instanceof BlockFarmland) -+ { -+ return (side != 1 && side != 0); -+ } -+ else if (this instanceof BlockStairs) -+ { -+ boolean flipped = ((meta & 4) != 0); -+ return ((meta & 3) + side == 5) || (side == 1 && flipped); -+ } -+ return isBlockNormalCube(world, x, y, z); -+ } -+ -+ /** -+ * Determines if a new block can be replace the space occupied by this one, -+ * Used in the player's placement code to make the block act like water, and lava. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block is replaceable by another block -+ */ -+ public boolean isBlockReplaceable(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Determines if this block should set fire and deal fire damage -+ * to entities coming into contact with it. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block should deal damage -+ */ -+ public boolean isBlockBurning(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Determines this block should be treated as an air block -+ * by the rest of the code. This method is primarily -+ * useful for creating pure logic-blocks that will be invisible -+ * to the player and otherwise interact as air would. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block considered air -+ */ -+ public boolean isAirBlock(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Metadata sensitive version of the default getHardness function. -+ * -+ * @param meta The block's current metatdata -+ * @return Block hardness -+ */ -+ public float getHardness(int meta) -+ { -+ return blockHardness; -+ } -+ -+ /** -+ * Determines this block's strength against being destroyed by a player. -+ * -+ * @param world The current world -+ * @param player The player damaging the block, may be null -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return A value -+ */ -+ public float blockStrength(World world, EntityPlayer player, int x, int y, int z) -+ { -+ return blockStrength(player, world.getBlockMetadata(x, y, z)); -+ } -+ -+ /** -+ * Determines this block's strength against being destroyed by a player. -+ * -+ * @param player The player damaging the block, may be null -+ * @param meta The block's current metadata -+ * @return The larger the value, the faster it breaks. -+ */ -+ public float blockStrength(EntityPlayer player, int meta) -+ { -+ return ForgeHooks.blockStrength(this, player, meta); -+ } -+ -+ /** -+ * Determines if the player can harvest this block, obtaining it's drops when the block is destroyed. -+ * -+ * @param player The player damaging the block, may be null -+ * @param meta The block's current metadata -+ * @return True tospawn the drops -+ */ -+ public boolean canHarvestBlock(EntityPlayer player, int meta) -+ { -+ return ForgeHooks.canHarvestBlock(this, player, meta); -+ } -+ -+ /** -+ * Called when a player removes a block. This is responsible for -+ * actually destroying the block, and the block is intact at time of call. -+ * This is called regardless of whether the player can harvest the block or -+ * not. -+ * -+ * Return true if the block is actually destroyed. -+ * -+ * Note: When used in multiplayer, this is called on both client and -+ * server sides! -+ * -+ * @param world The current world -+ * @param player The player damaging the block, may be null -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block is actually destroyed. -+ */ -+ public boolean removeBlockByPlayer(World world, EntityPlayer player, int x, int y, int z) -+ { -+ return world.setBlockWithNotify(x, y, z, 0); -+ } -+ -+ /** -+ * Called when a new CreativeContainer is opened, populate the list -+ * with all of the items for this block you want a player in creative mode -+ * to have access to. -+ * -+ * @param itemList The list of items to display on the creative inventory. -+ */ -+ public void addCreativeItems(ArrayList itemList) -+ { -+ } -+ -+ /** -+ * Chance that fire will spread and consume this block. -+ * 300 being a 100% chance, 0, being a 0% chance. -+ * -+ * @param world The current world -+ * @param x The blocks X position -+ * @param y The blocks Y position -+ * @param z The blocks Z position -+ * @param metadata The blocks current metadata -+ * @param face The face that the fire is coming from -+ * @return A number ranging from 0 to 300 relating used to determine if the block will be consumed by fire -+ */ -+ public int getFlammability(IBlockAccess world, int x, int y, int z, int metadata, int face) -+ { -+ return blockFlammability[blockID]; -+ } -+ -+ /** -+ * Called when fire is updating, checks if a block face can catch fire. -+ * -+ * -+ * @param world The current world -+ * @param x The blocks X position -+ * @param y The blocks Y position -+ * @param z The blocks Z position -+ * @param metadata The blocks current metadata -+ * @param face The face that the fire is coming from -+ * @return True if the face can be on fire, false otherwise. -+ */ -+ public boolean isFlammable(IBlockAccess world, int x, int y, int z, int metadata, int face) -+ { -+ return getFlammability(world, x, y, z, metadata, face) > 0; -+ } -+ -+ /** -+ * Called when fire is updating on a neighbor block. -+ * The higher the number returned, the faster fire will spread around this block. -+ * -+ * @param world The current world -+ * @param x The blocks X position -+ * @param y The blocks Y position -+ * @param z The blocks Z position -+ * @param metadata The blocks current metadata -+ * @param face The face that the fire is coming from -+ * @return A number that is used to determine the speed of fire growth around the block -+ */ -+ public int getFireSpreadSpeed(World world, int x, int y, int z, int metadata, int face) -+ { -+ return blockFireSpreadSpeed[blockID]; -+ } -+ -+ /** -+ * Currently only called by fire when it is on top of this block. -+ * Returning true will prevent the fire from naturally dying during updating. -+ * Also prevents firing from dying from rain. -+ * -+ * @param world The current world -+ * @param x The blocks X position -+ * @param y The blocks Y position -+ * @param z The blocks Z position -+ * @param metadata The blocks current metadata -+ * @param face The face that the fire is coming from -+ * @return -+ */ -+ public boolean isFireSource(World world, int x, int y, int z, int metadata, int face) -+ { -+ if (blockID == Block.netherrack.blockID && face == 0) -+ { -+ return true; -+ } -+ if ((world.worldProvider instanceof WorldProviderEnd) && blockID == Block.bedrock.blockID && face == 0) -+ { -+ return true; -+ } -+ return false; -+ } -+ -+ /** -+ * Called by BlockFire to setup the burn values of vanilla blocks. -+ * @param id The block id -+ * @param encouragement How much the block encourages fire to spread -+ * @param flammability how easy a block is to catch fire -+ */ -+ public static void setBurnProperties(int id, int encouragement, int flammability) -+ { -+ blockFireSpreadSpeed[id] = encouragement; -+ blockFlammability[id] = flammability; -+ } -+ -+ /** -+ * Called throughout the code as a replacement for block instanceof BlockContainer -+ * Moving this to the Block base class allows for mods that wish to extend vinella -+ * blocks, and also want to have a tile entity on that block, may. -+ * -+ * Return true from this function to specify this block has a tile entity. -+ * -+ * @param metadata Metadata of the current block -+ * @return True if block has a tile entity, false otherwise -+ */ -+ public boolean hasTileEntity(int metadata) -+ { -+ return isBlockContainer; -+ } -+ -+ /** -+ * Called throughout the code as a replacement for BlockContainer.getBlockEntity -+ * Return the same thing you would from that function. -+ * This will fall back to BlockContainer.getBlockEntity if this block is a BlockContainer. -+ * -+ * @param metadata The Metadata of the current block -+ * @return A instance of a class extending TileEntity -+ */ -+ public TileEntity getTileEntity(int metadata) -+ { -+ if (this instanceof BlockContainer) -+ { -+ return ((BlockContainer)this).getBlockEntity(metadata); -+ } -+ return null; -+ } -+ -+ /** -+ * Metadata and fortune sensitive version, this replaces the old (int meta, Random rand) -+ * version in 1.1. -+ * -+ * @param meta Blocks Metadata -+ * @param fortune Current item fortune level -+ * @param random Random number generator -+ * @return The number of items to drop -+ */ -+ public int quantityDropped(int meta, int fortune, Random random) -+ { -+ return quantityDroppedWithBonus(fortune, random); -+ } -+ -+ /** -+ * This returns a complete list of items dropped from this block. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param Y Y Position -+ * @param Z Z Position -+ * @param metadata Current metadata -+ * @param fortune Breakers fortune level -+ * @return A ArrayList containing all items this block drops -+ */ -+ public ArrayList getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ -+ int count = quantityDropped(metadata, fortune, world.rand); -+ for(int i = 0; i < count; i++) -+ { -+ int id = idDropped(metadata, world.rand, 0); -+ if (id > 0) -+ { -+ ret.add(new ItemStack(id, 1, damageDropped(metadata))); -+ } -+ } -+ return ret; -+ } -+ -+ /** -+ * Return true from this function if the player with silk touch can harvest this block directly, and not it's normal drops. -+ * -+ * @param world The world -+ * @param player The player doing the harvesting -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param metadata The metadata -+ * @return True if the block can be directly harvested using silk touch -+ */ -+ public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) -+ { -+ if (this instanceof BlockGlass) -+ { -+ return true; -+ } -+ return renderAsNormalBlock() && !hasTileEntity(metadata); -+ } -+ -+ /** -+ * Determines if a specified mob type can spawn on this block, returning false will -+ * prevent any mob from spawning on the block. -+ * -+ * @param type The Mob Category Type -+ * @param world The current world -+ * @param x The X Position -+ * @param y The Y Position -+ * @param z The Z Position -+ * @return True to allow a mob of the specified category to spawn, false to prevent it. -+ */ -+ public boolean canCreatureSpawn(EnumCreatureType type, World world, int x, int y, int z) -+ { -+ int meta = world.getBlockMetadata(x, y, z); -+ if (this instanceof BlockStep) -+ { -+ if (mod_MinecraftForge.SPAWNER_ALLOW_ON_INVERTED) -+ { -+ return (((meta & 8) == 8) || isOpaqueCube()); -+ } -+ else -+ { -+ return isNormalCube(this.blockID); -+ } -+ } -+ else if (this instanceof BlockStairs) -+ { -+ if (mod_MinecraftForge.SPAWNER_ALLOW_ON_INVERTED) -+ { -+ return ((meta & 4) != 0); -+ } -+ else -+ { -+ return isNormalCube(this.blockID); -+ } -+ } -+ return isBlockSolidOnSide(world, x, y, z, 1); -+ } -+ -+ /** -+ * Determines if this block is classified as a Bed, Allowing -+ * players to sleep in it, though the block has to specifically -+ * perform the sleeping functionality in it's activated event. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param player The player or camera entity, null in some cases. -+ * @return True to treat this as a bed -+ */ -+ public boolean isBed(World world, int x, int y, int z, EntityLiving player) -+ { -+ return blockID == Block.bed.blockID; -+ } -+ -+ /** -+ * Returns the position that the player is moved to upon -+ * waking up, or respawning at the bed. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param player The player or camera entity, null in some cases. -+ * @return The spawn position -+ */ -+ public ChunkCoordinates getBedSpawnPosition(World world, int x, int y, int z, EntityPlayer player) -+ { -+ return BlockBed.getNearestEmptyChunkCoordinates(world, x, y, z, 0); -+ } -+ -+ /** -+ * Called when a user either starts or stops sleeping in the bed. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param player The player or camera entity, null in some cases. -+ * @param occupied True if we are occupying the bed, or false if they are stopping use of the bed -+ */ -+ public void setBedOccupied(World world, int x, int y, int z, EntityPlayer player, boolean occupied) -+ { -+ BlockBed.setBedOccupied(world, x, y, z, occupied); -+ } -+ -+ /** -+ * Returns the direction of the block. Same values that -+ * are returned by BlockDirectional -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return Bed direction -+ */ -+ public int getBedDirection(IBlockAccess world, int x, int y, int z) -+ { -+ return BlockBed.getDirection(world.getBlockMetadata(x, y, z)); -+ } -+ -+ /** -+ * Determines if the current block is the foot half of the bed. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return True if the current block is the foot side of a bed. -+ */ -+ public boolean isBedFoot(IBlockAccess world, int x, int y, int z) -+ { -+ return BlockBed.isBlockFootOfBed(world.getBlockMetadata(x, y, z)); -+ } -+ -+ /** -+ * Called when a leaf should start its decay process. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ */ -+ public void beginLeavesDecay(World world, int x, int y, int z){} -+ -+ /** -+ * Determines if this block can prevent leaves connected to it from decaying. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return true if the presence this block can prevent leaves from decaying. -+ */ -+ public boolean canSustainLeaves(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Determines if this block is considered a leaf block, used to apply the leaf decay and generation system. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return true if this block is considered leaves. -+ */ -+ public boolean isLeaves(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Used during tree growth to determine if newly generated leaves can replace this block. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return true if this block can be replaced by growing leaves. -+ */ -+ public boolean canBeReplacedByLeaves(World world, int x, int y, int z) -+ { -+ return !Block.opaqueCubeLookup[this.blockID]; -+ } -+ -+ /** -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return true if the block is wood (logs) -+ */ -+ public boolean isWood(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Determines if the current block is replaceable by Ore veins during world generation. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return True to allow this block to be replaced by a ore -+ */ -+ public boolean isGenMineableReplaceable(World world, int x, int y, int z) -+ { -+ return blockID == stone.blockID; -+ } -+ -+ /** -+ * Grabs the current texture file used for this block -+ */ -+ @Override -+ public String getTextureFile() -+ { -+ return currentTexture; -+ } -+ -+ /** -+ * Sets the current texture file for this block, used when rendering. -+ * Default is "/terrain.png" -+ * -+ * @param texture The texture file -+ */ -+ public void setTextureFile(String texture) -+ { -+ currentTexture = texture; -+ isDefaultTexture = false; -+ } -+ - static - { - Item.itemsList[cloth.blockID] = (new ItemCloth(cloth.blockID - 256)).setItemName("cloth"); diff --git a/patches/minecraft/net/minecraft/src/BlockButton.java.patch b/patches/minecraft/net/minecraft/src/BlockButton.java.patch deleted file mode 100644 index c495d57ba..000000000 --- a/patches/minecraft/net/minecraft/src/BlockButton.java.patch +++ /dev/null @@ -1,90 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockButton.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockButton.java 0000-00-00 00:00:00.000000000 -0000 -@@ -49,7 +49,10 @@ - */ - public boolean canPlaceBlockOnSide(World par1World, int par2, int par3, int par4, int par5) - { -- return par5 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1) ? true : (par5 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : (par5 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : par5 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4))); -+ return (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) || -+ (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) || -+ (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) || -+ (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)); - } - - /** -@@ -57,7 +60,10 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2 - 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : par1World.isBlockNormalCube(par2, par3, par4 + 1))); -+ return par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) || -+ par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2); - } - - /** -@@ -70,19 +76,19 @@ - int var7 = var6 & 8; - var6 &= 7; - -- if (par5 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var6 = 4; - } -- else if (par5 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ else if (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var6 = 3; - } -- else if (par5 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ else if (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var6 = 2; - } -- else if (par5 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ else if (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var6 = 1; - } -@@ -99,7 +105,11 @@ - */ - private int getOrientation(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2 - 1, par3, par4) ? 1 : (par1World.isBlockNormalCube(par2 + 1, par3, par4) ? 2 : (par1World.isBlockNormalCube(par2, par3, par4 - 1) ? 3 : (par1World.isBlockNormalCube(par2, par3, par4 + 1) ? 4 : 1))); -+ if (par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) return 1; -+ if (par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) return 2; -+ if (par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) return 3; -+ if (par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) return 4; -+ return 1; - } - - /** -@@ -113,22 +123,22 @@ - int var6 = par1World.getBlockMetadata(par2, par3, par4) & 7; - boolean var7 = false; - -- if (!par1World.isBlockNormalCube(par2 - 1, par3, par4) && var6 == 1) -+ if (!par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) && var6 == 1) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2 + 1, par3, par4) && var6 == 2) -+ if (!par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) && var6 == 2) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3, par4 - 1) && var6 == 3) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) && var6 == 3) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3, par4 + 1) && var6 == 4) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) && var6 == 4) - { - var7 = true; - } diff --git a/patches/minecraft/net/minecraft/src/BlockChest.java.patch b/patches/minecraft/net/minecraft/src/BlockChest.java.patch deleted file mode 100644 index 688391b5e..000000000 --- a/patches/minecraft/net/minecraft/src/BlockChest.java.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockChest.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockChest.java 0000-00-00 00:00:00.000000000 -0000 -@@ -497,7 +497,7 @@ - { - return true; - } -- else if (par1World.isBlockNormalCube(par2, par3 + 1, par4)) -+ else if (par1World.isBlockSolidOnSide(par2, par3 + 1, par4, 0)) - { - return true; - } -@@ -505,19 +505,19 @@ - { - return true; - } -- else if (par1World.getBlockId(par2 - 1, par3, par4) == this.blockID && (par1World.isBlockNormalCube(par2 - 1, par3 + 1, par4) || isOcelotBlockingChest(par1World, par2 - 1, par3, par4))) -+ else if (par1World.getBlockId(par2 - 1, par3, par4) == this.blockID && (par1World.isBlockSolidOnSide(par2 - 1, par3 + 1, par4, 0) || isOcelotBlockingChest(par1World, par2 - 1, par3, par4))) - { - return true; - } -- else if (par1World.getBlockId(par2 + 1, par3, par4) == this.blockID && (par1World.isBlockNormalCube(par2 + 1, par3 + 1, par4) || isOcelotBlockingChest(par1World, par2 + 1, par3, par4))) -+ else if (par1World.getBlockId(par2 + 1, par3, par4) == this.blockID && (par1World.isBlockSolidOnSide(par2 + 1, par3 + 1, par4, 0) || isOcelotBlockingChest(par1World, par2 + 1, par3, par4))) - { - return true; - } -- else if (par1World.getBlockId(par2, par3, par4 - 1) == this.blockID && (par1World.isBlockNormalCube(par2, par3 + 1, par4 - 1) || isOcelotBlockingChest(par1World, par2, par3, par4 - 1))) -+ else if (par1World.getBlockId(par2, par3, par4 - 1) == this.blockID && (par1World.isBlockSolidOnSide(par2, par3 + 1, par4 - 1, 0) || isOcelotBlockingChest(par1World, par2, par3, par4 - 1))) - { - return true; - } -- else if (par1World.getBlockId(par2, par3, par4 + 1) == this.blockID && (par1World.isBlockNormalCube(par2, par3 + 1, par4 + 1) || isOcelotBlockingChest(par1World, par2, par3, par4 + 1))) -+ else if (par1World.getBlockId(par2, par3, par4 + 1) == this.blockID && (par1World.isBlockSolidOnSide(par2, par3 + 1, par4 + 1, 0) || isOcelotBlockingChest(par1World, par2, par3, par4 + 1))) - { - return true; - } diff --git a/patches/minecraft/net/minecraft/src/BlockContainer.java.patch b/patches/minecraft/net/minecraft/src/BlockContainer.java.patch deleted file mode 100644 index 98ace699f..000000000 --- a/patches/minecraft/net/minecraft/src/BlockContainer.java.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockContainer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockContainer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -20,7 +20,7 @@ - public void onBlockAdded(World par1World, int par2, int par3, int par4) - { - super.onBlockAdded(par1World, par2, par3, par4); -- par1World.setBlockTileEntity(par2, par3, par4, this.getBlockEntity()); -+ par1World.setBlockTileEntity(par2, par3, par4, this.getBlockEntity(par1World.getBlockMetadata(par2, par3, par4))); - } - - /** -@@ -51,4 +51,14 @@ - var7.receiveClientEvent(par5, par6); - } - } -+ -+ /** -+ * Metadata-sensitive version, to fix 1.8.1 regression. -+ * @param meta The current Metadata -+ * @return And instance of the TileEntity class for this block -+ */ -+ public TileEntity getBlockEntity(int meta) -+ { -+ return getBlockEntity(); -+ } - } diff --git a/patches/minecraft/net/minecraft/src/BlockCrops.java.patch b/patches/minecraft/net/minecraft/src/BlockCrops.java.patch deleted file mode 100644 index 745d739e3..000000000 --- a/patches/minecraft/net/minecraft/src/BlockCrops.java.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockCrops.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockCrops.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,7 @@ - package net.minecraft.src; - - import java.util.Random; -+import java.util.ArrayList; - - public class BlockCrops extends BlockFlower - { -@@ -135,25 +136,26 @@ - public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7) - { - super.dropBlockAsItemWithChance(par1World, par2, par3, par4, par5, par6, 0); -- -- if (!par1World.isRemote) -+ } -+ -+ @Override -+ public ArrayList getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ if (metadata == 7) - { -- int var8 = 3 + par7; -- -- for (int var9 = 0; var9 < var8; ++var9) -+ ret.add(new ItemStack(Item.wheat)); -+ } -+ -+ for (int n = 0; n < 3 + fortune; n++) -+ { -+ if (world.rand.nextInt(15) <= metadata) - { -- if (par1World.rand.nextInt(15) <= par5) -- { -- float var10 = 0.7F; -- float var11 = par1World.rand.nextFloat() * var10 + (1.0F - var10) * 0.5F; -- float var12 = par1World.rand.nextFloat() * var10 + (1.0F - var10) * 0.5F; -- float var13 = par1World.rand.nextFloat() * var10 + (1.0F - var10) * 0.5F; -- EntityItem var14 = new EntityItem(par1World, (double)((float)par2 + var11), (double)((float)par3 + var12), (double)((float)par4 + var13), new ItemStack(Item.seeds)); -- var14.delayBeforeCanPickup = 10; -- par1World.spawnEntityInWorld(var14); -- } -+ ret.add(new ItemStack(Item.seeds)); - } - } -+ -+ return ret; - } - - /** diff --git a/patches/minecraft/net/minecraft/src/BlockDoor.java.patch b/patches/minecraft/net/minecraft/src/BlockDoor.java.patch deleted file mode 100644 index d79b6fc74..000000000 --- a/patches/minecraft/net/minecraft/src/BlockDoor.java.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockDoor.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockDoor.java 0000-00-00 00:00:00.000000000 -0000 -@@ -243,7 +243,7 @@ - { - if (this.blockMaterial == Material.iron) - { -- return true; -+ return false; - } - else - { -@@ -325,7 +325,7 @@ - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4)) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1)) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - var7 = true; -@@ -378,7 +378,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par3 >= 255 ? false : par1World.isBlockNormalCube(par2, par3 - 1, par4) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); -+ return par3 >= 255 ? false : par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); - } - - /** diff --git a/patches/minecraft/net/minecraft/src/BlockFire.java.patch b/patches/minecraft/net/minecraft/src/BlockFire.java.patch deleted file mode 100644 index 6a8aa5f50..000000000 --- a/patches/minecraft/net/minecraft/src/BlockFire.java.patch +++ /dev/null @@ -1,275 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockFire.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockFire.java 0000-00-00 00:00:00.000000000 -0000 -@@ -25,6 +25,8 @@ - */ - public void initializeBlock() - { -+ abilityToCatchFire = Block.blockFlammability; -+ chanceToEncourageFire = Block.blockFireSpreadSpeed; - this.setBurnRate(Block.planks.blockID, 5, 20); - this.setBurnRate(Block.fence.blockID, 5, 20); - this.setBurnRate(Block.stairCompactPlanks.blockID, 5, 20); -@@ -44,8 +46,7 @@ - */ - private void setBurnRate(int par1, int par2, int par3) - { -- this.chanceToEncourageFire[par1] = par2; -- this.abilityToCatchFire[par1] = par3; -+ Block.setBurnProperties(par1, par2, par3); - } - - /** -@@ -103,8 +104,9 @@ - */ - public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) - { -- boolean var6 = par1World.getBlockId(par2, par3 - 1, par4) == Block.netherrack.blockID; -- -+ Block base = Block.blocksList[par1World.getBlockId(par2, par3 - 1, par4)]; -+ boolean var6 = (base != null && base.isFireSource(par1World, par2, par3 - 1, par4, par1World.getBlockMetadata(par2, par3 - 1, par4), 0)); -+ - if (par1World.worldProvider instanceof WorldProviderEnd && par1World.getBlockId(par2, par3 - 1, par4) == Block.bedrock.blockID) - { - var6 = true; -@@ -132,12 +134,12 @@ - - if (!var6 && !this.canNeighborBurn(par1World, par2, par3, par4)) - { -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) || var7 > 3) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) || var7 > 3) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - } - } -- else if (!var6 && !this.canBlockCatchFire(par1World, par2, par3 - 1, par4) && var7 == 15 && par5Random.nextInt(4) == 0) -+ else if (!var6 && !this.canBlockCatchFire(par1World, par2, par3 - 1, par4, 1) && var7 == 15 && par5Random.nextInt(4) == 0) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - } -@@ -151,12 +153,12 @@ - var9 = -50; - } - -- this.tryToCatchBlockOnFire(par1World, par2 + 1, par3, par4, 300 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2 - 1, par3, par4, 300 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2, par3 - 1, par4, 250 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2, par3 + 1, par4, 250 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2, par3, par4 - 1, 300 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2, par3, par4 + 1, 300 + var9, par5Random, var7); -+ this.tryToCatchBlockOnFire(par1World, par2 + 1, par3, par4, 300 + var9, par5Random, var7, 4); -+ this.tryToCatchBlockOnFire(par1World, par2 - 1, par3, par4, 300 + var9, par5Random, var7, 5); -+ this.tryToCatchBlockOnFire(par1World, par2, par3 - 1, par4, 250 + var9, par5Random, var7, 1); -+ this.tryToCatchBlockOnFire(par1World, par2, par3 + 1, par4, 250 + var9, par5Random, var7, 0); -+ this.tryToCatchBlockOnFire(par1World, par2, par3, par4 - 1, 300 + var9, par5Random, var7, 3); -+ this.tryToCatchBlockOnFire(par1World, par2, par3, par4 + 1, 300 + var9, par5Random, var7, 2); - - for (int var10 = par2 - 1; var10 <= par2 + 1; ++var10) - { -@@ -203,10 +205,22 @@ - } - } - } -- -+ -+ /** Deprecated for a side-sensitive version */ -+ @Deprecated - private void tryToCatchBlockOnFire(World par1World, int par2, int par3, int par4, int par5, Random par6Random, int par7) - { -- int var8 = this.abilityToCatchFire[par1World.getBlockId(par2, par3, par4)]; -+ tryToCatchBlockOnFire(par1World, par2, par3, par4, par5, par6Random, par7, 0); -+ } -+ -+ private void tryToCatchBlockOnFire(World par1World, int par2, int par3, int par4, int par5, Random par6Random, int par7, int face) -+ { -+ int var8 = 0; -+ Block block = Block.blocksList[par1World.getBlockId(par2, par3, par4)]; -+ if (block != null) -+ { -+ var8 = block.getFlammability(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), face); -+ } - - if (par6Random.nextInt(par5) < var8) - { -@@ -240,7 +254,12 @@ - */ - private boolean canNeighborBurn(World par1World, int par2, int par3, int par4) - { -- return this.canBlockCatchFire(par1World, par2 + 1, par3, par4) ? true : (this.canBlockCatchFire(par1World, par2 - 1, par3, par4) ? true : (this.canBlockCatchFire(par1World, par2, par3 - 1, par4) ? true : (this.canBlockCatchFire(par1World, par2, par3 + 1, par4) ? true : (this.canBlockCatchFire(par1World, par2, par3, par4 - 1) ? true : this.canBlockCatchFire(par1World, par2, par3, par4 + 1))))); -+ return canBlockCatchFire(par1World, par2 + 1, par3, par4, 4) || -+ canBlockCatchFire(par1World, par2 - 1, par3, par4, 5) || -+ canBlockCatchFire(par1World, par2, par3 - 1, par4, 1) || -+ canBlockCatchFire(par1World, par2, par3 + 1, par4, 0) || -+ canBlockCatchFire(par1World, par2, par3, par4 - 1, 3) || -+ canBlockCatchFire(par1World, par2, par3, par4 + 1, 2); - } - - /** -@@ -256,12 +275,12 @@ - } - else - { -- int var6 = this.getChanceToEncourageFire(par1World, par2 + 1, par3, par4, var5); -- var6 = this.getChanceToEncourageFire(par1World, par2 - 1, par3, par4, var6); -- var6 = this.getChanceToEncourageFire(par1World, par2, par3 - 1, par4, var6); -- var6 = this.getChanceToEncourageFire(par1World, par2, par3 + 1, par4, var6); -- var6 = this.getChanceToEncourageFire(par1World, par2, par3, par4 - 1, var6); -- var6 = this.getChanceToEncourageFire(par1World, par2, par3, par4 + 1, var6); -+ int var6 = this.getChanceToEncourageFire(par1World, par2 + 1, par3, par4, var5, 4); -+ var6 = this.getChanceToEncourageFire(par1World, par2 - 1, par3, par4, var6, 5); -+ var6 = this.getChanceToEncourageFire(par1World, par2, par3 - 1, par4, var6, 1); -+ var6 = this.getChanceToEncourageFire(par1World, par2, par3 + 1, par4, var6, 0); -+ var6 = this.getChanceToEncourageFire(par1World, par2, par3, par4 - 1, var6, 3); -+ var6 = this.getChanceToEncourageFire(par1World, par2, par3, par4 + 1, var6, 2); - return var6; - } - } -@@ -276,21 +295,24 @@ - - /** - * Checks the specified block coordinate to see if it can catch fire. Args: blockAccess, x, y, z -+ * Deprecated for a side-sensitive version - */ -+ @Deprecated - public boolean canBlockCatchFire(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { -- return this.chanceToEncourageFire[par1IBlockAccess.getBlockId(par2, par3, par4)] > 0; -+ return canBlockCatchFire(par1IBlockAccess, par2, par3, par4, 0); - } - - /** - * Retrieves a specified block's chance to encourage their neighbors to burn and if the number is greater than the - * current number passed in it will return its number instead of the passed in one. Args: world, x, y, z, - * curChanceToEncourageFire -+ * Deprecated for a side-sensitive version - */ -+ @Deprecated - public int getChanceToEncourageFire(World par1World, int par2, int par3, int par4, int par5) - { -- int var6 = this.chanceToEncourageFire[par1World.getBlockId(par2, par3, par4)]; -- return var6 > par5 ? var6 : par5; -+ return getChanceToEncourageFire(par1World, par2, par3, par4, par5, 0); - } - - /** -@@ -298,7 +320,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2, par3 - 1, par4) || this.canNeighborBurn(par1World, par2, par3, par4); -+ return par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) || this.canNeighborBurn(par1World, par2, par3, par4); - } - - /** -@@ -307,7 +329,7 @@ - */ - public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) - { -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && !this.canNeighborBurn(par1World, par2, par3, par4)) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && !this.canNeighborBurn(par1World, par2, par3, par4)) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - } -@@ -320,7 +342,7 @@ - { - if (par1World.worldProvider.worldType > 0 || par1World.getBlockId(par2, par3 - 1, par4) != Block.obsidian.blockID || !Block.portal.tryToCreatePortal(par1World, par2, par3, par4)) - { -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && !this.canNeighborBurn(par1World, par2, par3, par4)) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && !this.canNeighborBurn(par1World, par2, par3, par4)) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - } -@@ -346,9 +368,9 @@ - float var8; - float var9; - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && !Block.fire.canBlockCatchFire(par1World, par2, par3 - 1, par4)) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && !Block.fire.canBlockCatchFire(par1World, par2, par3 - 1, par4, 1)) - { -- if (Block.fire.canBlockCatchFire(par1World, par2 - 1, par3, par4)) -+ if (Block.fire.canBlockCatchFire(par1World, par2 - 1, par3, par4, 5)) - { - for (var6 = 0; var6 < 2; ++var6) - { -@@ -359,7 +381,7 @@ - } - } - -- if (Block.fire.canBlockCatchFire(par1World, par2 + 1, par3, par4)) -+ if (Block.fire.canBlockCatchFire(par1World, par2 + 1, par3, par4, 4)) - { - for (var6 = 0; var6 < 2; ++var6) - { -@@ -370,7 +392,7 @@ - } - } - -- if (Block.fire.canBlockCatchFire(par1World, par2, par3, par4 - 1)) -+ if (Block.fire.canBlockCatchFire(par1World, par2, par3, par4 - 1, 3)) - { - for (var6 = 0; var6 < 2; ++var6) - { -@@ -381,7 +403,7 @@ - } - } - -- if (Block.fire.canBlockCatchFire(par1World, par2, par3, par4 + 1)) -+ if (Block.fire.canBlockCatchFire(par1World, par2, par3, par4 + 1, 2)) - { - for (var6 = 0; var6 < 2; ++var6) - { -@@ -392,7 +414,7 @@ - } - } - -- if (Block.fire.canBlockCatchFire(par1World, par2, par3 + 1, par4)) -+ if (Block.fire.canBlockCatchFire(par1World, par2, par3 + 1, par4, 0)) - { - for (var6 = 0; var6 < 2; ++var6) - { -@@ -414,4 +436,46 @@ - } - } - } -+ -+ /** -+ * Side sensitive version that calls the block function. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param face The side the fire is coming from -+ * @return True if the face can catch fire. -+ */ -+ public boolean canBlockCatchFire(IBlockAccess world, int x, int y, int z, int face) -+ { -+ Block block = Block.blocksList[world.getBlockId(x, y, z)]; -+ if (block != null) -+ { -+ return block.isFlammable(world, x, y, z, world.getBlockMetadata(x, y, z), face); -+ } -+ return false; -+ } -+ -+ /** -+ * Side sensitive version that calls the block function. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param oldChance The previous maximum chance. -+ * @param face The side the fire is coming from -+ * @return The chance of the block catching fire, or oldChance if it is higher -+ */ -+ public int getChanceToEncourageFire(World world, int x, int y, int z, int oldChance, int face) -+ { -+ int newChance = 0; -+ Block block = Block.blocksList[world.getBlockId(x, y, z)]; -+ if (block != null) -+ { -+ newChance = block.getFireSpreadSpeed(world, x, y, z, world.getBlockMetadata(x, y, z), face); -+ } -+ return (newChance > oldChance ? newChance : oldChance); -+ } - } diff --git a/patches/minecraft/net/minecraft/src/BlockLadder.java.patch b/patches/minecraft/net/minecraft/src/BlockLadder.java.patch deleted file mode 100644 index dceb7d872..000000000 --- a/patches/minecraft/net/minecraft/src/BlockLadder.java.patch +++ /dev/null @@ -1,79 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockLadder.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockLadder.java 0000-00-00 00:00:00.000000000 -0000 -@@ -102,7 +102,10 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2 - 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : par1World.isBlockNormalCube(par2, par3, par4 + 1))); -+ return par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) || -+ par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2); - } - - /** -@@ -113,22 +116,22 @@ - { - int var6 = par1World.getBlockMetadata(par2, par3, par4); - -- if ((var6 == 0 || par5 == 2) && par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if ((var6 == 0 || par5 == 2) && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var6 = 2; - } - -- if ((var6 == 0 || par5 == 3) && par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ if ((var6 == 0 || par5 == 3) && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var6 = 3; - } - -- if ((var6 == 0 || par5 == 4) && par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ if ((var6 == 0 || par5 == 4) && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var6 = 4; - } - -- if ((var6 == 0 || par5 == 5) && par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ if ((var6 == 0 || par5 == 5) && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var6 = 5; - } -@@ -145,22 +148,22 @@ - int var6 = par1World.getBlockMetadata(par2, par3, par4); - boolean var7 = false; - -- if (var6 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if (var6 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var7 = true; - } - -- if (var6 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ if (var6 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var7 = true; - } - -- if (var6 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ if (var6 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var7 = true; - } - -- if (var6 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ if (var6 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var7 = true; - } -@@ -181,4 +184,10 @@ - { - return 1; - } -+ -+ @Override -+ public boolean isLadder(World world, int x, int y, int z) -+ { -+ return true; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/BlockLeaves.java.patch b/patches/minecraft/net/minecraft/src/BlockLeaves.java.patch deleted file mode 100644 index 8ce3640ee..000000000 --- a/patches/minecraft/net/minecraft/src/BlockLeaves.java.patch +++ /dev/null @@ -1,94 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockLeaves.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockLeaves.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,8 +1,11 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - --public class BlockLeaves extends BlockLeavesBase -+import net.minecraft.src.forge.IShearable; -+ -+public class BlockLeaves extends BlockLeavesBase implements IShearable - { - /** - * The base index in terrain.png corresponding to the fancy version of the leaf texture. This is stored so we can -@@ -88,10 +91,9 @@ - { - int var10 = par1World.getBlockId(par2 + var7, par3 + var8, par4 + var9); - -- if (var10 == Block.leaves.blockID) -+ if (Block.blocksList[var10] != null) - { -- int var11 = par1World.getBlockMetadata(par2 + var7, par3 + var8, par4 + var9); -- par1World.setBlockMetadata(par2 + var7, par3 + var8, par4 + var9, var11 | 8); -+ Block.blocksList[var10].beginLeavesDecay(par1World, par2 + var7, par3 + var8, par4 + var9); - } - } - } -@@ -136,12 +138,14 @@ - for (var14 = -var7; var14 <= var7; ++var14) - { - var15 = par1World.getBlockId(par2 + var12, par3 + var13, par4 + var14); -- -- if (var15 == Block.wood.blockID) -+ -+ Block block = Block.blocksList[var15]; -+ -+ if (block != null && block.canSustainLeaves(par1World, par2 + var12, par3 + var13, par4 + var14)) - { - this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = 0; - } -- else if (var15 == Block.leaves.blockID) -+ else if (block != null && block.isLeaves(par1World, par2 + var12, par3 + var13, par4 + var14)) - { - this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = -2; - } -@@ -268,15 +272,7 @@ - */ - public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) - { -- if (!par1World.isRemote && par2EntityPlayer.getCurrentEquippedItem() != null && par2EntityPlayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex) -- { -- par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); -- this.dropBlockAsItem_do(par1World, par3, par4, par5, new ItemStack(Block.leaves.blockID, 1, par6 & 3)); -- } -- else -- { -- super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -- } -+ super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); - } - - /** -@@ -320,4 +316,30 @@ - { - super.onEntityWalking(par1World, par2, par3, par4, par5Entity); - } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int x, int y, int z, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z) & 3)); -+ return ret; -+ } -+ -+ @Override -+ public void beginLeavesDecay(World world, int x, int y, int z) -+ { -+ world.setBlockMetadata(x, y, z, world.getBlockMetadata(x, y, z) | 8); -+ } -+ -+ @Override -+ public boolean isLeaves(World world, int x, int y, int z) -+ { -+ return true; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/BlockLever.java.patch b/patches/minecraft/net/minecraft/src/BlockLever.java.patch deleted file mode 100644 index ddc55de84..000000000 --- a/patches/minecraft/net/minecraft/src/BlockLever.java.patch +++ /dev/null @@ -1,100 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockLever.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockLever.java 0000-00-00 00:00:00.000000000 -0000 -@@ -46,7 +46,11 @@ - */ - public boolean canPlaceBlockOnSide(World par1World, int par2, int par3, int par4, int par5) - { -- return par5 == 1 && par1World.isBlockNormalCube(par2, par3 - 1, par4) ? true : (par5 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1) ? true : (par5 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : (par5 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : par5 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4)))); -+ return (par5 == 1 && par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1)) || -+ (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) || -+ (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) || -+ (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) || -+ (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)); - } - - /** -@@ -54,7 +58,11 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2 - 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : (par1World.isBlockNormalCube(par2, par3, par4 + 1) ? true : par1World.isBlockNormalCube(par2, par3 - 1, par4)))); -+ return par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) || -+ par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) || -+ par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1); - } - - /** -@@ -68,27 +76,27 @@ - var6 &= 7; - var6 = -1; - -- if (par5 == 1 && par1World.isBlockNormalCube(par2, par3 - 1, par4)) -+ if (par5 == 1 && par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1)) - { - var6 = 5 + par1World.rand.nextInt(2); - } - -- if (par5 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var6 = 4; - } - -- if (par5 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ if (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var6 = 3; - } - -- if (par5 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ if (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var6 = 2; - } - -- if (par5 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ if (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var6 = 1; - } -@@ -115,32 +123,32 @@ - int var6 = par1World.getBlockMetadata(par2, par3, par4) & 7; - boolean var7 = false; - -- if (!par1World.isBlockNormalCube(par2 - 1, par3, par4) && var6 == 1) -+ if (!par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) && var6 == 1) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2 + 1, par3, par4) && var6 == 2) -+ if (!par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) && var6 == 2) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3, par4 - 1) && var6 == 3) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) && var6 == 3) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3, par4 + 1) && var6 == 4) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) && var6 == 4) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && var6 == 5) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && var6 == 5) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && var6 == 6) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && var6 == 6) - { - var7 = true; - } diff --git a/patches/minecraft/net/minecraft/src/BlockLog.java.patch b/patches/minecraft/net/minecraft/src/BlockLog.java.patch deleted file mode 100644 index cadd98aed..000000000 --- a/patches/minecraft/net/minecraft/src/BlockLog.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockLog.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockLog.java 0000-00-00 00:00:00.000000000 -0000 -@@ -53,14 +53,9 @@ - { - int var10 = par1World.getBlockId(par2 + var7, par3 + var8, par4 + var9); - -- if (var10 == Block.leaves.blockID) -+ if (Block.blocksList[var10] != null) - { -- int var11 = par1World.getBlockMetadata(par2 + var7, par3 + var8, par4 + var9); -- -- if ((var11 & 8) == 0) -- { -- par1World.setBlockMetadata(par2 + var7, par3 + var8, par4 + var9, var11 | 8); -- } -+ Block.blocksList[var10].beginLeavesDecay(par1World, par2 + var7, par3 + var8, par4 + var9); - } - } - } -@@ -83,4 +78,16 @@ - { - return par1; - } -+ -+ @Override -+ public boolean canSustainLeaves(World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ @Override -+ public boolean isWood(World world, int x, int y, int z) -+ { -+ return true; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/BlockNetherStalk.java.patch b/patches/minecraft/net/minecraft/src/BlockNetherStalk.java.patch deleted file mode 100644 index 86daf4fb0..000000000 --- a/patches/minecraft/net/minecraft/src/BlockNetherStalk.java.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockNetherStalk.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockNetherStalk.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,6 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - - public class BlockNetherStalk extends BlockFlower -@@ -71,25 +72,25 @@ - */ - public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7) - { -- if (!par1World.isRemote) -- { -- int var8 = 1; -- -- if (par5 >= 3) -- { -- var8 = 2 + par1World.rand.nextInt(3); -+ super.dropBlockAsItemWithChance(par1World, par2, par3, par4, par5, par6, par7); -+ } -+ -+ @Override -+ public ArrayList getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ int var8 = 1; - -- if (par7 > 0) -- { -- var8 += par1World.rand.nextInt(par7 + 1); -- } -- } -+ if (metadata >= 3) -+ { -+ var8 = 2 + world.rand.nextInt(3) + (fortune > 0 ? world.rand.nextInt(fortune + 1) : 0); -+ } - -- for (int var9 = 0; var9 < var8; ++var9) -- { -- this.dropBlockAsItem_do(par1World, par2, par3, par4, new ItemStack(Item.netherStalkSeeds)); -- } -+ for (int var9 = 0; var9 < var8; ++var9) -+ { -+ ret.add(new ItemStack(Item.netherStalkSeeds)); - } -+ return ret; - } - - /** diff --git a/patches/minecraft/net/minecraft/src/BlockPistonBase.java.patch b/patches/minecraft/net/minecraft/src/BlockPistonBase.java.patch deleted file mode 100644 index 25faf60be..000000000 --- a/patches/minecraft/net/minecraft/src/BlockPistonBase.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockPistonBase.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockPistonBase.java 0000-00-00 00:00:00.000000000 -0000 -@@ -368,7 +368,7 @@ - return false; - } - -- return !(Block.blocksList[par0] instanceof BlockContainer); -+ return !(Block.blocksList[par0] != null && Block.blocksList[par0].hasTileEntity(par1World.getBlockMetadata(par2, par3, par4))); - } - } - diff --git a/patches/minecraft/net/minecraft/src/BlockPressurePlate.java.patch b/patches/minecraft/net/minecraft/src/BlockPressurePlate.java.patch deleted file mode 100644 index d43c96d57..000000000 --- a/patches/minecraft/net/minecraft/src/BlockPressurePlate.java.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockPressurePlate.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockPressurePlate.java 0000-00-00 00:00:00.000000000 -0000 -@@ -61,7 +61,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2, par3 - 1, par4) || par1World.getBlockId(par2, par3 - 1, par4) == Block.fence.blockID; -+ return par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) || par1World.getBlockId(par2, par3 - 1, par4) == Block.fence.blockID; - } - - /** -@@ -77,7 +77,7 @@ - { - boolean var6 = false; - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && par1World.getBlockId(par2, par3 - 1, par4) != Block.fence.blockID) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && par1World.getBlockId(par2, par3 - 1, par4) != Block.fence.blockID) - { - var6 = true; - } diff --git a/patches/minecraft/net/minecraft/src/BlockRail.java.patch b/patches/minecraft/net/minecraft/src/BlockRail.java.patch deleted file mode 100644 index ca4c9ccde..000000000 --- a/patches/minecraft/net/minecraft/src/BlockRail.java.patch +++ /dev/null @@ -1,213 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockRail.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockRail.java 0000-00-00 00:00:00.000000000 -0000 -@@ -6,6 +6,19 @@ - { - /** Power related rails have this field at true. */ - private final boolean isPowered; -+ -+ /** -+ * Forge: Moved render type to a field and a setter. -+ * This allows for a mod to change the render type -+ * for vanilla rails, and any mod rails that extend -+ * this class. -+ */ -+ private int renderType = 9; -+ -+ public void setRenderType(int value) -+ { -+ renderType = value; -+ } - - /** - * Returns true if the block at the coordinates of world passed is a valid rail block (current is rail, powered or -@@ -14,7 +27,7 @@ - public static final boolean isRailBlockAt(World par0World, int par1, int par2, int par3) - { - int var4 = par0World.getBlockId(par1, par2, par3); -- return var4 == Block.rail.blockID || var4 == Block.railPowered.blockID || var4 == Block.railDetector.blockID; -+ return Block.blocksList[var4] instanceof BlockRail; - } - - /** -@@ -22,7 +35,7 @@ - */ - public static final boolean isRailBlock(int par0) - { -- return par0 == Block.rail.blockID || par0 == Block.railPowered.blockID || par0 == Block.railDetector.blockID; -+ return Block.blocksList[par0] instanceof BlockRail; - } - - protected BlockRail(int par1, int par2, boolean par3) -@@ -118,7 +131,7 @@ - */ - public int getRenderType() - { -- return 9; -+ return renderType; - } - - /** -@@ -134,7 +147,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2, par3 - 1, par4); -+ return par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1); - } - - /** -@@ -171,27 +184,27 @@ - - boolean var8 = false; - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4)) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1)) - { - var8 = true; - } - -- if (var7 == 2 && !par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ if (var7 == 2 && !par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 1)) - { - var8 = true; - } - -- if (var7 == 3 && !par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ if (var7 == 3 && !par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 1)) - { - var8 = true; - } - -- if (var7 == 4 && !par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ if (var7 == 4 && !par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 1)) - { - var8 = true; - } - -- if (var7 == 5 && !par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if (var7 == 5 && !par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 1)) - { - var8 = true; - } -@@ -391,10 +404,120 @@ - } - - /** -- * Return true if the blocks passed is a power related rail. -+ * This function is no longer called by Minecraft - */ -+ @Deprecated - static boolean isPoweredBlockRail(BlockRail par0BlockRail) - { - return par0BlockRail.isPowered; - } -+ -+ /** -+ * Return true if the rail can make corners. -+ * Used by placement logic. -+ * @param world The world. -+ * @param x The rail X coordinate. -+ * @param y The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return True if the rail can make corners. -+ */ -+ public boolean isFlexibleRail(World world, int y, int x, int z) -+ { -+ return !isPowered; -+ } -+ -+ /** -+ * Returns true if the rail can make up and down slopes. -+ * Used by placement logic. -+ * @param world The world. -+ * @param x The rail X coordinate. -+ * @param y The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return True if the rail can make slopes. -+ */ -+ public boolean canMakeSlopes(World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ /** -+ * Return the rails metadata (without the power bit if the rail uses one). -+ * Can be used to make the cart think the rail something other than it is, -+ * for example when making diamond junctions or switches. -+ * The cart parameter will often be null unless it it called from EntityMinecart. -+ * -+ * Valid rail metadata is defined as follows: -+ * 0x0: flat track going North-South -+ * 0x1: flat track going West-East -+ * 0x2: track ascending to the East -+ * 0x3: track ascending to the West -+ * 0x4: track ascending to the North -+ * 0x5: track ascending to the South -+ * 0x6: WestNorth corner (connecting East and South) -+ * 0x7: EastNorth corner (connecting West and South) -+ * 0x8: EastSouth corner (connecting West and North) -+ * 0x9: WestSouth corner (connecting East and North) -+ * -+ * All directions are Notch defined. -+ * In MC Beta 1.8.3 the Sun rises in the North. -+ * In MC 1.0.0 the Sun rises in the East. -+ * -+ * @param world The world. -+ * @param cart The cart asking for the metadata, null if it is not called by EntityMinecart. -+ * @param y The rail X coordinate. -+ * @param x The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return The metadata. -+ */ -+ public int getBasicRailMetadata(IBlockAccess world, EntityMinecart cart, int x, int y, int z) -+ { -+ int meta = world.getBlockMetadata(x, y, z); -+ if(isPowered) -+ { -+ meta = meta & 7; -+ } -+ return meta; -+ } -+ -+ /** -+ * Returns the max speed of the rail at the specified position. -+ * @param world The world. -+ * @param cart The cart on the rail, may be null. -+ * @param x The rail X coordinate. -+ * @param y The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return The max speed of the current rail. -+ */ -+ public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) -+ { -+ return 0.4f; -+ } -+ -+ /** -+ * This function is called by any minecart that passes over this rail. -+ * It is called once per update tick that the minecart is on the rail. -+ * @param world The world. -+ * @param cart The cart on the rail. -+ * @param y The rail X coordinate. -+ * @param x The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ */ -+ public void onMinecartPass(World world, EntityMinecart cart, int y, int x, int z) -+ { -+ } -+ -+ /** -+ * Return true if this rail uses the 4th bit as a power bit. -+ * Avoid using this function when getBasicRailMetadata() can be used instead. -+ * The only reason to use this function is if you wish to change the rails metadata. -+ * @param world The world. -+ * @param x The rail X coordinate. -+ * @param y The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return True if the 4th bit is a power bit. -+ */ -+ public boolean hasPowerBit(World world, int x, int y, int z) -+ { -+ return isPowered; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/BlockRedstoneRepeater.java.patch b/patches/minecraft/net/minecraft/src/BlockRedstoneRepeater.java.patch deleted file mode 100644 index 407082998..000000000 --- a/patches/minecraft/net/minecraft/src/BlockRedstoneRepeater.java.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockRedstoneRepeater.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockRedstoneRepeater.java 0000-00-00 00:00:00.000000000 -0000 -@@ -33,7 +33,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return !par1World.isBlockNormalCube(par2, par3 - 1, par4) ? false : super.canPlaceBlockAt(par1World, par2, par3, par4); -+ return !par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) ? false : super.canPlaceBlockAt(par1World, par2, par3, par4); - } - - /** -@@ -41,7 +41,7 @@ - */ - public boolean canBlockStay(World par1World, int par2, int par3, int par4) - { -- return !par1World.isBlockNormalCube(par2, par3 - 1, par4) ? false : super.canBlockStay(par1World, par2, par3, par4); -+ return !par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) ? false : super.canBlockStay(par1World, par2, par3, par4); - } - - /** diff --git a/patches/minecraft/net/minecraft/src/BlockRedstoneWire.java.patch b/patches/minecraft/net/minecraft/src/BlockRedstoneWire.java.patch deleted file mode 100644 index 0d5b43466..000000000 --- a/patches/minecraft/net/minecraft/src/BlockRedstoneWire.java.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockRedstoneWire.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockRedstoneWire.java 0000-00-00 00:00:00.000000000 -0000 -@@ -5,6 +5,8 @@ - import java.util.Random; - import java.util.Set; - -+import net.minecraft.src.forge.IConnectRedstone; -+ - public class BlockRedstoneWire extends Block - { - /** -@@ -76,7 +78,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2, par3 - 1, par4) || par1World.getBlockId(par2, par3 - 1, par4) == Block.glowStone.blockID; -+ return par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) || par1World.getBlockId(par2, par3 - 1, par4) == Block.glowStone.blockID; - } - - /** -@@ -548,6 +550,10 @@ - } - else if (var5 != Block.redstoneRepeaterIdle.blockID && var5 != Block.redstoneRepeaterActive.blockID) - { -+ if (Block.blocksList[var5] instanceof IConnectRedstone) -+ { -+ return ((IConnectRedstone)Block.blocksList[var5]).canConnectRedstone(par0IBlockAccess, par1, par2, par3, par4); -+ } - return Block.blocksList[var5].canProvidePower() && par4 != -1; - } - else diff --git a/patches/minecraft/net/minecraft/src/BlockSnow.java.patch b/patches/minecraft/net/minecraft/src/BlockSnow.java.patch deleted file mode 100644 index 81e312848..000000000 --- a/patches/minecraft/net/minecraft/src/BlockSnow.java.patch +++ /dev/null @@ -1,54 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockSnow.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockSnow.java 0000-00-00 00:00:00.000000000 -0000 -@@ -54,7 +54,8 @@ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { - int var5 = par1World.getBlockId(par2, par3 - 1, par4); -- return var5 != 0 && (var5 == Block.leaves.blockID || Block.blocksList[var5].isOpaqueCube()) ? par1World.getBlockMaterial(par2, par3 - 1, par4).blocksMovement() : false; -+ Block block = Block.blocksList[var5]; -+ return block != null && (block.isLeaves(par1World, par2, par3 - 1, par4) || Block.blocksList[var5].isOpaqueCube()) ? par1World.getBlockMaterial(par2, par3 - 1, par4).blocksMovement() : false; - } - - /** -@@ -73,7 +74,6 @@ - { - if (!this.canPlaceBlockAt(par1World, par2, par3, par4)) - { -- this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); - par1World.setBlockWithNotify(par2, par3, par4, 0); - return false; - } -@@ -89,15 +89,7 @@ - */ - public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) - { -- int var7 = Item.snowball.shiftedIndex; -- float var8 = 0.7F; -- double var9 = (double)(par1World.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D; -- double var11 = (double)(par1World.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D; -- double var13 = (double)(par1World.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D; -- EntityItem var15 = new EntityItem(par1World, (double)par3 + var9, (double)par4 + var11, (double)par5 + var13, new ItemStack(var7, 1, 0)); -- var15.delayBeforeCanPickup = 10; -- par1World.spawnEntityInWorld(var15); -- par1World.setBlockWithNotify(par3, par4, par5, 0); -+ dropBlockAsItem(par1World, par3, par4, par5, par6, 0); - par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); - } - -@@ -114,7 +106,7 @@ - */ - public int quantityDropped(Random par1Random) - { -- return 0; -+ return 1; - } - - /** -@@ -124,7 +116,6 @@ - { - if (par1World.getSavedLightValue(EnumSkyBlock.Block, par2, par3, par4) > 11) - { -- this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); - par1World.setBlockWithNotify(par2, par3, par4, 0); - } - } diff --git a/patches/minecraft/net/minecraft/src/BlockTallGrass.java.patch b/patches/minecraft/net/minecraft/src/BlockTallGrass.java.patch deleted file mode 100644 index a50abc718..000000000 --- a/patches/minecraft/net/minecraft/src/BlockTallGrass.java.patch +++ /dev/null @@ -1,68 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockTallGrass.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockTallGrass.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,8 +1,12 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - --public class BlockTallGrass extends BlockFlower -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.IShearable; -+ -+public class BlockTallGrass extends BlockFlower implements IShearable - { - protected BlockTallGrass(int par1, int par2) - { -@@ -49,7 +53,7 @@ - */ - public int idDropped(int par1, Random par2Random, int par3) - { -- return par2Random.nextInt(8) == 0 ? Item.seeds.shiftedIndex : -1; -+ return -1; - } - - /** -@@ -66,14 +70,37 @@ - */ - public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) - { -- if (!par1World.isRemote && par2EntityPlayer.getCurrentEquippedItem() != null && par2EntityPlayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex) -+ super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -+ } -+ -+ @Override -+ public ArrayList getBlockDropped(World world, int x, int y, int z, int meta, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ if (world.rand.nextInt(8) != 0) - { -- par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); -- this.dropBlockAsItem_do(par1World, par3, par4, par5, new ItemStack(Block.tallGrass, 1, par6)); -+ return ret; - } -- else -+ -+ ItemStack item = ForgeHooks.getGrassSeed(world); -+ if (item != null) - { -- super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -+ ret.add(item); - } -+ return ret; -+ } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int x, int y, int z, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z))); -+ return ret; - } - } diff --git a/patches/minecraft/net/minecraft/src/BlockTorch.java.patch b/patches/minecraft/net/minecraft/src/BlockTorch.java.patch deleted file mode 100644 index f5855479f..000000000 --- a/patches/minecraft/net/minecraft/src/BlockTorch.java.patch +++ /dev/null @@ -1,102 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockTorch.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockTorch.java 0000-00-00 00:00:00.000000000 -0000 -@@ -49,7 +49,7 @@ - */ - private boolean canPlaceTorchOn(World par1World, int par2, int par3, int par4) - { -- if (par1World.isBlockNormalCubeDefault(par2, par3, par4, true)) -+ if (par1World.isBlockSolidOnSide(par2, par3, par4, 1)) - { - return true; - } -@@ -83,7 +83,11 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCubeDefault(par2 - 1, par3, par4, true) ? true : (par1World.isBlockNormalCubeDefault(par2 + 1, par3, par4, true) ? true : (par1World.isBlockNormalCubeDefault(par2, par3, par4 - 1, true) ? true : (par1World.isBlockNormalCubeDefault(par2, par3, par4 + 1, true) ? true : this.canPlaceTorchOn(par1World, par2, par3 - 1, par4)))); -+ return par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) || -+ par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) || -+ canPlaceTorchOn(par1World, par2, par3 - 1, par4); - } - - /** -@@ -99,22 +103,22 @@ - var6 = 5; - } - -- if (par5 == 2 && par1World.isBlockNormalCubeDefault(par2, par3, par4 + 1, true)) -+ if (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var6 = 4; - } - -- if (par5 == 3 && par1World.isBlockNormalCubeDefault(par2, par3, par4 - 1, true)) -+ if (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var6 = 3; - } - -- if (par5 == 4 && par1World.isBlockNormalCubeDefault(par2 + 1, par3, par4, true)) -+ if (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var6 = 2; - } - -- if (par5 == 5 && par1World.isBlockNormalCubeDefault(par2 - 1, par3, par4, true)) -+ if (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var6 = 1; - } -@@ -140,19 +144,19 @@ - */ - public void onBlockAdded(World par1World, int par2, int par3, int par4) - { -- if (par1World.isBlockNormalCubeDefault(par2 - 1, par3, par4, true)) -+ if (par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 1); - } -- else if (par1World.isBlockNormalCubeDefault(par2 + 1, par3, par4, true)) -+ else if (par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 2); - } -- else if (par1World.isBlockNormalCubeDefault(par2, par3, par4 - 1, true)) -+ else if (par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 3); - } -- else if (par1World.isBlockNormalCubeDefault(par2, par3, par4 + 1, true)) -+ else if (par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 4); - } -@@ -175,22 +179,22 @@ - int var6 = par1World.getBlockMetadata(par2, par3, par4); - boolean var7 = false; - -- if (!par1World.isBlockNormalCubeDefault(par2 - 1, par3, par4, true) && var6 == 1) -+ if (!par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) && var6 == 1) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCubeDefault(par2 + 1, par3, par4, true) && var6 == 2) -+ if (!par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) && var6 == 2) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCubeDefault(par2, par3, par4 - 1, true) && var6 == 3) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) && var6 == 3) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCubeDefault(par2, par3, par4 + 1, true) && var6 == 4) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) && var6 == 4) - { - var7 = true; - } diff --git a/patches/minecraft/net/minecraft/src/BlockTrapDoor.java.patch b/patches/minecraft/net/minecraft/src/BlockTrapDoor.java.patch deleted file mode 100644 index 417c2cee2..000000000 --- a/patches/minecraft/net/minecraft/src/BlockTrapDoor.java.patch +++ /dev/null @@ -1,53 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockTrapDoor.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockTrapDoor.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,9 @@ - - public class BlockTrapDoor extends Block - { -+ /** Set this to allow trapdoors to remain free-floating */ -+ public static boolean disableValidation = false; -+ - protected BlockTrapDoor(int par1, Material par2Material) - { - super(par1, par2Material); -@@ -183,7 +186,7 @@ - --var7; - } - -- if (!isValidSupportBlock(par1World.getBlockId(var7, par3, var8))) -+ if (!(isValidSupportBlock(par1World.getBlockId(var7, par3, var8)) || par1World.isBlockSolidOnSide(var7, par3, var8, (var6 & 3) + 2))) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - this.dropBlockAsItem(par1World, par2, par3, par4, var6, 0); -@@ -244,6 +247,10 @@ - */ - public boolean canPlaceBlockOnSide(World par1World, int par2, int par3, int par4, int par5) - { -+ if (disableValidation) -+ { -+ return true; -+ } - if (par5 == 0) - { - return false; -@@ -274,7 +281,7 @@ - --par2; - } - -- return isValidSupportBlock(par1World.getBlockId(par2, par3, par4)); -+ return isValidSupportBlock(par1World.getBlockId(par2, par3, par4)) || par1World.isBlockSolidOnSide(par2, par3, par4, 1); - } - } - -@@ -289,6 +296,11 @@ - */ - private static boolean isValidSupportBlock(int par0) - { -+ if (disableValidation) -+ { -+ return true; -+ } -+ - if (par0 <= 0) - { - return false; diff --git a/patches/minecraft/net/minecraft/src/BlockVine.java.patch b/patches/minecraft/net/minecraft/src/BlockVine.java.patch deleted file mode 100644 index 2804799a2..000000000 --- a/patches/minecraft/net/minecraft/src/BlockVine.java.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/BlockVine.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/BlockVine.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,8 +1,11 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - --public class BlockVine extends Block -+import net.minecraft.src.forge.IShearable; -+ -+public class BlockVine extends Block implements IShearable - { - public BlockVine(int par1) - { -@@ -424,14 +427,26 @@ - */ - public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) - { -- if (!par1World.isRemote && par2EntityPlayer.getCurrentEquippedItem() != null && par2EntityPlayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex) -- { -- par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); -- this.dropBlockAsItem_do(par1World, par3, par4, par5, new ItemStack(Block.vine, 1, 0)); -- } -- else -- { -- super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -- } -+ super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -+ } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int x, int y, int z, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ ret.add(new ItemStack(this, 1, 0)); -+ return ret; -+ } -+ -+ @Override -+ public boolean isLadder(World world, int x, int y, int z) -+ { -+ return true; - } - } diff --git a/patches/minecraft/net/minecraft/src/Chunk.java.patch b/patches/minecraft/net/minecraft/src/Chunk.java.patch deleted file mode 100644 index 1b6cbdb92..000000000 --- a/patches/minecraft/net/minecraft/src/Chunk.java.patch +++ /dev/null @@ -1,371 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/Chunk.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/Chunk.java 0000-00-00 00:00:00.000000000 -0000 -@@ -8,6 +8,8 @@ - import java.util.Map; - import java.util.Random; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class Chunk - { - /** -@@ -120,7 +122,9 @@ - { - for (int var8 = 0; var8 < var5; ++var8) - { -- byte var9 = par2ArrayOfByte[var6 << 11 | var7 << 7 | var8]; -+ /* FORGE: The following change, a cast from unsigned byte to int, -+ * fixes a vanilla bug when generating new chunks that contain a block ID > 127 */ -+ int var9 = par2ArrayOfByte[var6 << 11 | var7 << 7 | var8] & 0xFF; - - if (var9 != 0) - { -@@ -139,6 +143,48 @@ - } - - /** -+ * Metadata sensitive Chunk constructor for use in new ChunkProviders that -+ * use metadata sensitive blocks during generation. -+ * -+ * @param world The world this chunk belongs to -+ * @param ids A ByteArray containing all the BlockID's to set this chunk to -+ * @param metadata A ByteArray containing all the metadata to set this chunk to -+ * @param chunkX The chunk's X position -+ * @param chunkZ The Chunk's Z position -+ */ -+ public Chunk(World world, byte[] ids, byte[] metadata, int chunkX, int chunkZ) -+ { -+ this(world, chunkX, chunkZ); -+ int height = ids.length / 256; -+ -+ for (int x = 0; x < 16; ++x) -+ { -+ for (int z = 0; z < 16; ++z) -+ { -+ for (int y = 0; y < height; ++y) -+ { -+ int index = x << 11 | z << 7 | y; -+ int id = ids[index] & 0xFF; -+ int meta = metadata[index] & 0x0F; -+ -+ if (id != 0) -+ { -+ int chunkY = y >> 4; -+ -+ if (storageArrays[chunkY] == null) -+ { -+ storageArrays[chunkY] = new ExtendedBlockStorage(chunkY << 4); -+ } -+ -+ storageArrays[chunkY].setExtBlockID(x, y & 15, z, id); -+ storageArrays[chunkY].setExtBlockMetadata(x, y & 15, z, meta); -+ } -+ } -+ } -+ } -+ } -+ -+ /** - * Checks whether the chunk is at the X/Z location specified - */ - public boolean isAtLocation(int par1, int par2) -@@ -505,7 +551,7 @@ - */ - public int getBlockID(int par1, int par2, int par3) - { -- if (par2 >> 4 >= this.storageArrays.length) -+ if (par2 >> 4 >= this.storageArrays.length || par2 >> 4 < 0) - { - return 0; - } -@@ -521,7 +567,7 @@ - */ - public int getBlockMetadata(int par1, int par2, int par3) - { -- if (par2 >> 4 >= this.storageArrays.length) -+ if (par2 >> 4 >= this.storageArrays.length || par2 >> 4 < 0) - { - return 0; - } -@@ -561,6 +607,11 @@ - } - else - { -+ if (par2 >> 4 >= storageArrays.length || par2 >> 4 < 0) -+ { -+ return false; -+ } -+ - ExtendedBlockStorage var9 = this.storageArrays[par2 >> 4]; - boolean var10 = false; - -@@ -585,7 +636,7 @@ - { - Block.blocksList[var8].onBlockRemoval(this.worldObj, var11, par2, var12); - } -- else if (Block.blocksList[var8] instanceof BlockContainer && var8 != par4) -+ if (Block.blocksList[var8] != null && Block.blocksList[var8].hasTileEntity(getBlockMetadata(par1, par2, par3))) - { - this.worldObj.removeBlockTileEntity(var11, par2, var12); - } -@@ -629,32 +680,23 @@ - Block.blocksList[par4].onBlockAdded(this.worldObj, var11, par2, var12); - } - -- if (Block.blocksList[par4] instanceof BlockContainer) -+ if (Block.blocksList[par4] != null && Block.blocksList[par4].hasTileEntity(par5)) - { - var13 = this.getChunkBlockTileEntity(par1, par2, par3); - - if (var13 == null) - { -- var13 = ((BlockContainer)Block.blocksList[par4]).getBlockEntity(); -+ var13 = Block.blocksList[par4].getTileEntity(par5); - this.worldObj.setBlockTileEntity(var11, par2, var12, var13); - } - - if (var13 != null) - { - var13.updateContainingBlockInfo(); -+ var13.blockMetadata = par5; - } - } - } -- else if (var8 > 0 && Block.blocksList[var8] instanceof BlockContainer) -- { -- var13 = this.getChunkBlockTileEntity(par1, par2, par3); -- -- if (var13 != null) -- { -- var13.updateContainingBlockInfo(); -- } -- } -- - this.isModified = true; - return true; - } -@@ -666,7 +708,7 @@ - */ - public boolean setBlockMetadata(int par1, int par2, int par3, int par4) - { -- ExtendedBlockStorage var5 = this.storageArrays[par2 >> 4]; -+ ExtendedBlockStorage var5 = (par2 >> 4 >= storageArrays.length || par2 >> 4 < 0 ? null : storageArrays[par2 >> 4]); - - if (var5 == null) - { -@@ -686,7 +728,7 @@ - var5.setExtBlockMetadata(par1, par2 & 15, par3, par4); - int var7 = var5.getExtBlockID(par1, par2 & 15, par3); - -- if (var7 > 0 && Block.blocksList[var7] instanceof BlockContainer) -+ if (var7 > 0 && Block.blocksList[var7] != null && Block.blocksList[var7].hasTileEntity(var5.getExtBlockMetadata(par1, par2 & 15, par3))) - { - TileEntity var8 = this.getChunkBlockTileEntity(par1, par2, par3); - -@@ -707,7 +749,7 @@ - */ - public int getSavedLightValue(EnumSkyBlock par1EnumSkyBlock, int par2, int par3, int par4) - { -- ExtendedBlockStorage var5 = this.storageArrays[par3 >> 4]; -+ ExtendedBlockStorage var5 = (par3 >> 4 >= storageArrays.length || par3 >> 4 < 0 ? null : storageArrays[par3 >> 4]); - return var5 == null ? par1EnumSkyBlock.defaultLightValue : (par1EnumSkyBlock == EnumSkyBlock.Sky ? var5.getExtSkylightValue(par2, par3 & 15, par4) : (par1EnumSkyBlock == EnumSkyBlock.Block ? var5.getExtBlocklightValue(par2, par3 & 15, par4) : par1EnumSkyBlock.defaultLightValue)); - } - -@@ -717,6 +759,11 @@ - */ - public void setLightValue(EnumSkyBlock par1EnumSkyBlock, int par2, int par3, int par4, int par5) - { -+ if (par3 >> 4 >= storageArrays.length || par3 >> 4 < 0) -+ { -+ return; -+ } -+ - ExtendedBlockStorage var6 = this.storageArrays[par3 >> 4]; - - if (var6 == null) -@@ -750,7 +797,7 @@ - */ - public int getBlockLightValue(int par1, int par2, int par3, int par4) - { -- ExtendedBlockStorage var5 = this.storageArrays[par2 >> 4]; -+ ExtendedBlockStorage var5 = (par2 >> 4 >= storageArrays.length || par2 >> 4 < 0 ? null : storageArrays[par2 >> 4]); - - if (var5 == null) - { -@@ -852,34 +899,33 @@ - { - ChunkPosition var4 = new ChunkPosition(par1, par2, par3); - TileEntity var5 = (TileEntity)this.chunkTileEntityMap.get(var4); -+ -+ if (var5 != null && var5.isInvalid()) -+ { -+ chunkTileEntityMap.remove(var4); -+ var5 = null; -+ } - - if (var5 == null) - { - int var6 = this.getBlockID(par1, par2, par3); -- -- if (var6 <= 0 || !Block.blocksList[var6].hasTileEntity()) -+ int meta = getBlockMetadata(par1, par2, par3); -+ -+ if (var6 <= 0 || Block.blocksList[var6] == null || !Block.blocksList[var6].hasTileEntity(meta)) - { - return null; - } - - if (var5 == null) - { -- var5 = ((BlockContainer)Block.blocksList[var6]).getBlockEntity(); -+ var5 = Block.blocksList[var6].getTileEntity(meta); - this.worldObj.setBlockTileEntity(this.xPosition * 16 + par1, par2, this.zPosition * 16 + par3, var5); - } - - var5 = (TileEntity)this.chunkTileEntityMap.get(var4); - } - -- if (var5 != null && var5.isInvalid()) -- { -- this.chunkTileEntityMap.remove(var4); -- return null; -- } -- else -- { -- return var5; -- } -+ return var5; - } - - /** -@@ -894,7 +940,7 @@ - - if (this.isChunkLoaded) - { -- this.worldObj.loadedTileEntityList.add(par1TileEntity); -+ this.worldObj.addTileEntity(par1TileEntity); - } - } - -@@ -909,8 +955,14 @@ - par4TileEntity.yCoord = par2; - par4TileEntity.zCoord = this.zPosition * 16 + par3; - -- if (this.getBlockID(par1, par2, par3) != 0 && Block.blocksList[this.getBlockID(par1, par2, par3)] instanceof BlockContainer) -+ int id = getBlockID(par1, par2, par3); -+ if (id > 0 && Block.blocksList[id] != null && Block.blocksList[id].hasTileEntity(getBlockMetadata(par1, par2, par3))) - { -+ TileEntity old = (TileEntity)chunkTileEntityMap.get(var5); -+ if (old != null) -+ { -+ old.invalidate(); -+ } - par4TileEntity.validate(); - this.chunkTileEntityMap.put(var5, par4TileEntity); - } -@@ -946,6 +998,7 @@ - { - this.worldObj.addLoadedEntities(this.entityLists[var1]); - } -+ ForgeHooks.onChunkLoad(worldObj, this); - } - - /** -@@ -966,6 +1019,7 @@ - { - this.worldObj.unloadEntities(this.entityLists[var3]); - } -+ ForgeHooks.onChunkUnload(worldObj, this); - } - - /** -@@ -982,8 +1036,8 @@ - */ - public void getEntitiesWithinAABBForEntity(Entity par1Entity, AxisAlignedBB par2AxisAlignedBB, List par3List) - { -- int var4 = MathHelper.floor_double((par2AxisAlignedBB.minY - 2.0D) / 16.0D); -- int var5 = MathHelper.floor_double((par2AxisAlignedBB.maxY + 2.0D) / 16.0D); -+ int var4 = MathHelper.floor_double((par2AxisAlignedBB.minY - World.MAX_ENTITY_RADIUS) / 16.0D); -+ int var5 = MathHelper.floor_double((par2AxisAlignedBB.maxY + World.MAX_ENTITY_RADIUS) / 16.0D); - - if (var4 < 0) - { -@@ -1030,8 +1084,8 @@ - */ - public void getEntitiesOfTypeWithinAAAB(Class par1Class, AxisAlignedBB par2AxisAlignedBB, List par3List) - { -- int var4 = MathHelper.floor_double((par2AxisAlignedBB.minY - 2.0D) / 16.0D); -- int var5 = MathHelper.floor_double((par2AxisAlignedBB.maxY + 2.0D) / 16.0D); -+ int var4 = MathHelper.floor_double((par2AxisAlignedBB.minY - World.MAX_ENTITY_RADIUS) / 16.0D); -+ int var5 = MathHelper.floor_double((par2AxisAlignedBB.maxY + World.MAX_ENTITY_RADIUS) / 16.0D); - - if (var4 < 0) - { -@@ -1228,6 +1282,16 @@ - - public void func_48494_a(byte[] par1ArrayOfByte, int par2, int par3, boolean par4) - { -+ -+ Iterator iterator = chunkTileEntityMap.values().iterator(); -+ while(iterator.hasNext()) -+ { -+ TileEntity tileEntity = (TileEntity)iterator.next(); -+ tileEntity.updateContainingBlockInfo(); -+ tileEntity.getBlockMetadata(); -+ tileEntity.getBlockType(); -+ } -+ - int var5 = 0; - int var6; - -@@ -1324,12 +1388,26 @@ - } - - this.generateHeightMap(); -- Iterator var10 = this.chunkTileEntityMap.values().iterator(); -- -- while (var10.hasNext()) -+ -+ List invalidList = new ArrayList(); -+ iterator = chunkTileEntityMap.values().iterator(); -+ while (iterator.hasNext()) -+ { -+ TileEntity tileEntity = (TileEntity)iterator.next(); -+ int x = tileEntity.xCoord & 15; -+ int y = tileEntity.yCoord; -+ int z = tileEntity.zCoord & 15; -+ Block block = tileEntity.getBlockType(); -+ if (block == null || block.blockID != getBlockID(x, y, z) || tileEntity.getBlockMetadata() != getBlockMetadata(x, y, z)) -+ { -+ invalidList.add(tileEntity); -+ } -+ tileEntity.updateContainingBlockInfo(); -+ } -+ -+ for (TileEntity tileEntity : invalidList) - { -- TileEntity var9 = (TileEntity)var10.next(); -- var9.updateContainingBlockInfo(); -+ tileEntity.invalidate(); - } - } - -@@ -1438,4 +1516,18 @@ - } - } - } -+ -+ /** FORGE: Used to remove only invalid TileEntities */ -+ public void cleanChunkBlockTileEntity(int x, int y, int z) -+ { -+ ChunkPosition position = new ChunkPosition(x, y, z); -+ if (isChunkLoaded) -+ { -+ TileEntity entity = (TileEntity)chunkTileEntityMap.get(position); -+ if (entity != null && entity.isInvalid()) -+ { -+ chunkTileEntityMap.remove(position); -+ } -+ } -+ } - } diff --git a/patches/minecraft/net/minecraft/src/ChunkProvider.java.patch b/patches/minecraft/net/minecraft/src/ChunkProvider.java.patch deleted file mode 100644 index 719674ca3..000000000 --- a/patches/minecraft/net/minecraft/src/ChunkProvider.java.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ChunkProvider.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ChunkProvider.java 0000-00-00 00:00:00.000000000 -0000 -@@ -8,6 +8,8 @@ - - import cpw.mods.fml.client.FMLClientHandler; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ChunkProvider implements IChunkProvider - { - /** A set of dropped chunks. Currently not used in single player. */ -@@ -53,6 +55,11 @@ - */ - public void dropChunk(int par1, int par2) - { -+ if(!ForgeHooks.canUnloadChunk(worldObj.getChunkFromChunkCoords(par1, par2))) -+ { -+ return; -+ } -+ - ChunkCoordinates var3 = this.worldObj.getSpawnPoint(); - int var4 = par1 * 16 + 8 - var3.posX; - int var5 = par2 * 16 + 8 - var3.posZ; diff --git a/patches/minecraft/net/minecraft/src/ContainerCreative.java.patch b/patches/minecraft/net/minecraft/src/ContainerCreative.java.patch deleted file mode 100644 index cec26e26b..000000000 --- a/patches/minecraft/net/minecraft/src/ContainerCreative.java.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ContainerCreative.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ContainerCreative.java 0000-00-00 00:00:00.000000000 -0000 -@@ -68,17 +68,20 @@ - this.itemList.add(new ItemStack(var2[var12], 1, var13)); - } - -- for (var12 = 256; var12 < Item.itemsList.length; ++var12) -+ for (Block block : Block.blocksList) - { -- if (Item.itemsList[var12] != null && Item.itemsList[var12].shiftedIndex != Item.potion.shiftedIndex && Item.itemsList[var12].shiftedIndex != Item.monsterPlacer.shiftedIndex) -+ if (block != null) - { -- this.itemList.add(new ItemStack(Item.itemsList[var12])); -+ block.addCreativeItems((ArrayList)itemList); - } - } -- -- for (var12 = 1; var12 < 16; ++var12) -+ -+ for (Item item : Item.itemsList) - { -- this.itemList.add(new ItemStack(Item.dyePowder.shiftedIndex, 1, var12)); -+ if (item != null && !(item instanceof ItemBlock)) -+ { -+ item.addCreativeItems((ArrayList)itemList); -+ } - } - - Iterator var15 = EntityList.entityEggs.keySet().iterator(); diff --git a/patches/minecraft/net/minecraft/src/ContainerFurnace.java.patch b/patches/minecraft/net/minecraft/src/ContainerFurnace.java.patch deleted file mode 100644 index e5c448f45..000000000 --- a/patches/minecraft/net/minecraft/src/ContainerFurnace.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ContainerFurnace.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ContainerFurnace.java 0000-00-00 00:00:00.000000000 -0000 -@@ -108,7 +108,7 @@ - } - else if (par1 != 1 && par1 != 0) - { -- if (FurnaceRecipes.smelting().getSmeltingResult(var4.getItem().shiftedIndex) != null) -+ if (FurnaceRecipes.smelting().getSmeltingResult(var4) != null) - { - if (!this.mergeItemStack(var4, 0, 1, false)) - { diff --git a/patches/minecraft/net/minecraft/src/CraftingManager.java.patch b/patches/minecraft/net/minecraft/src/CraftingManager.java.patch deleted file mode 100644 index 79d6c843b..000000000 --- a/patches/minecraft/net/minecraft/src/CraftingManager.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/CraftingManager.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/CraftingManager.java 0000-00-00 00:00:00.000000000 -0000 -@@ -242,7 +242,7 @@ - } - } - -- if (var2 == 2 && var3.itemID == var4.itemID && var3.stackSize == 1 && var4.stackSize == 1 && Item.itemsList[var3.itemID].isDamageable()) -+ if (var2 == 2 && var3.itemID == var4.itemID && var3.stackSize == 1 && var4.stackSize == 1 && Item.itemsList[var3.itemID].isRepairable()) - { - Item var11 = Item.itemsList[var3.itemID]; - int var10 = var11.getMaxDamage() - var3.getItemDamageForDisplay(); diff --git a/patches/minecraft/net/minecraft/src/EffectRenderer.java.patch b/patches/minecraft/net/minecraft/src/EffectRenderer.java.patch deleted file mode 100644 index 1e562af33..000000000 --- a/patches/minecraft/net/minecraft/src/EffectRenderer.java.patch +++ /dev/null @@ -1,149 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EffectRenderer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EffectRenderer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,10 +1,14 @@ - package net.minecraft.src; - - import java.util.ArrayList; -+import java.util.Hashtable; - import java.util.List; -+import java.util.Map.Entry; - import java.util.Random; - import org.lwjgl.opengl.GL11; - -+import net.minecraft.src.forge.*; -+ - public class EffectRenderer - { - /** Reference to the World object. */ -@@ -15,6 +19,8 @@ - /** RNG. */ - private Random rand = new Random(); - -+ private Hashtable> effectList = new Hashtable>(); -+ - public EffectRenderer(World par1World, RenderEngine par2RenderEngine) - { - if (par1World != null) -@@ -57,6 +63,24 @@ - } - } - } -+ -+ for (String key : effectList.keySet()) -+ { -+ ArrayList entry = effectList.get(key); -+ for (int y = 0; y < entry.size(); y++) -+ { -+ EntityFX var3 = entry.get(y); -+ var3.onUpdate(); -+ if (var3.isDead) -+ { -+ entry.remove(y--); -+ } -+ } -+ if (effectList.size() == 0) -+ { -+ effectList.remove(key); -+ } -+ } - } - - /** -@@ -109,6 +133,23 @@ - var10.draw(); - } - } -+ -+ Tessellator tessallator = Tessellator.instance; -+ -+ for (Entry> entry : effectList.entrySet()) -+ { -+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, renderer.getTexture(entry.getKey())); -+ tessallator.startDrawingQuads(); -+ for (EntityFX entryfx : entry.getValue()) -+ { -+ if (entryfx.getFXLayer() != 3) -+ { -+ tessallator.setBrightness(entryfx.getBrightnessForRender(par2)); -+ entryfx.renderParticle(tessallator, par2, var3, var7, var4, var5, var6); -+ } -+ } -+ tessallator.draw(); -+ } - } - - public void func_1187_b(Entity par1Entity, float par2) -@@ -141,6 +182,12 @@ - { - this.fxLayers[var2].clear(); - } -+ -+ for (ArrayList entry : effectList.values()) -+ { -+ entry.clear(); -+ } -+ effectList.clear(); - } - - public void addBlockDestroyEffects(int par1, int par2, int par3, int par4, int par5) -@@ -160,7 +207,7 @@ - double var13 = (double)par2 + ((double)var9 + 0.5D) / (double)var7; - double var15 = (double)par3 + ((double)var10 + 0.5D) / (double)var7; - int var17 = this.rand.nextInt(6); -- this.addEffect((new EntityDiggingFX(this.worldObj, var11, var13, var15, var11 - (double)par1 - 0.5D, var13 - (double)par2 - 0.5D, var15 - (double)par3 - 0.5D, var6, var17, par5)).func_4041_a(par1, par2, par3)); -+ this.addEffect((new EntityDiggingFX(this.worldObj, var11, var13, var15, var11 - (double)par1 - 0.5D, var13 - (double)par2 - 0.5D, var15 - (double)par3 - 0.5D, var6, var17, par5)).func_4041_a(par1, par2, par3), var6); - } - } - } -@@ -212,12 +259,49 @@ - var8 = (double)par1 + var6.maxX + (double)var7; - } - -- this.addEffect((new EntityDiggingFX(this.worldObj, var8, var10, var12, 0.0D, 0.0D, 0.0D, var6, par4, this.worldObj.getBlockMetadata(par1, par2, par3))).func_4041_a(par1, par2, par3).multiplyVelocity(0.2F).func_405_d(0.6F)); -+ this.addEffect((new EntityDiggingFX(this.worldObj, var8, var10, var12, 0.0D, 0.0D, 0.0D, var6, par4, this.worldObj.getBlockMetadata(par1, par2, par3))).func_4041_a(par1, par2, par3).multiplyVelocity(0.2F).func_405_d(0.6F), var6); - } - } - - public String getStatistics() - { -- return "" + (this.fxLayers[0].size() + this.fxLayers[1].size() + this.fxLayers[2].size()); -+ int size = 0; -+ for (List x : fxLayers) -+ { -+ size += x.size(); -+ } -+ for (ArrayList entry : effectList.values()) -+ { -+ size += entry.size(); -+ } -+ return Integer.toString(size); -+ } -+ -+ public void addEffect(EntityFX effect, Object effectObject) -+ { -+ if (effectObject == null || !(effect instanceof EntityDiggingFX || effect instanceof EntityBreakingFX)) -+ { -+ addEffect(effect); -+ return; -+ } -+ -+ String texture = "/terrain.png"; -+ if (effect.getFXLayer() == 0) -+ { -+ texture = "/particles.png"; -+ } -+ else if (effect.getFXLayer() == 2) -+ { -+ texture = "/gui/items.png"; -+ } -+ texture = ForgeHooksClient.getTexture(texture, effectObject); -+ -+ ArrayList set = effectList.get(texture); -+ if (set == null) -+ { -+ set = new ArrayList(); -+ effectList.put(texture, set); -+ } -+ set.add(effect); - } - } diff --git a/patches/minecraft/net/minecraft/src/Enchantment.java.patch b/patches/minecraft/net/minecraft/src/Enchantment.java.patch deleted file mode 100644 index 4b9d4dfad..000000000 --- a/patches/minecraft/net/minecraft/src/Enchantment.java.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/Enchantment.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/Enchantment.java 0000-00-00 00:00:00.000000000 -0000 -@@ -191,4 +191,14 @@ - String var2 = StatCollector.translateToLocal(this.getName()); - return var2 + " " + StatCollector.translateToLocal("enchantment.level." + par1); - } -+ -+ /** -+ * Called to determine if this enchantment can be applied to a ItemStack -+ * @param item The ItemStack that the enchantment might be put on -+ * @return True if the item is valid, false otherwise -+ */ -+ public boolean canEnchantItem(ItemStack item) -+ { -+ return type.canEnchantItem(item.getItem()); -+ } - } diff --git a/patches/minecraft/net/minecraft/src/EnchantmentHelper.java.patch b/patches/minecraft/net/minecraft/src/EnchantmentHelper.java.patch deleted file mode 100644 index c5b228dfa..000000000 --- a/patches/minecraft/net/minecraft/src/EnchantmentHelper.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EnchantmentHelper.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EnchantmentHelper.java 0000-00-00 00:00:00.000000000 -0000 -@@ -357,7 +357,7 @@ - { - Enchantment var7 = var4[var6]; - -- if (var7 != null && var7.type.canEnchantItem(var2)) -+ if (var7 != null && var7.canEnchantItem(par1ItemStack)) - { - for (int var8 = var7.getMinLevel(); var8 <= var7.getMaxLevel(); ++var8) - { diff --git a/patches/minecraft/net/minecraft/src/Entity.java.patch b/patches/minecraft/net/minecraft/src/Entity.java.patch deleted file mode 100644 index d5636f99c..000000000 --- a/patches/minecraft/net/minecraft/src/Entity.java.patch +++ /dev/null @@ -1,98 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/Entity.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/Entity.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,6 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.List; - import java.util.Random; - -@@ -173,6 +174,11 @@ - */ - public boolean ignoreFrustumCheck; - public boolean isAirBorne; -+ -+ /** Forge: Used to store custom data for each entity. */ -+ private NBTTagCompound customEntityData; -+ protected boolean captureDrops = false; -+ protected ArrayList capturedDrops = new ArrayList(); - - public Entity(World par1World) - { -@@ -214,6 +220,29 @@ - } - - protected abstract void entityInit(); -+ -+ /** -+ * Returns a NBTTagCompound that can be used to store custom data for this entity. -+ * It will be written, and read from disc, so it persists over world saves. -+ * @return A NBTTagCompound -+ */ -+ public NBTTagCompound getEntityData() -+ { -+ if (customEntityData == null) -+ { -+ customEntityData = new NBTTagCompound(); -+ } -+ return customEntityData; -+ } -+ -+ /** -+ * Used in model rendering to determine if the entity riding this entity should be in the 'sitting' position. -+ * @return false to prevent an entity that is mounted to this entity from displaying the 'sitting' animation. -+ */ -+ public boolean shouldRiderSit() -+ { -+ return true; -+ } - - public DataWatcher getDataWatcher() - { -@@ -1318,6 +1347,10 @@ - par1NBTTagCompound.setShort("Fire", (short)this.fire); - par1NBTTagCompound.setShort("Air", (short)this.getAir()); - par1NBTTagCompound.setBoolean("OnGround", this.onGround); -+ if (customEntityData != null) -+ { -+ par1NBTTagCompound.setCompoundTag("ForgeData", customEntityData); -+ } - this.writeEntityToNBT(par1NBTTagCompound); - } - -@@ -1359,6 +1392,10 @@ - this.onGround = par1NBTTagCompound.getBoolean("OnGround"); - this.setPosition(this.posX, this.posY, this.posZ); - this.setRotation(this.rotationYaw, this.rotationPitch); -+ if (par1NBTTagCompound.hasKey("ForgeData")) -+ { -+ customEntityData = par1NBTTagCompound.getCompoundTag("ForgeData"); -+ } - this.readEntityFromNBT(par1NBTTagCompound); - } - -@@ -1444,7 +1481,14 @@ - { - EntityItem var3 = new EntityItem(this.worldObj, this.posX, this.posY + (double)par2, this.posZ, par1ItemStack); - var3.delayBeforeCanPickup = 10; -- this.worldObj.spawnEntityInWorld(var3); -+ if (captureDrops) -+ { -+ capturedDrops.add(var3); -+ } -+ else -+ { -+ this.worldObj.spawnEntityInWorld(var3); -+ } - return var3; - } - -@@ -1717,7 +1761,7 @@ - */ - public boolean isRiding() - { -- return this.ridingEntity != null || this.getFlag(2); -+ return (this.ridingEntity != null && ridingEntity.shouldRiderSit()) || this.getFlag(2); - } - - /** diff --git a/patches/minecraft/net/minecraft/src/EntityEnderman.java.patch b/patches/minecraft/net/minecraft/src/EntityEnderman.java.patch deleted file mode 100644 index 707208bf2..000000000 --- a/patches/minecraft/net/minecraft/src/EntityEnderman.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EntityEnderman.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EntityEnderman.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,7 +2,7 @@ - - public class EntityEnderman extends EntityMob - { -- private static boolean[] canCarryBlocks = new boolean[256]; -+ private static boolean[] canCarryBlocks = new boolean[Block.blocksList.length]; - - /** Is the enderman attacking another entity? */ - public boolean isAttacking = false; diff --git a/patches/minecraft/net/minecraft/src/EntityItem.java.patch b/patches/minecraft/net/minecraft/src/EntityItem.java.patch deleted file mode 100644 index 913137303..000000000 --- a/patches/minecraft/net/minecraft/src/EntityItem.java.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EntityItem.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EntityItem.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,8 @@ - - import cpw.mods.fml.client.FMLClientHandler; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class EntityItem extends Entity - { - /** The item stack of this EntityItem. */ -@@ -172,7 +174,21 @@ - if (!this.worldObj.isRemote) - { - int var2 = this.item.stackSize; -- -+ -+ if (delayBeforeCanPickup == 0 && !ForgeHooks.onItemPickup(par1EntityPlayer, this)) -+ { -+ FMLClientHandler.instance().notifyItemPickup(this, par1EntityPlayer); -+ this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((rand.nextFloat() - rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); -+ par1EntityPlayer.onItemPickup(this, var2); -+ if (item.stackSize <= 0) -+ { -+ setDead(); -+ } -+ return; -+ } -+ -+ var2 = item.stackSize; -+ - if (this.delayBeforeCanPickup == 0 && par1EntityPlayer.inventory.addItemStackToInventory(this.item)) - { - FMLClientHandler.instance().notifyItemPickup(this, par1EntityPlayer); diff --git a/patches/minecraft/net/minecraft/src/EntityLiving.java.patch b/patches/minecraft/net/minecraft/src/EntityLiving.java.patch deleted file mode 100644 index aac2f39b6..000000000 --- a/patches/minecraft/net/minecraft/src/EntityLiving.java.patch +++ /dev/null @@ -1,150 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EntityLiving.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EntityLiving.java 0000-00-00 00:00:00.000000000 -0000 -@@ -6,6 +6,8 @@ - import java.util.List; - import java.util.Random; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public abstract class EntityLiving extends Entity - { - public int heartsHalvesLife = 20; -@@ -59,7 +61,7 @@ - * in each step in the damage calculations, this is set to the 'carryover' that would result if someone was damaged - * .25 hearts (for example), and added to the damage in the next step - */ -- protected int carryoverDamage; -+ public int carryoverDamage; - - /** Number of ticks since this EntityLiving last produced its sound */ - private int livingSoundTime; -@@ -303,6 +305,7 @@ - public void setAttackTarget(EntityLiving par1EntityLiving) - { - this.attackTarget = par1EntityLiving; -+ ForgeHooks.onEntityLivingSetAttackTarget(this, par1EntityLiving); - } - - public boolean func_48100_a(Class par1Class) -@@ -359,6 +362,7 @@ - { - this.entityLivingToAttack = par1EntityLiving; - this.revengeTimer = this.entityLivingToAttack != null ? 60 : 0; -+ ForgeHooks.onEntityLivingSetAttackTarget(this, par1EntityLiving); - } - - protected void entityInit() -@@ -641,7 +645,12 @@ - * Called to update the entity's position/logic. - */ - public void onUpdate() -- { -+ { -+ if (ForgeHooks.onEntityLivingUpdate(this)) -+ { -+ return; -+ } -+ - super.onUpdate(); - - if (this.arrowHitTempCounter > 0) -@@ -834,6 +843,11 @@ - */ - public boolean attackEntityFrom(DamageSource par1DamageSource, int par2) - { -+ if (ForgeHooks.onEntityLivingAttacked(this, par1DamageSource, par2)) -+ { -+ return false; -+ } -+ - if (this.worldObj.isRemote) - { - return false; -@@ -1012,6 +1026,12 @@ - */ - protected void damageEntity(DamageSource par1DamageSource, int par2) - { -+ par2 = ForgeHooks.onEntityLivingHurt(this, par1DamageSource, par2); -+ if (par2 == 0) -+ { -+ return; -+ } -+ - par2 = this.applyArmorCalculations(par1DamageSource, par2); - par2 = this.applyPotionDamageCalculations(par1DamageSource, par2); - this.health -= par2; -@@ -1075,6 +1095,11 @@ - */ - public void onDeath(DamageSource par1DamageSource) - { -+ if (ForgeHooks.onEntityLivingDeath(this, par1DamageSource)) -+ { -+ return; -+ } -+ - Entity var2 = par1DamageSource.getEntity(); - - if (this.scoreValue >= 0 && var2 != null) -@@ -1098,13 +1123,17 @@ - var3 = EnchantmentHelper.getLootingModifier(((EntityPlayer)var2).inventory); - } - -+ captureDrops = true; -+ capturedDrops.clear(); -+ int var4 = 0; -+ - if (!this.isChild()) - { - this.dropFewItems(this.recentlyHit > 0, var3); - - if (this.recentlyHit > 0) - { -- int var4 = this.rand.nextInt(200) - var3; -+ var4 = this.rand.nextInt(200) - var3; - - if (var4 < 5) - { -@@ -1112,6 +1141,13 @@ - } - } - } -+ -+ captureDrops = false; -+ ForgeHooks.onEntityLivingDrops(this, par1DamageSource, capturedDrops, var3, recentlyHit > 0, var4); -+ for (EntityItem item : capturedDrops) -+ { -+ worldObj.spawnEntityInWorld(item); -+ } - } - - this.worldObj.setEntityState(this, (byte)3); -@@ -1155,6 +1191,11 @@ - */ - protected void fall(float par1) - { -+ if (ForgeHooks.onEntityLivingFall(this, par1)) -+ { -+ return; -+ } -+ - super.fall(par1); - int var2 = (int)Math.ceil((double)(par1 - 3.0F)); - -@@ -1342,7 +1383,7 @@ - int var2 = MathHelper.floor_double(this.boundingBox.minY); - int var3 = MathHelper.floor_double(this.posZ); - int var4 = this.worldObj.getBlockId(var1, var2, var3); -- return var4 == Block.ladder.blockID || var4 == Block.vine.blockID; -+ return Block.blocksList[var4] != null && Block.blocksList[var4].isLadder(worldObj, var1, var2, var3); - } - - /** -@@ -1613,6 +1654,8 @@ - } - - this.isAirBorne = true; -+ -+ ForgeHooks.onEntityLivingJump(this); - } - - /** diff --git a/patches/minecraft/net/minecraft/src/EntityMinecart.java.patch b/patches/minecraft/net/minecraft/src/EntityMinecart.java.patch deleted file mode 100644 index 97b0b58c1..000000000 --- a/patches/minecraft/net/minecraft/src/EntityMinecart.java.patch +++ /dev/null @@ -1,975 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EntityMinecart.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EntityMinecart.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,30 +1,50 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.List; - -+import net.minecraft.src.forge.*; -+ - public class EntityMinecart extends Entity implements IInventory - { - /** Array of item stacks stored in minecart (for storage minecarts). */ -- private ItemStack[] cargoItems; -- private int fuel; -- private boolean field_856_i; -+ protected ItemStack[] cargoItems; -+ protected int fuel; -+ protected boolean field_856_i; - - /** The type of minecart, 2 for powered, 1 for storage. */ - public int minecartType; - public double pushX; - public double pushZ; -- private static final int[][][] field_855_j = 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}}}; -+ protected static final int[][][] field_855_j = 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}}}; - - /** appears to be the progress of the turn */ -- private int turnProgress; -- private double minecartX; -- private double minecartY; -- private double minecartZ; -- private double minecartYaw; -- private double minecartPitch; -- private double velocityX; -- private double velocityY; -- private double velocityZ; -+ protected int turnProgress; -+ protected double minecartX; -+ protected double minecartY; -+ protected double minecartZ; -+ protected double minecartYaw; -+ protected double minecartPitch; -+ protected double velocityX; -+ protected double velocityY; -+ protected double velocityZ; -+ -+ /* Forge: Minecart Compatibility Layer Integration. */ -+ public static float defaultMaxSpeedRail = 0.4f; -+ public static float defaultMaxSpeedGround = 0.4f; -+ public static float defaultMaxSpeedAirLateral = 0.4f; -+ public static float defaultMaxSpeedAirVertical = -1f; -+ public static double defaultDragAir = 0.94999998807907104D; -+ protected boolean canUseRail = true; -+ protected boolean canBePushed = true; -+ private static IMinecartCollisionHandler collisionHandler = null; -+ -+ /* Instance versions of the above physics properties */ -+ protected float maxSpeedRail; -+ protected float maxSpeedGround; -+ protected float maxSpeedAirLateral; -+ protected float maxSpeedAirVertical; -+ protected double dragAir; - - public EntityMinecart(World par1World) - { -@@ -35,6 +55,18 @@ - this.preventEntitySpawning = true; - this.setSize(0.98F, 0.7F); - this.yOffset = this.height / 2.0F; -+ -+ maxSpeedRail = defaultMaxSpeedRail; -+ maxSpeedGround = defaultMaxSpeedGround; -+ maxSpeedAirLateral = defaultMaxSpeedAirLateral; -+ maxSpeedAirVertical = defaultMaxSpeedAirVertical; -+ dragAir = defaultDragAir; -+ } -+ -+ public EntityMinecart(World world, int type) -+ { -+ this(world); -+ minecartType = type; - } - - /** -@@ -60,6 +92,10 @@ - */ - public AxisAlignedBB getCollisionBox(Entity par1Entity) - { -+ if (getCollisionHandler() != null) -+ { -+ return getCollisionHandler().getCollisionBox(this, par1Entity); -+ } - return par1Entity.boundingBox; - } - -@@ -68,6 +104,10 @@ - */ - public AxisAlignedBB getBoundingBox() - { -+ if (getCollisionHandler() != null) -+ { -+ return getCollisionHandler().getBoundingBox(this); -+ } - return null; - } - -@@ -76,7 +116,7 @@ - */ - public boolean canBePushed() - { -- return true; -+ return canBePushed; - } - - public EntityMinecart(World par1World, double par2, double par4, double par6, int par8) -@@ -120,48 +160,7 @@ - } - - this.setDead(); -- 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.spawnEntityInWorld(var10); -- } -- } -- } -- -- this.dropItemWithOffset(Block.chest.blockID, 1, 0.0F); -- } -- else if (this.minecartType == 2) -- { -- this.dropItemWithOffset(Block.stoneOvenIdle.blockID, 1, 0.0F); -- } -+ dropCartAsItem(); - } - - return true; -@@ -254,7 +253,7 @@ - this.kill(); - } - -- if (this.isMinecartPowered() && this.rand.nextInt(4) == 0) -+ if (this.isMinecartPowered() && this.rand.nextInt(4) == 0 && minecartType == 2 && getClass() == EntityMinecart.class) - { - this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.8D, this.posZ, 0.0D, 0.0D, 0.0D); - } -@@ -309,49 +308,26 @@ - double var6 = 0.0078125D; - int var8 = this.worldObj.getBlockId(var1, var2, var3); - -- if (BlockRail.isRailBlock(var8)) -+ if (canUseRail() && BlockRail.isRailBlock(var8)) - { - Vec3D var9 = this.func_514_g(this.posX, this.posY, this.posZ); -- int var10 = this.worldObj.getBlockMetadata(var1, var2, var3); -+ int var10 = ((BlockRail)Block.blocksList[var8]).getBasicRailMetadata(worldObj, this, var1, var2, var3); - this.posY = (double)var2; - boolean var11 = false; - boolean var12 = false; - - if (var8 == Block.railPowered.blockID) - { -- var11 = (var10 & 8) != 0; -+ var11 = (worldObj.getBlockMetadata(var1, var2, var3) & 8) != 0; - var12 = !var11; - } - -- if (((BlockRail)Block.blocksList[var8]).isPowered()) -- { -- var10 &= 7; -- } -- - if (var10 >= 2 && var10 <= 5) - { - this.posY = (double)(var2 + 1); - } -- -- if (var10 == 2) -- { -- this.motionX -= var6; -- } -- -- if (var10 == 3) -- { -- this.motionX += var6; -- } -- -- if (var10 == 4) -- { -- this.motionZ += var6; -- } -- -- if (var10 == 5) -- { -- this.motionZ -= var6; -- } -+ -+ adjustSlopeVelocities(var10); - - int[][] var13 = field_855_j[var10]; - double var14 = (double)(var13[1][0] - var13[0][0]); -@@ -370,7 +346,7 @@ - this.motionZ = var22 * var16 / var18; - double var24; - -- if (var12) -+ if (var12 && shouldDoRailFunctions()) - { - var24 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); - -@@ -420,36 +396,8 @@ - this.posX = var26 + var14 * var24; - this.posZ = var28 + var16 * var24; - this.setPosition(this.posX, this.posY + (double)this.yOffset, this.posZ); -- var34 = this.motionX; -- var36 = this.motionZ; -- -- if (this.riddenByEntity != null) -- { -- var34 *= 0.75D; -- var36 *= 0.75D; -- } -- -- if (var34 < -var4) -- { -- var34 = -var4; -- } -- -- if (var34 > var4) -- { -- var34 = var4; -- } -- -- if (var36 < -var4) -- { -- var36 = -var4; -- } -- -- if (var36 > var4) -- { -- var36 = var4; -- } -- -- this.moveEntity(var34, 0.0D, var36); -+ -+ moveMinecartOnRail(var1, var2, var3); - - if (var13[0][1] != 0 && MathHelper.floor_double(this.posX) - var1 == var13[0][0] && MathHelper.floor_double(this.posZ) - var3 == var13[0][2]) - { -@@ -460,41 +408,7 @@ - this.setPosition(this.posX, this.posY + (double)var13[1][1], this.posZ); - } - -- if (this.riddenByEntity != null) -- { -- this.motionX *= 0.996999979019165D; -- this.motionY *= 0.0D; -- this.motionZ *= 0.996999979019165D; -- } -- else -- { -- if (this.minecartType == 2) -- { -- var38 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ); -- -- if (var38 > 0.01D) -- { -- this.pushX /= var38; -- this.pushZ /= var38; -- double var40 = 0.04D; -- this.motionX *= 0.800000011920929D; -- this.motionY *= 0.0D; -- this.motionZ *= 0.800000011920929D; -- this.motionX += this.pushX * var40; -- this.motionZ += this.pushZ * var40; -- } -- else -- { -- this.motionX *= 0.8999999761581421D; -- this.motionY *= 0.0D; -- this.motionZ *= 0.8999999761581421D; -- } -- } -- -- this.motionX *= 0.9599999785423279D; -- this.motionY *= 0.0D; -- this.motionZ *= 0.9599999785423279D; -- } -+ applyDragAndPushForces(); - - Vec3D var52 = this.func_514_g(this.posX, this.posY, this.posZ); - -@@ -523,30 +437,15 @@ - } - - double var41; -- -- if (this.minecartType == 2) -+ -+ updatePushForces(); -+ -+ if(shouldDoRailFunctions()) - { -- var41 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ); -- -- if (var41 > 0.01D && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.001D) -- { -- this.pushX /= var41; -- this.pushZ /= var41; -- -- 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; -- } -- } -+ ((BlockRail)Block.blocksList[var8]).onMinecartPass(worldObj, this, var1, var2, var3); - } - -- if (var11) -+ if (var11 && shouldDoRailFunctions()) - { - var41 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); - -@@ -582,41 +481,7 @@ - } - 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 *= 0.949999988079071D; -- this.motionY *= 0.949999988079071D; -- this.motionZ *= 0.949999988079071D; -- } -+ moveMinecartOffRail(var1, var2, var3); - } - - this.rotationPitch = 0.0F; -@@ -652,7 +517,18 @@ - } - - this.setRotation(this.rotationYaw, this.rotationPitch); -- List var15 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); -+ -+ AxisAlignedBB box = null; -+ if (getCollisionHandler() != null) -+ { -+ box = getCollisionHandler().getMinecartCollisionBox(this); -+ } -+ else -+ { -+ box = boundingBox.expand(0.2D, 0.0D, 0.2D); -+ } -+ -+ List var15 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, box); - - if (var15 != null && var15.size() > 0) - { -@@ -677,17 +553,8 @@ - this.riddenByEntity = null; - } - -- if (this.fuel > 0) -- { -- --this.fuel; -- } -- -- if (this.fuel <= 0) -- { -- this.pushX = this.pushZ = 0.0D; -- } -- -- this.setMinecartPowered(this.fuel > 0); -+ updateFuel(); -+ ForgeHooks.onMinecartUpdate(this, var1, var2, var3); - } - } - -@@ -710,12 +577,7 @@ - } - else - { -- int var13 = this.worldObj.getBlockMetadata(var9, var10, var11); -- -- if (((BlockRail)Block.blocksList[var12]).isPowered()) -- { -- var13 &= 7; -- } -+ int var13 = ((BlockRail)Block.blocksList[var12]).getBasicRailMetadata(worldObj, this, var9, var10, var11); - - par3 = (double)var10; - -@@ -761,14 +623,9 @@ - - if (BlockRail.isRailBlock(var10)) - { -- int var11 = this.worldObj.getBlockMetadata(var7, var8, var9); -+ int var11 = ((BlockRail)Block.blocksList[var10]).getBasicRailMetadata(worldObj, this, var7, var8, var9); - par3 = (double)var8; - -- if (((BlockRail)Block.blocksList[var10]).isPowered()) -- { -- var11 &= 7; -- } -- - if (var11 >= 2 && var11 <= 5) - { - par3 = (double)(var8 + 1); -@@ -833,13 +690,14 @@ - { - par1NBTTagCompound.setInteger("Type", this.minecartType); - -- if (this.minecartType == 2) -+ if (isPoweredCart()) - { - par1NBTTagCompound.setDouble("PushX", this.pushX); - par1NBTTagCompound.setDouble("PushZ", this.pushZ); -- par1NBTTagCompound.setShort("Fuel", (short)this.fuel); -+ par1NBTTagCompound.setInteger("Fuel", this.fuel); - } -- else if (this.minecartType == 1) -+ -+ if (getSizeInventory() > 0) - { - NBTTagList var2 = new NBTTagList(); - -@@ -865,13 +723,21 @@ - { - this.minecartType = par1NBTTagCompound.getInteger("Type"); - -- if (this.minecartType == 2) -+ if (isPoweredCart()) - { - this.pushX = par1NBTTagCompound.getDouble("PushX"); - this.pushZ = par1NBTTagCompound.getDouble("PushZ"); -- this.fuel = par1NBTTagCompound.getShort("Fuel"); -+ try -+ { -+ this.fuel = par1NBTTagCompound.getInteger("Fuel"); -+ } -+ catch (ClassCastException e) -+ { -+ this.fuel = par1NBTTagCompound.getShort("Fuel"); -+ } - } -- else if (this.minecartType == 1) -+ -+ if (getSizeInventory() > 0) - { - NBTTagList var2 = par1NBTTagCompound.getTagList("Items"); - this.cargoItems = new ItemStack[this.getSizeInventory()]; -@@ -899,11 +765,18 @@ - */ - public void applyEntityCollision(Entity par1Entity) - { -+ ForgeHooks.onMinecartEntityCollision(this, par1Entity); -+ if (getCollisionHandler() != null) -+ { -+ getCollisionHandler().onEntityCollision(this, par1Entity); -+ return; -+ } -+ - if (!this.worldObj.isRemote) - { - if (par1Entity != this.riddenByEntity) - { -- if (par1Entity instanceof EntityLiving && !(par1Entity instanceof EntityPlayer) && !(par1Entity instanceof EntityIronGolem) && this.minecartType == 0 && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.01D && this.riddenByEntity == null && par1Entity.ridingEntity == null) -+ if (par1Entity instanceof EntityLiving && !(par1Entity instanceof EntityPlayer) && !(par1Entity instanceof EntityIronGolem) && canBeRidden() && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.01D && this.riddenByEntity == null && par1Entity.ridingEntity == null) - { - par1Entity.mountEntity(this); - } -@@ -949,7 +822,7 @@ - double var18 = par1Entity.motionX + this.motionX; - double var20 = par1Entity.motionZ + this.motionZ; - -- if (((EntityMinecart)par1Entity).minecartType == 2 && this.minecartType != 2) -+ if (((EntityMinecart)par1Entity).isPoweredCart() && !isPoweredCart()) - { - this.motionX *= 0.20000000298023224D; - this.motionZ *= 0.20000000298023224D; -@@ -957,7 +830,7 @@ - par1Entity.motionX *= 0.949999988079071D; - par1Entity.motionZ *= 0.949999988079071D; - } -- else if (((EntityMinecart)par1Entity).minecartType != 2 && this.minecartType == 2) -+ else if (!((EntityMinecart)par1Entity).isPoweredCart() && isPoweredCart()) - { - par1Entity.motionX *= 0.20000000298023224D; - par1Entity.motionZ *= 0.20000000298023224D; -@@ -992,7 +865,7 @@ - */ - public int getSizeInventory() - { -- return 27; -+ return (minecartType == 1 && getClass() == EntityMinecart.class ? 27 : 0); - } - - /** -@@ -1095,7 +968,12 @@ - */ - public boolean interact(EntityPlayer par1EntityPlayer) - { -- if (this.minecartType == 0) -+ if (!ForgeHooks.onMinecartInteract(this, par1EntityPlayer)) -+ { -+ return true; -+ } -+ -+ if (canBeRidden()) - { - if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != par1EntityPlayer) - { -@@ -1107,14 +985,14 @@ - par1EntityPlayer.mountEntity(this); - } - } -- else if (this.minecartType == 1) -+ else if (getSizeInventory() > 0) - { - if (!this.worldObj.isRemote) - { - par1EntityPlayer.displayGUIChest(this); - } - } -- else if (this.minecartType == 2) -+ else if (this.minecartType == 2 && getClass() == EntityMinecart.class) - { - ItemStack var2 = par1EntityPlayer.inventory.getCurrentItem(); - -@@ -1173,7 +1051,7 @@ - /** - * Is this minecart powered (Fuel > 0) - */ -- protected boolean isMinecartPowered() -+ public boolean isMinecartPowered() - { - return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0; - } -@@ -1226,4 +1104,373 @@ - { - return this.dataWatcher.getWatchableObjectInt(18); - } -+ -+ /** -+ * Drops the cart as a item. The exact item dropped is defined by getItemDropped(). -+ */ -+ public void dropCartAsItem() -+ { -+ for(ItemStack item : getItemsDropped()) -+ { -+ entityDropItem(item, 0); -+ } -+ } -+ -+ /** -+ * Override this to define which items your cart drops when broken. -+ * This does not include items contained in the inventory, -+ * that is handled elsewhere. -+ * @return A list of items dropped. -+ */ -+ public List getItemsDropped() -+ { -+ List items = new ArrayList(); -+ items.add(new ItemStack(Item.minecartEmpty)); -+ -+ switch(minecartType) -+ { -+ case 1: -+ items.add(new ItemStack(Block.chest)); -+ break; -+ case 2: -+ items.add(new ItemStack(Block.stoneOvenIdle)); -+ break; -+ } -+ return items; -+ } -+ -+ /** -+ * This function returns an ItemStack that represents this cart. -+ * This should be an ItemStack that can be used by the player to place the cart. -+ * This is the item that was registered with the cart via the registerMinecart function, -+ * but is not necessary the item the cart drops when destroyed. -+ * @return An ItemStack that can be used to place the cart. -+ */ -+ public ItemStack getCartItem() -+ { -+ return MinecraftForge.getItemForCart(this); -+ } -+ -+ /** -+ * Returns true if this cart is self propelled. -+ * @return True if powered. -+ */ -+ public boolean isPoweredCart() -+ { -+ return minecartType == 2 && getClass() == EntityMinecart.class; -+ } -+ -+ /** -+ * Returns true if this cart is a storage cart -+ * Some carts may have inventories but not be storage carts -+ * and some carts without inventories may be storage carts. -+ * @return True if this cart should be classified as a storage cart. -+ */ -+ public boolean isStorageCart() -+ { -+ return minecartType == 1 && getClass() == EntityMinecart.class; -+ } -+ -+ /** -+ * Returns true if this cart can be ridden by an Entity. -+ * @return True if this cart can be ridden. -+ */ -+ public boolean canBeRidden() -+ { -+ if(minecartType == 0 && getClass() == EntityMinecart.class) -+ { -+ return true; -+ } -+ return false; -+ } -+ -+ /** -+ * Returns true if this cart can currently use rails. -+ * This function is mainly used to gracefully detach a minecart from a rail. -+ * @return True if the minecart can use rails. -+ */ -+ public boolean canUseRail() -+ { -+ return canUseRail; -+ } -+ -+ /** -+ * Set whether the minecart can use rails. -+ * This function is mainly used to gracefully detach a minecart from a rail. -+ * @param use Whether the minecart can currently use rails. -+ */ -+ public void setCanUseRail(boolean use) -+ { -+ canUseRail = use; -+ } -+ -+ /** -+ * Return false if this cart should not call IRail.onMinecartPass() and should ignore Powered Rails. -+ * @return True if this cart should call IRail.onMinecartPass(). -+ */ -+ public boolean shouldDoRailFunctions() -+ { -+ return true; -+ } -+ -+ /** -+ * Simply returns the minecartType variable. -+ * @return minecartType -+ */ -+ public int getMinecartType() -+ { -+ return minecartType; -+ } -+ -+ /** -+ * Gets the current global Minecart Collision handler if none -+ * is registered, returns null -+ * @return The collision handler or null -+ */ -+ public static IMinecartCollisionHandler getCollisionHandler() -+ { -+ return collisionHandler; -+ } -+ -+ /** -+ * Sets the global Minecart Collision handler, overwrites any -+ * that is currently set. -+ * @param handler The new handler -+ */ -+ public static void setCollisionHandler(IMinecartCollisionHandler handler) -+ { -+ collisionHandler = handler; -+ } -+ -+ /** -+ * Carts should return their drag factor here -+ * @return The drag rate. -+ */ -+ protected double getDrag() -+ { -+ return riddenByEntity != null ? 0.99D : 0.96D; -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code applies drag and updates push forces. -+ */ -+ protected void applyDragAndPushForces() -+ { -+ if(isPoweredCart()) -+ { -+ double d27 = MathHelper.sqrt_double(pushX * pushX + pushZ * pushZ); -+ if(d27 > 0.01D) -+ { -+ pushX /= d27; -+ pushZ /= d27; -+ double d29 = 0.04; -+ motionX *= 0.8D; -+ motionY *= 0.0D; -+ motionZ *= 0.8D; -+ motionX += pushX * d29; -+ motionZ += pushZ * d29; -+ } else -+ { -+ motionX *= 0.9D; -+ motionY *= 0.0D; -+ motionZ *= 0.9D; -+ } -+ } -+ motionX *= getDrag(); -+ motionY *= 0.0D; -+ motionZ *= getDrag(); -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code updates push forces. -+ */ -+ protected void updatePushForces() -+ { -+ if(isPoweredCart()) -+ { -+ double push = MathHelper.sqrt_double(pushX * pushX + pushZ * pushZ); -+ if(push > 0.01D && motionX * motionX + motionZ * motionZ > 0.001D) -+ { -+ pushX /= push; -+ pushZ /= push; -+ if(pushX * motionX + pushZ * motionZ < 0.0D) -+ { -+ pushX = 0.0D; -+ pushZ = 0.0D; -+ } else -+ { -+ pushX = motionX; -+ pushZ = motionZ; -+ } -+ } -+ } -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code handles minecart movement and speed capping when on a rail. -+ */ -+ protected void moveMinecartOnRail(int i, int j, int k) -+ { -+ int id = worldObj.getBlockId(i, j, k); -+ if (!BlockRail.isRailBlock(id)) -+ { -+ return; -+ } -+ float railMaxSpeed = ((BlockRail)Block.blocksList[id]).getRailMaxSpeed(worldObj, this, i, j, k); -+ -+ double maxSpeed = Math.min(railMaxSpeed, getMaxSpeedRail()); -+ double mX = motionX; -+ double mZ = motionZ; -+ if(riddenByEntity != null) -+ { -+ mX *= 0.75D; -+ mZ *= 0.75D; -+ } -+ if(mX < -maxSpeed) mX = -maxSpeed; -+ if(mX > maxSpeed) mX = maxSpeed; -+ if(mZ < -maxSpeed) mZ = -maxSpeed; -+ if(mZ > maxSpeed) mZ = maxSpeed; -+ moveEntity(mX, 0.0D, mZ); -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code handles minecart movement and speed capping when not on a rail. -+ */ -+ protected void moveMinecartOffRail(int i, int j, int k) -+ { -+ double d2 = getMaxSpeedGround(); -+ if(!onGround) -+ { -+ d2 = getMaxSpeedAirLateral(); -+ } -+ if(motionX < -d2) motionX = -d2; -+ if(motionX > d2) motionX = d2; -+ if(motionZ < -d2) motionZ = -d2; -+ if(motionZ > d2) motionZ = d2; -+ double moveY = motionY; -+ if(getMaxSpeedAirVertical() > 0 && motionY > getMaxSpeedAirVertical()) -+ { -+ moveY = getMaxSpeedAirVertical(); -+ if(Math.abs(motionX) < 0.3f && Math.abs(motionZ) < 0.3f) -+ { -+ moveY = 0.15f; -+ motionY = moveY; -+ } -+ } -+ if(onGround) -+ { -+ motionX *= 0.5D; -+ motionY *= 0.5D; -+ motionZ *= 0.5D; -+ } -+ moveEntity(motionX, moveY, motionZ); -+ if(!onGround) -+ { -+ motionX *= getDragAir(); -+ motionY *= getDragAir(); -+ motionZ *= getDragAir(); -+ } -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code applies fuel consumption. -+ */ -+ protected void updateFuel() -+ { -+ if (fuel > 0) fuel--; -+ if (fuel <= 0) pushX = pushZ = 0.0D; -+ setMinecartPowered(fuel > 0); -+ } -+ -+ /** -+ * Moved to allow overrides, This code handle slopes affecting velocity. -+ * @param metadata The blocks position metadata -+ */ -+ protected void adjustSlopeVelocities(int metadata) -+ { -+ double acceleration = 0.0078125D; -+ if (metadata == 2) -+ { -+ motionX -= acceleration; -+ } -+ else if (metadata == 3) -+ { -+ motionX += acceleration; -+ } -+ else if (metadata == 4) -+ { -+ motionZ += acceleration; -+ } -+ else if (metadata == 5) -+ { -+ motionZ -= acceleration; -+ } -+ } -+ -+ /** -+ * Getters/setters for physics variables -+ */ -+ -+ /** -+ * Returns the carts max speed. -+ * Carts going faster than 1.1 cause issues with chunk loading. -+ * Carts cant traverse slopes or corners at greater than 0.5 - 0.6. -+ * This value is compared with the rails max speed to determine -+ * the carts current max speed. A normal rails max speed is 0.4. -+ * @return Carts max speed. -+ */ -+ public float getMaxSpeedRail() -+ { -+ return maxSpeedRail; -+ } -+ -+ public void setMaxSpeedRail(float value) -+ { -+ maxSpeedRail = value; -+ } -+ -+ public float getMaxSpeedGround() -+ { -+ return maxSpeedGround; -+ } -+ -+ public void setMaxSpeedGround(float value) -+ { -+ maxSpeedGround = value; -+ } -+ -+ public float getMaxSpeedAirLateral() -+ { -+ return maxSpeedAirLateral; -+ } -+ -+ public void setMaxSpeedAirLateral(float value) -+ { -+ maxSpeedAirLateral = value; -+ } -+ -+ public float getMaxSpeedAirVertical() -+ { -+ return maxSpeedAirVertical; -+ } -+ -+ public void setMaxSpeedAirVertical(float value) -+ { -+ maxSpeedAirVertical = value; -+ } -+ -+ public double getDragAir() -+ { -+ return dragAir; -+ } -+ -+ public void setDragAir(double value) -+ { -+ dragAir = value; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/EntityMooshroom.java.patch b/patches/minecraft/net/minecraft/src/EntityMooshroom.java.patch deleted file mode 100644 index 0be66a01b..000000000 --- a/patches/minecraft/net/minecraft/src/EntityMooshroom.java.patch +++ /dev/null @@ -1,78 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EntityMooshroom.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EntityMooshroom.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,10 @@ - package net.minecraft.src; - --public class EntityMooshroom extends EntityCow -+import java.util.ArrayList; -+ -+import net.minecraft.src.forge.IShearable; -+ -+public class EntityMooshroom extends EntityCow implements IShearable - { - public EntityMooshroom(World par1World) - { -@@ -30,32 +34,7 @@ - return true; - } - } -- -- if (var2 != null && var2.itemID == Item.shears.shiftedIndex && this.getGrowingAge() >= 0) -- { -- this.setDead(); -- this.worldObj.spawnParticle("largeexplode", this.posX, this.posY + (double)(this.height / 2.0F), this.posZ, 0.0D, 0.0D, 0.0D); -- -- if (!this.worldObj.isRemote) -- { -- EntityCow var3 = new EntityCow(this.worldObj); -- var3.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); -- var3.setEntityHealth(this.getHealth()); -- var3.renderYawOffset = this.renderYawOffset; -- this.worldObj.spawnEntityInWorld(var3); -- -- for (int var4 = 0; var4 < 5; ++var4) -- { -- this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.posX, this.posY + (double)this.height, this.posZ, new ItemStack(Block.mushroomRed))); -- } -- } -- -- return true; -- } -- else -- { -- return super.interact(par1EntityPlayer); -- } -+ return super.interact(par1EntityPlayer); - } - - /** -@@ -65,4 +44,29 @@ - { - return new EntityMooshroom(this.worldObj); - } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int X, int Y, int Z) -+ { -+ return getGrowingAge() >= 0; -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int X, int Y, int Z, int fortune) -+ { -+ setDead(); -+ EntityCow entitycow = new EntityCow(worldObj); -+ entitycow.setLocationAndAngles(posX, posY, posZ, rotationYaw, rotationPitch); -+ entitycow.setEntityHealth(getHealth()); -+ entitycow.renderYawOffset = renderYawOffset; -+ worldObj.spawnEntityInWorld(entitycow); -+ worldObj.spawnParticle("largeexplode", posX, posY + (double)(height / 2.0F), posZ, 0.0D, 0.0D, 0.0D); -+ -+ ArrayList ret = new ArrayList(); -+ for (int x = 0; x < 5; x++) -+ { -+ ret.add(new ItemStack(Block.mushroomRed)); -+ } -+ return ret; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/EntityOcelot.java.patch b/patches/minecraft/net/minecraft/src/EntityOcelot.java.patch deleted file mode 100644 index 350405b26..000000000 --- a/patches/minecraft/net/minecraft/src/EntityOcelot.java.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EntityOcelot.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EntityOcelot.java 0000-00-00 00:00:00.000000000 -0000 -@@ -321,7 +321,8 @@ - - int var4 = this.worldObj.getBlockId(var1, var2 - 1, var3); - -- if (var4 == Block.grass.blockID || var4 == Block.leaves.blockID) -+ Block block = Block.blocksList[var4]; -+ if (var4 == Block.grass.blockID || (block != null && block.isLeaves(worldObj, var1, var2 - 1, var3))) - { - return true; - } diff --git a/patches/minecraft/net/minecraft/src/EntityPlayer.java.patch b/patches/minecraft/net/minecraft/src/EntityPlayer.java.patch deleted file mode 100644 index 3cb4582d1..000000000 --- a/patches/minecraft/net/minecraft/src/EntityPlayer.java.patch +++ /dev/null @@ -1,246 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EntityPlayer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EntityPlayer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -7,6 +7,8 @@ - import cpw.mods.fml.common.FMLCommonHandler; - import cpw.mods.fml.common.TickType; - -+import net.minecraft.src.forge.*; -+ - public abstract class EntityPlayer extends EntityLiving - { - /** Inventory of the player */ -@@ -215,6 +217,7 @@ - } - else - { -+ itemInUse.getItem().onUsingItemTick(itemInUse, this, itemInUseCount); - if (this.itemInUseCount <= 25 && this.itemInUseCount % 4 == 0) - { - this.updateItemUse(var1, 5); -@@ -624,7 +627,16 @@ - */ - public EntityItem dropOneItem() - { -- return this.dropPlayerItemWithRandomChoice(this.inventory.decrStackSize(this.inventory.currentItem, 1), false); -+ ItemStack stack = inventory.getCurrentItem(); -+ if (stack == null) -+ { -+ return null; -+ } -+ if (stack.getItem().onDroppedByPlayer(stack, this)) -+ { -+ return dropPlayerItemWithRandomChoice(inventory.decrStackSize(inventory.currentItem, 1), false); -+ } -+ return null; - } - - /** -@@ -690,14 +702,22 @@ - - /** - * Returns how strong the player is against the specified block at this moment -+ * Deprecated in favor of the metadata-sensitive version - */ -+ @Deprecated - public float getCurrentPlayerStrVsBlock(Block par1Block) - { -- float var2 = this.inventory.getStrVsBlock(par1Block); -+ return getCurrentPlayerStrVsBlock(par1Block, 0); -+ } -+ -+ public float getCurrentPlayerStrVsBlock(Block par1Block, int meta) -+ { -+ ItemStack stack = inventory.getCurrentItem(); -+ float var2 = (stack == null ? 1.0F : stack.getItem().getStrVsBlock(stack, par1Block, meta)); - float var3 = var2; - int var4 = EnchantmentHelper.getEfficiencyModifier(this.inventory); - -- if (var4 > 0 && this.inventory.canHarvestBlock(par1Block)) -+ if (var4 > 0 && ForgeHooks.canHarvestBlock(par1Block, this, meta)) - { - var3 = var2 + (float)(var4 * var4 + 1); - } -@@ -984,12 +1004,22 @@ - */ - protected void damageEntity(DamageSource par1DamageSource, int par2) - { -+ par2 = ForgeHooks.onEntityLivingHurt(this, par1DamageSource, par2); -+ if (par2 == 0) -+ { -+ return; -+ } -+ - if (!par1DamageSource.isUnblockable() && this.isBlocking()) - { - par2 = 1 + par2 >> 1; - } - -- par2 = this.applyArmorCalculations(par1DamageSource, par2); -+ par2 = ArmorProperties.ApplyArmor(this, inventory.armorInventory, par1DamageSource, par2); -+ if (par2 <= 0) -+ { -+ return; -+ } - par2 = this.applyPotionDamageCalculations(par1DamageSource, par2); - this.addExhaustion(par1DamageSource.getHungerDamage()); - this.health -= par2; -@@ -1020,6 +1050,10 @@ - */ - public void useCurrentItemOnEntity(Entity par1Entity) - { -+ if (!ForgeHooks.onEntityInteract(this, par1Entity, false)) -+ { -+ return; -+ } - if (!par1Entity.interact(this)) - { - ItemStack var2 = this.getCurrentEquippedItem(); -@@ -1050,7 +1084,9 @@ - */ - public void destroyCurrentEquippedItem() - { -+ ItemStack orig = inventory.getCurrentItem(); - this.inventory.setInventorySlotContents(this.inventory.currentItem, (ItemStack)null); -+ ForgeHooks.onDestroyCurrentItem(this, orig); - } - - /** -@@ -1079,6 +1115,15 @@ - */ - public void attackTargetEntityWithCurrentItem(Entity par1Entity) - { -+ if (!ForgeHooks.onEntityInteract(this, par1Entity, true)) -+ { -+ return; -+ } -+ ItemStack stack = getCurrentEquippedItem(); -+ if (stack != null && stack.getItem().onLeftClickEntity(stack, this, par1Entity)) -+ { -+ return; -+ } - if (par1Entity.canAttackWithItem()) - { - int var2 = this.inventory.getDamageVsEntity(par1Entity); -@@ -1221,6 +1266,12 @@ - */ - public EnumStatus sleepInBedAt(int par1, int par2, int par3) - { -+ EnumStatus customSleep = ForgeHooks.sleepInBedAt(this, par1, par2, par3); -+ if (customSleep != null) -+ { -+ return customSleep; -+ } -+ - if (!this.worldObj.isRemote) - { - if (this.isPlayerSleeping() || !this.isEntityAlive()) -@@ -1260,6 +1311,11 @@ - { - int var9 = this.worldObj.getBlockMetadata(par1, par2, par3); - int var5 = BlockBed.getDirection(var9); -+ Block block = Block.blocksList[worldObj.getBlockId(par1, par2, par3)]; -+ if (block != null) -+ { -+ var5 = block.getBedDirection(worldObj, par1, par2, par3); -+ } - float var10 = 0.5F; - float var7 = 0.5F; - -@@ -1329,11 +1385,12 @@ - this.resetHeight(); - ChunkCoordinates var4 = this.playerLocation; - ChunkCoordinates var5 = this.playerLocation; -+ Block block = (var4 == null ? null : Block.blocksList[worldObj.getBlockId(var4.posX, var4.posY, var4.posZ)]); - -- if (var4 != null && this.worldObj.getBlockId(var4.posX, var4.posY, var4.posZ) == Block.bed.blockID) -+ if (var4 != null && block != null && block.isBed(worldObj, var4.posX, var4.posY, var4.posZ, this)) - { -- BlockBed.setBedOccupied(this.worldObj, var4.posX, var4.posY, var4.posZ, false); -- var5 = BlockBed.getNearestEmptyChunkCoordinates(this.worldObj, var4.posX, var4.posY, var4.posZ, 0); -+ block.setBedOccupied(this.worldObj, var4.posX, var4.posY, var4.posZ, this, false); -+ var5 = block.getBedSpawnPosition(worldObj, var4.posX, var4.posY, var4.posZ, this); - - if (var5 == null) - { -@@ -1370,7 +1427,9 @@ - */ - private boolean isInBed() - { -- return this.worldObj.getBlockId(this.playerLocation.posX, this.playerLocation.posY, this.playerLocation.posZ) == Block.bed.blockID; -+ ChunkCoordinates c = playerLocation; -+ int blockID = worldObj.getBlockId(c.posX, c.posY, c.posZ); -+ return Block.blocksList[blockID] != null && Block.blocksList[blockID].isBed(worldObj, c.posX, c.posY, c.posZ, this); - } - - /** -@@ -1385,13 +1444,15 @@ - var2.loadChunk(par1ChunkCoordinates.posX - 3 >> 4, par1ChunkCoordinates.posZ + 3 >> 4); - var2.loadChunk(par1ChunkCoordinates.posX + 3 >> 4, par1ChunkCoordinates.posZ + 3 >> 4); - -- if (par0World.getBlockId(par1ChunkCoordinates.posX, par1ChunkCoordinates.posY, par1ChunkCoordinates.posZ) != Block.bed.blockID) -+ ChunkCoordinates c = par1ChunkCoordinates; -+ Block block = Block.blocksList[par0World.getBlockId(c.posX, c.posY, c.posZ)]; -+ if (block == null || !block.isBed(par0World, c.posX, c.posY, c.posZ, null)) - { - return null; - } - else - { -- ChunkCoordinates var3 = BlockBed.getNearestEmptyChunkCoordinates(par0World, par1ChunkCoordinates.posX, par1ChunkCoordinates.posY, par1ChunkCoordinates.posZ, 0); -+ ChunkCoordinates var3 = block.getBedSpawnPosition(par0World, c.posX, c.posY, c.posZ, null); - return var3; - } - } -@@ -1403,8 +1464,11 @@ - { - if (this.playerLocation != null) - { -- int var1 = this.worldObj.getBlockMetadata(this.playerLocation.posX, this.playerLocation.posY, this.playerLocation.posZ); -- int var2 = BlockBed.getDirection(var1); -+ int x = playerLocation.posX; -+ int y = playerLocation.posY; -+ int z = playerLocation.posZ; -+ Block block = Block.blocksList[worldObj.getBlockId(x, y, z)]; -+ int var2 = (block == null ? 0 : block.getBedDirection(worldObj, x, y, z)); - - switch (var2) - { -@@ -1694,6 +1758,7 @@ - return 101; - } - } -+ var3 = par1ItemStack.getItem().getIconIndex(par1ItemStack, par2, this, itemInUse, itemInUseCount); - } - - return var3; -@@ -1866,4 +1931,30 @@ - } - - public void func_50009_aI() {} -+ -+ /** -+ * Opens a Gui for the player. -+ * -+ * @param mod The mod associated with the gui -+ * @param ID The ID number for the Gui -+ * @param world The World -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ */ -+ public void openGui(BaseMod mod, int ID, World world, int x, int y, int z) -+ { -+ if (this instanceof EntityPlayerSP) -+ { -+ IGuiHandler handler = MinecraftForge.getGuiHandler(mod); -+ if (handler != null) -+ { -+ GuiScreen screen = (GuiScreen)handler.getGuiElement(ID, this, world, x, y, z); -+ if (screen != null) -+ { -+ ModLoader.getMinecraftInstance().displayGuiScreen(screen); -+ } -+ } -+ } -+ } - } diff --git a/patches/minecraft/net/minecraft/src/EntityRenderer.java.patch b/patches/minecraft/net/minecraft/src/EntityRenderer.java.patch deleted file mode 100644 index 85e093ea5..000000000 --- a/patches/minecraft/net/minecraft/src/EntityRenderer.java.patch +++ /dev/null @@ -1,97 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EntityRenderer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EntityRenderer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -5,6 +5,8 @@ - import java.util.List; - import java.util.Random; - import net.minecraft.client.Minecraft; -+import net.minecraft.src.forge.ForgeHooksClient; -+ - import org.lwjgl.input.Mouse; - import org.lwjgl.opengl.Display; - import org.lwjgl.opengl.GL11; -@@ -287,8 +289,15 @@ - */ - private void updateFovModifierHand() - { -- EntityPlayerSP var1 = (EntityPlayerSP)this.mc.renderViewEntity; -- this.fovMultiplierTemp = var1.getFOVMultiplier(); -+ if (mc.renderViewEntity instanceof EntityPlayerSP) -+ { -+ EntityPlayerSP var1 = (EntityPlayerSP)this.mc.renderViewEntity; -+ this.fovMultiplierTemp = var1.getFOVMultiplier(); -+ } -+ else -+ { -+ this.fovMultiplierTemp = mc.thePlayer.getFOVMultiplier(); -+ } - this.fovModifierHandPrev = this.fovModifierHand; - this.fovModifierHand += (this.fovMultiplierTemp - this.fovModifierHand) * 0.5F; - } -@@ -304,7 +313,7 @@ - } - else - { -- EntityPlayer var3 = (EntityPlayer)this.mc.renderViewEntity; -+ EntityLiving var3 = (EntityLiving)this.mc.renderViewEntity; - float var4 = 70.0F; - - if (par2) -@@ -391,12 +400,14 @@ - - if (!this.mc.gameSettings.debugCamEnable) - { -- int var10 = this.mc.theWorld.getBlockId(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ)); -- -- if (var10 == Block.bed.blockID) -+ int x = MathHelper.floor_double(var2.posX); -+ int y = MathHelper.floor_double(var2.posY); -+ int z = MathHelper.floor_double(var2.posZ); -+ Block block = Block.blocksList[mc.theWorld.getBlockId(x, y, z)]; -+ -+ if (block != null && block.isBed(mc.theWorld, x, y, z, var2)) - { -- int var11 = this.mc.theWorld.getBlockMetadata(MathHelper.floor_double(var2.posX), MathHelper.floor_double(var2.posY), MathHelper.floor_double(var2.posZ)); -- int var12 = var11 & 3; -+ int var12 = block.getBedDirection(mc.theWorld, x, y, z); - GL11.glRotatef((float)(var12 * 90), 0.0F, 1.0F, 0.0F); - } - -@@ -1095,8 +1106,11 @@ - var20 = (EntityPlayer)var4; - GL11.glDisable(GL11.GL_ALPHA_TEST); - Profiler.endStartSection("outline"); -- var5.drawBlockBreaking(var20, this.mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1); -- var5.drawSelectionBox(var20, this.mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1); -+ if (!ForgeHooksClient.onBlockHighlight(var5, var20, mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1)) -+ { -+ var5.drawBlockBreaking(var20, this.mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1); -+ var5.drawSelectionBox(var20, this.mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1); -+ } - GL11.glEnable(GL11.GL_ALPHA_TEST); - } - } -@@ -1160,8 +1174,12 @@ - var20 = (EntityPlayer)var4; - GL11.glDisable(GL11.GL_ALPHA_TEST); - Profiler.endStartSection("outline"); -- var5.drawBlockBreaking(var20, this.mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1); -- var5.drawSelectionBox(var20, this.mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1); -+ -+ if (!ForgeHooksClient.onBlockHighlight(var5, var20, mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1)) -+ { -+ var5.drawBlockBreaking(var20, this.mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1); -+ var5.drawSelectionBox(var20, this.mc.objectMouseOver, 0, var20.inventory.getCurrentItem(), par1); -+ } - GL11.glEnable(GL11.GL_ALPHA_TEST); - } - -@@ -1185,6 +1203,9 @@ - this.setupFog(1, par1); - GL11.glPopMatrix(); - } -+ -+ Profiler.endStartSection("fhooks"); -+ ForgeHooksClient.onRenderWorldLast(var5, par1); - - Profiler.endStartSection("hand"); - diff --git a/patches/minecraft/net/minecraft/src/EntitySheep.java.patch b/patches/minecraft/net/minecraft/src/EntitySheep.java.patch deleted file mode 100644 index 47a484a3e..000000000 --- a/patches/minecraft/net/minecraft/src/EntitySheep.java.patch +++ /dev/null @@ -1,67 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/EntitySheep.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/EntitySheep.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,8 +1,11 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - --public class EntitySheep extends EntityAnimal -+import net.minecraft.src.forge.IShearable; -+ -+public class EntitySheep extends EntityAnimal implements IShearable - { - /** - * Holds the RGB table of the sheep colors - in OpenGL glColor3f values - used to render the sheep colored fleece. -@@ -129,27 +132,6 @@ - */ - public boolean interact(EntityPlayer par1EntityPlayer) - { -- ItemStack var2 = par1EntityPlayer.inventory.getCurrentItem(); -- -- if (var2 != null && var2.itemID == Item.shears.shiftedIndex && !this.getSheared() && !this.isChild()) -- { -- if (!this.worldObj.isRemote) -- { -- this.setSheared(true); -- int var3 = 1 + 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, par1EntityPlayer); -- } -- - return super.interact(par1EntityPlayer); - } - -@@ -282,4 +264,23 @@ - this.setGrowingAge(var1); - } - } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int X, int Y, int Z) -+ { -+ return !getSheared() && !isChild(); -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int X, int Y, int Z, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ setSheared(true); -+ int i = 1 + rand.nextInt(3); -+ for (int j = 0; j < i; j++) -+ { -+ ret.add(new ItemStack(Block.cloth.blockID, 1, getFleeceColor())); -+ } -+ return ret; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/Explosion.java.patch b/patches/minecraft/net/minecraft/src/Explosion.java.patch deleted file mode 100644 index a58ae7178..000000000 --- a/patches/minecraft/net/minecraft/src/Explosion.java.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/Explosion.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/Explosion.java 0000-00-00 00:00:00.000000000 -0000 -@@ -6,6 +6,8 @@ - import java.util.Random; - import java.util.Set; - -+import net.minecraft.src.forge.ISpecialResistance; -+ - public class Explosion - { - /** whether or not the explosion sets fire to blocks around it */ -@@ -72,7 +74,15 @@ - - if (var25 > 0) - { -- var14 -= (Block.blocksList[var25].getExplosionResistance(this.exploder) + 0.3F) * var21; -+ if (Block.blocksList[var25] instanceof ISpecialResistance) -+ { -+ ISpecialResistance isr = (ISpecialResistance)Block.blocksList[var25]; -+ var14 -= (isr.getSpecialExplosionResistance(worldObj, var22, var23, var24, explosionX, explosionY, explosionZ, exploder) + 0.3F) * var21; -+ } -+ else -+ { -+ var14 -= (Block.blocksList[var25].getExplosionResistance(this.exploder) + 0.3F) * var21; -+ } - } - - if (var14 > 0.0F) diff --git a/patches/minecraft/net/minecraft/src/FurnaceRecipes.java.patch b/patches/minecraft/net/minecraft/src/FurnaceRecipes.java.patch deleted file mode 100644 index 999216541..000000000 --- a/patches/minecraft/net/minecraft/src/FurnaceRecipes.java.patch +++ /dev/null @@ -1,62 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/FurnaceRecipes.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/FurnaceRecipes.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,6 @@ - package net.minecraft.src; - -+import java.util.Arrays; - import java.util.HashMap; - import java.util.Map; - -@@ -9,6 +10,7 @@ - - /** The list of smelting results. */ - private Map smeltingList = new HashMap(); -+ private Map metaSmeltingList = new HashMap(); - - /** - * Used to call methods addSmelting and getSmeltingResult. -@@ -47,7 +49,9 @@ - - /** - * Returns the smelting result of an item. -+ * Deprecated in favor of a metadata sensitive version - */ -+ @Deprecated - public ItemStack getSmeltingResult(int par1) - { - return (ItemStack)this.smeltingList.get(Integer.valueOf(par1)); -@@ -57,4 +61,34 @@ - { - return this.smeltingList; - } -+ -+ /** -+ * Add a metadata-sensitive furnace recipe -+ * @param itemID The Item ID -+ * @param metadata The Item Metadata -+ * @param itemstack The ItemStack for the result -+ */ -+ public void addSmelting(int itemID, int metadata, ItemStack itemstack) -+ { -+ metaSmeltingList.put(Arrays.asList(itemID, metadata), itemstack); -+ } -+ -+ /** -+ * Used to get the resulting ItemStack form a source ItemStack -+ * @param item The Source ItemStack -+ * @return The result ItemStack -+ */ -+ public ItemStack getSmeltingResult(ItemStack item) -+ { -+ if (item == null) -+ { -+ return null; -+ } -+ ItemStack ret = (ItemStack)metaSmeltingList.get(Arrays.asList(item.itemID, item.getItemDamage())); -+ if (ret != null) -+ { -+ return ret; -+ } -+ return (ItemStack)smeltingList.get(Integer.valueOf(item.itemID)); -+ } - } diff --git a/patches/minecraft/net/minecraft/src/GuiAchievements.java.patch b/patches/minecraft/net/minecraft/src/GuiAchievements.java.patch deleted file mode 100644 index c1249e226..000000000 --- a/patches/minecraft/net/minecraft/src/GuiAchievements.java.patch +++ /dev/null @@ -1,108 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/GuiAchievements.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/GuiAchievements.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,11 @@ - package net.minecraft.src; - -+import java.util.LinkedList; -+import java.util.List; - import java.util.Random; -+ -+import net.minecraft.src.forge.MinecraftForge; -+ - import org.lwjgl.input.Mouse; - import org.lwjgl.opengl.GL11; - import org.lwjgl.opengl.GL12; -@@ -40,6 +45,10 @@ - /** Whether the Mouse Button is down or not */ - private int isMouseButtonDown = 0; - private StatFileWriter statFileWriter; -+ -+ private int currentPage = -1; -+ private GuiSmallButton button; -+ private LinkedList minecraftAchievements = new LinkedList(); - - public GuiAchievements(StatFileWriter par1StatFileWriter) - { -@@ -48,6 +57,15 @@ - short var3 = 141; - this.field_27116_m = this.guiMapX = this.field_27112_q = (double)(AchievementList.openInventory.displayColumn * 24 - var2 / 2 - 12); - this.field_27115_n = this.guiMapY = this.field_27111_r = (double)(AchievementList.openInventory.displayRow * 24 - var3 / 2); -+ -+ minecraftAchievements.clear(); -+ for (Object achievement : AchievementList.achievementList) -+ { -+ if (!MinecraftForge.isAchievementInPages((Achievement)achievement)) -+ { -+ minecraftAchievements.add((Achievement)achievement); -+ } -+ } - } - - /** -@@ -57,6 +75,8 @@ - { - this.controlList.clear(); - this.controlList.add(new GuiSmallButton(1, this.width / 2 + 24, this.height / 2 + 74, 80, 20, StatCollector.translateToLocal("gui.done"))); -+ button = new GuiSmallButton(2, (width - achievementsPaneWidth) / 2 + 24, height / 2 + 74, 125, 20, getAchievementPageTitle(currentPage)); -+ this.controlList.add(button); - } - - /** -@@ -69,6 +89,16 @@ - this.mc.displayGuiScreen((GuiScreen)null); - this.mc.setIngameFocus(); - } -+ -+ if (par1GuiButton.id == 2) -+ { -+ currentPage++; -+ if (currentPage >= MinecraftForge.getAchievementPages().size()) -+ { -+ currentPage = -1; -+ } -+ button.displayString = getAchievementPageTitle(currentPage); -+ } - - super.actionPerformed(par1GuiButton); - } -@@ -289,11 +319,12 @@ - int var27; - int var30; - -- for (var22 = 0; var22 < AchievementList.achievementList.size(); ++var22) -+ List achievementList = (currentPage == -1 ? minecraftAchievements : MinecraftForge.getAchievementPage(currentPage).getAchievements()); -+ for (var22 = 0; var22 < achievementList.size(); ++var22) - { -- Achievement var33 = (Achievement)AchievementList.achievementList.get(var22); -+ Achievement var33 = achievementList.get(var22); - -- if (var33.parentAchievement != null) -+ if (var33.parentAchievement != null && achievementList.contains(var33.parentAchievement)) - { - var24 = var33.displayColumn * 24 - var4 + 11 + var10; - var25 = var33.displayRow * 24 - var5 + 11 + var11; -@@ -327,9 +358,9 @@ - int var42; - int var41; - -- for (var24 = 0; var24 < AchievementList.achievementList.size(); ++var24) -+ for (var24 = 0; var24 < achievementList.size(); ++var24) - { -- Achievement var35 = (Achievement)AchievementList.achievementList.get(var24); -+ Achievement var35 = achievementList.get(var24); - var26 = var35.displayColumn * 24 - var4; - var27 = var35.displayRow * 24 - var5; - -@@ -453,4 +484,12 @@ - { - return true; - } -+ -+ /** -+ * FORGE: Gets the name for an achievement page by its index -+ */ -+ public static String getAchievementPageTitle(int index) -+ { -+ return index == -1 ? "Minecraft" : MinecraftForge.getAchievementPage(index).getName(); -+ } - } diff --git a/patches/minecraft/net/minecraft/src/GuiControls.java.patch b/patches/minecraft/net/minecraft/src/GuiControls.java.patch deleted file mode 100644 index bd0a90a63..000000000 --- a/patches/minecraft/net/minecraft/src/GuiControls.java.patch +++ /dev/null @@ -1,144 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/GuiControls.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/GuiControls.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.GuiControlsScrollPanel; -+ - public class GuiControls extends GuiScreen - { - /** -@@ -15,6 +17,8 @@ - - /** The ID of the button that has been pressed. */ - private int buttonId = -1; -+ -+ private GuiControlsScrollPanel scrollPane; - - public GuiControls(GuiScreen par1GuiScreen, GameSettings par2GameSettings) - { -@@ -32,15 +36,12 @@ - */ - public void initGui() - { -+ scrollPane = new GuiControlsScrollPanel(this, options, mc); - StringTranslate var1 = StringTranslate.getInstance(); - int var2 = this.func_20080_j(); - -- for (int var3 = 0; var3 < this.options.keyBindings.length; ++var3) -- { -- this.controlList.add(new GuiSmallButton(var3, var2 + var3 % 2 * 160, this.height / 6 + 24 * (var3 >> 1), 70, 20, this.options.getOptionDisplayString(var3))); -- } -- -- this.controlList.add(new GuiButton(200, this.width / 2 - 100, this.height / 6 + 168, var1.translateKey("gui.done"))); -+ this.controlList.add(new GuiButton(200, this.width / 2 - 100, this.height - 28, var1.translateKey("gui.done"))); -+ scrollPane.registerScrollButtons(controlList, 7, 8); - this.screenTitle = var1.translateKey("controls.title"); - } - -@@ -49,20 +50,10 @@ - */ - protected void actionPerformed(GuiButton par1GuiButton) - { -- for (int var2 = 0; var2 < this.options.keyBindings.length; ++var2) -- { -- ((GuiButton)this.controlList.get(var2)).displayString = this.options.getOptionDisplayString(var2); -- } -- - if (par1GuiButton.id == 200) - { - this.mc.displayGuiScreen(this.parentScreen); - } -- else -- { -- this.buttonId = par1GuiButton.id; -- par1GuiButton.displayString = "> " + this.options.getOptionDisplayString(par1GuiButton.id) + " <"; -- } - } - - /** -@@ -70,17 +61,7 @@ - */ - protected void mouseClicked(int par1, int par2, int par3) - { -- if (this.buttonId >= 0) -- { -- this.options.setKeyBinding(this.buttonId, -100 + par3); -- ((GuiButton)this.controlList.get(this.buttonId)).displayString = this.options.getOptionDisplayString(this.buttonId); -- this.buttonId = -1; -- KeyBinding.resetKeyBindingArrayAndHash(); -- } -- else -- { -- super.mouseClicked(par1, par2, par3); -- } -+ super.mouseClicked(par1, par2, par3); - } - - /** -@@ -88,14 +69,7 @@ - */ - protected void keyTyped(char par1, int par2) - { -- if (this.buttonId >= 0) -- { -- this.options.setKeyBinding(this.buttonId, par2); -- ((GuiButton)this.controlList.get(this.buttonId)).displayString = this.options.getOptionDisplayString(this.buttonId); -- this.buttonId = -1; -- KeyBinding.resetKeyBindingArrayAndHash(); -- } -- else -+ if (scrollPane.keyTyped(par1, par2)) - { - super.keyTyped(par1, par2); - } -@@ -107,47 +81,8 @@ - public void drawScreen(int par1, int par2, float par3) - { - this.drawDefaultBackground(); -- this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215); -- int var4 = this.func_20080_j(); -- int var5 = 0; -- -- while (var5 < this.options.keyBindings.length) -- { -- boolean var6 = false; -- int var7 = 0; -- -- while (true) -- { -- if (var7 < this.options.keyBindings.length) -- { -- if (var7 == var5 || this.options.keyBindings[var5].keyCode != this.options.keyBindings[var7].keyCode) -- { -- ++var7; -- continue; -- } -- -- var6 = true; -- } -- -- if (this.buttonId == var5) -- { -- ((GuiButton)this.controlList.get(var5)).displayString = "\u00a7f> \u00a7e??? \u00a7f<"; -- } -- else if (var6) -- { -- ((GuiButton)this.controlList.get(var5)).displayString = "\u00a7c" + this.options.getOptionDisplayString(var5); -- } -- else -- { -- ((GuiButton)this.controlList.get(var5)).displayString = this.options.getOptionDisplayString(var5); -- } -- -- this.drawString(this.fontRenderer, this.options.getKeyBindingDescription(var5), var4 + var5 % 2 * 160 + 70 + 6, this.height / 6 + 24 * (var5 >> 1) + 7, -1); -- ++var5; -- break; -- } -- } -- -+ scrollPane.drawScreen(par1, par2, par3); -+ drawCenteredString(fontRenderer, screenTitle, width / 2, 4, 0xffffff); - super.drawScreen(par1, par2, par3); - } - } diff --git a/patches/minecraft/net/minecraft/src/GuiIngame.java.patch b/patches/minecraft/net/minecraft/src/GuiIngame.java.patch deleted file mode 100644 index dd83c4809..000000000 --- a/patches/minecraft/net/minecraft/src/GuiIngame.java.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/GuiIngame.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/GuiIngame.java 0000-00-00 00:00:00.000000000 -0000 -@@ -9,6 +9,8 @@ - import org.lwjgl.opengl.GL11; - import org.lwjgl.opengl.GL12; - -+import net.minecraft.src.forge.*; -+ - public class GuiIngame extends Gui - { - private static RenderItem itemRenderer = new RenderItem(); -@@ -142,7 +144,19 @@ - - var46 = var7 - 39; - var22 = var46 - 10; -- var23 = this.mc.thePlayer.getTotalArmorValue(); -+ var23 = 0; -+ for (int x = 0; x < mc.thePlayer.inventory.armorInventory.length; x++) -+ { -+ ItemStack stack = mc.thePlayer.inventory.armorInventory[x]; -+ if (stack != null && stack.getItem() instanceof ISpecialArmor) -+ { -+ var23 += ((ISpecialArmor)stack.getItem()).getArmorDisplay(mc.thePlayer, stack, x); -+ } -+ else if (stack != null && stack.getItem() instanceof ItemArmor) -+ { -+ var23 += ((ItemArmor)stack.getItem()).damageReduceAmount; -+ } -+ } - int var24 = -1; - - if (this.mc.thePlayer.isPotionActive(Potion.regeneration)) diff --git a/patches/minecraft/net/minecraft/src/Item.java.patch b/patches/minecraft/net/minecraft/src/Item.java.patch deleted file mode 100644 index 99ce28209..000000000 --- a/patches/minecraft/net/minecraft/src/Item.java.patch +++ /dev/null @@ -1,234 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/Item.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/Item.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,9 +1,12 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.List; - import java.util.Random; - --public class Item -+import net.minecraft.src.forge.ITextureProvider; -+ -+public class Item implements ITextureProvider - { - /** The RNG used by the Item subclasses. */ - protected static Random itemRand = new Random(); -@@ -188,14 +191,17 @@ - - /** full name of item from language file */ - private String itemName; -- -+ -+ /** FORGE: To disable repair recipes. */ -+ protected boolean canRepair = true; -+ - protected Item(int par1) - { - this.shiftedIndex = 256 + par1; - - if (itemsList[256 + par1] != null) - { -- System.out.println("CONFLICT @ " + par1); -+ System.out.println("CONFLICT @ " + par1 + " item slot already occupied by " + itemsList[256 + par1] + " while adding " + this); - } - - itemsList[256 + par1] = this; -@@ -551,7 +557,7 @@ - float var17 = MathHelper.sin(-var5 * 0.017453292F); - float var18 = var15 * var16; - float var20 = var14 * var16; -- double var21 = 5.0D; -+ double var21 = ModLoader.getMinecraftInstance().playerController.getBlockReachDistance(); - Vec3D var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21); - MovingObjectPosition var24 = par1World.rayTraceBlocks_do_do(var13, var23, par3, !par3); - return var24; -@@ -579,4 +585,188 @@ - { - StatList.initStats(); - } -+ -+ /* =========================================================== FORGE START ===============================================================*/ -+ public boolean isDefaultTexture = true; -+ private String currentTexture = "/gui/items.png"; -+ /** -+ * Called when a new CreativeContainer is opened, populate the list -+ * with all of the items for this item you want a player in creative mode -+ * to have access to. -+ * -+ * @param itemList The list of items currently in the creative inventory -+ */ -+ public void addCreativeItems(ArrayList itemList) -+ { -+ if (this.shiftedIndex != Item.potion.shiftedIndex && this.shiftedIndex != Item.monsterPlacer.shiftedIndex) -+ { -+ itemList.add(new ItemStack(this, 1)); -+ } -+ } -+ -+ /** -+ * Called when a player drops the item into the world, -+ * returning false from this will prevent the item from -+ * being removed from the players inventory and spawning -+ * in the world -+ * -+ * @param player The player that dropped the item -+ * @param item The item stack, before the item is removed. -+ */ -+ public boolean onDroppedByPlayer(ItemStack item, EntityPlayer player) -+ { -+ return true; -+ } -+ -+ /** -+ * This is called when the item is used, before the block is activated. -+ * @param stack The Item Stack -+ * @param player The Player that used the item -+ * @param world The Current World -+ * @param X Target X Position -+ * @param Y Target Y Position -+ * @param Z Target Z Position -+ * @param side The side of the target hit -+ * @return Return true to prevent any further processing. -+ */ -+ public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int X, int Y, int Z, int side) -+ { -+ return false; -+ } -+ -+ /** -+ * Metadata-sensitive version of getStrVsBlock -+ * @param itemstack The Item Stack -+ * @param block The block the item is trying to break -+ * @param metadata The items current metadata -+ * @return The damage strength -+ */ -+ public float getStrVsBlock(ItemStack itemstack, Block block, int metadata) -+ { -+ return getStrVsBlock(itemstack, block); -+ } -+ -+ /** -+ * Called by CraftingManager to determine if an item is reparable. -+ * @return True if reparable -+ */ -+ public boolean isRepairable() -+ { -+ return canRepair && isDamageable(); -+ } -+ -+ /** -+ * Call to disable repair recipes. -+ * @return The current Item instance -+ */ -+ public Item setNoRepair() -+ { -+ canRepair = false; -+ return this; -+ } -+ -+ /** -+ * Called before a block is broken. Return true to prevent default block harvesting. -+ * -+ * Note: In SMP, this is called on both client and server sides! -+ * -+ * @param itemstack The current ItemStack -+ * @param X The X Position -+ * @param Y The X Position -+ * @param Z The X Position -+ * @param player The Player that is wielding the item -+ * @return True to prevent harvesting, false to continue as normal -+ */ -+ public boolean onBlockStartBreak(ItemStack itemstack, int X, int Y, int Z, EntityPlayer player) -+ { -+ return false; -+ } -+ -+ /** -+ * Called each tick while using an item. -+ * @param stack The Item being used -+ * @param player The Player using the item -+ * @param count The amount of time in tick the item has been used for continuously -+ */ -+ public void onUsingItemTick(ItemStack stack, EntityPlayer player, int count) -+ { -+ } -+ -+ /** -+ * Called when the player Left Clicks (attacks) an entity. -+ * Processed before damage is done, if return value is true further processing is canceled -+ * and the entity is not attacked. -+ * -+ * @param stack The Item being used -+ * @param player The player that is attacking -+ * @param entity The entity being attacked -+ * @return True to cancel the rest of the interaction. -+ */ -+ public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) -+ { -+ return false; -+ } -+ -+ /** -+ * Player, Render pass, and item usage sensitive version of getIconIndex. -+ * -+ * @param stack The item stack to get the icon for. (Usually this, and usingItem will be the same if usingItem is not null) -+ * @param renderPass The pass to get the icon for, 0 is default. -+ * @param player The player holding the item -+ * @param usingItem The item the player is actively using. Can be null if not using anything. -+ * @param useRemaining The ticks remaining for the active item. -+ * @return The icon index -+ */ -+ public int getIconIndex(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) -+ { -+ /* -+ * Here is an example usage for Vanilla bows. -+ if (usingItem != null && usingItem.getItem().shiftedIndex == Item.bow.shiftedIndex) -+ { -+ int k = usingItem.getMaxItemUseDuration() - useRemaining; -+ if (k >= 18) return 133; -+ if (k > 13) return 117; -+ if (k > 0) return 101; -+ } -+ */ -+ return getIconIndex(stack); -+ } -+ -+ /** -+ * Returns the number of render passes/layers this item has. -+ * Usually equates to ItemRenderer.renderItem being called for this many passes. -+ * Does not get called unless requiresMultipleRenderPasses() is true; -+ * -+ * @param metadata The item's metadata -+ * @return The number of passes to run. -+ */ -+ public int getRenderPasses(int metadata) -+ { -+ return requiresMultipleRenderPasses() ? 2 : 1; -+ } -+ -+ /** -+ * Grabs the current texture file used for this block -+ */ -+ @Override -+ public String getTextureFile() -+ { -+ if (this instanceof ItemBlock) -+ { -+ return Block.blocksList[((ItemBlock)this).getBlockID()].getTextureFile(); -+ } -+ return currentTexture; -+ } -+ -+ /** -+ * Sets the current texture file for this item, used when rendering. -+ * Default is "/gui/items.png" -+ * -+ * @param texture The texture file -+ */ -+ public void setTextureFile(String texture) -+ { -+ currentTexture = texture; -+ isDefaultTexture = false; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/ItemBlock.java.patch b/patches/minecraft/net/minecraft/src/ItemBlock.java.patch deleted file mode 100644 index ebb6e48cf..000000000 --- a/patches/minecraft/net/minecraft/src/ItemBlock.java.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ItemBlock.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ItemBlock.java 0000-00-00 00:00:00.000000000 -0000 -@@ -32,7 +32,8 @@ - { - par7 = 1; - } -- else if (var8 != Block.vine.blockID && var8 != Block.tallGrass.blockID && var8 != Block.deadBush.blockID) -+ else if (var8 != Block.vine.blockID && var8 != Block.tallGrass.blockID && var8 != Block.deadBush.blockID -+ && (Block.blocksList[var8] != null && !Block.blocksList[var8].isBlockReplaceable(par3World, par4, par5, par6))) - { - if (par7 == 0) - { diff --git a/patches/minecraft/net/minecraft/src/ItemBow.java.patch b/patches/minecraft/net/minecraft/src/ItemBow.java.patch deleted file mode 100644 index a7bb61ae4..000000000 --- a/patches/minecraft/net/minecraft/src/ItemBow.java.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ItemBow.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ItemBow.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ItemBow extends Item - { - public ItemBow(int par1) -@@ -14,6 +16,11 @@ - */ - public void onPlayerStoppedUsing(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer, int par4) - { -+ if (ForgeHooks.onArrowLoose(par1ItemStack, par2World, par3EntityPlayer, getMaxItemUseDuration(par1ItemStack) - par4)) -+ { -+ return; -+ } -+ - boolean var5 = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; - - if (var5 || par3EntityPlayer.inventory.hasItem(Item.arrow.shiftedIndex)) -@@ -103,6 +110,12 @@ - */ - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { -+ ItemStack stack = ForgeHooks.onArrowNock(par1ItemStack, par2World, par3EntityPlayer); -+ if (stack != null) -+ { -+ return stack; -+ } -+ - if (par3EntityPlayer.capabilities.isCreativeMode || par3EntityPlayer.inventory.hasItem(Item.arrow.shiftedIndex)) - { - par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); diff --git a/patches/minecraft/net/minecraft/src/ItemBucket.java.patch b/patches/minecraft/net/minecraft/src/ItemBucket.java.patch deleted file mode 100644 index ff562cc6a..000000000 --- a/patches/minecraft/net/minecraft/src/ItemBucket.java.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ItemBucket.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ItemBucket.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.MinecraftForge; -+ - public class ItemBucket extends Item - { - /** field for checking if the bucket has been filled. */ -@@ -47,6 +49,12 @@ - { - return par1ItemStack; - } -+ -+ ItemStack stack = MinecraftForge.fillCustomBucket(par2World, var13, var14, var15); -+ if (stack != null) -+ { -+ return stack; -+ } - - if (par2World.getBlockMaterial(var13, var14, var15) == Material.water && par2World.getBlockMetadata(var13, var14, var15) == 0) - { diff --git a/patches/minecraft/net/minecraft/src/ItemDye.java.patch b/patches/minecraft/net/minecraft/src/ItemDye.java.patch deleted file mode 100644 index 498521a5f..000000000 --- a/patches/minecraft/net/minecraft/src/ItemDye.java.patch +++ /dev/null @@ -1,70 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ItemDye.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ItemDye.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,9 @@ - package net.minecraft.src; - -+import java.util.ArrayList; -+ -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ItemDye extends Item - { - /** List of dye color names */ -@@ -43,6 +47,15 @@ - if (par1ItemStack.getItemDamage() == 15) - { - int var8 = par3World.getBlockId(par4, par5, par6); -+ -+ if (ForgeHooks.onUseBonemeal(par3World, var8, par4, par5, par6)) -+ { -+ if (!par3World.isRemote) -+ { -+ par1ItemStack.stackSize--; -+ } -+ return true; -+ } - - if (var8 == Block.sapling.blockID) - { -@@ -116,15 +129,15 @@ - { - if (itemRand.nextInt(10) != 0) - { -+ if (mod_MinecraftForge.DISABLE_DARK_ROOMS && !Block.tallGrass.canBlockStay(par3World, var10, var11, var12)) -+ { -+ continue; -+ } - par3World.setBlockAndMetadataWithNotify(var10, var11, var12, Block.tallGrass.blockID, 1); - } -- else if (itemRand.nextInt(3) != 0) -- { -- par3World.setBlockWithNotify(var10, var11, var12, Block.plantYellow.blockID); -- } - else - { -- par3World.setBlockWithNotify(var10, var11, var12, Block.plantRed.blockID); -+ ForgeHooks.plantGrassPlant(par3World, var10, var11, var12); - } - } - } -@@ -155,4 +168,20 @@ - } - } - } -+ -+ /** -+ * Called when a new CreativeContainer is opened, populate the list -+ * with all of the items for this item you want a player in creative mode -+ * to have access to. -+ * -+ * @param itemList The list of items currently in the creative inventory -+ */ -+ @Override -+ public void addCreativeItems(ArrayList itemList) -+ { -+ for (int x = 0; x < 16; x++) -+ { -+ itemList.add(new ItemStack(this, 1, x)); -+ } -+ } - } diff --git a/patches/minecraft/net/minecraft/src/ItemHoe.java.patch b/patches/minecraft/net/minecraft/src/ItemHoe.java.patch deleted file mode 100644 index b9b457e80..000000000 --- a/patches/minecraft/net/minecraft/src/ItemHoe.java.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ItemHoe.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ItemHoe.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ItemHoe extends Item - { - public ItemHoe(int par1, EnumToolMaterial par2EnumToolMaterial) -@@ -21,6 +23,11 @@ - } - else - { -+ if (ForgeHooks.onUseHoe(par1ItemStack, par2EntityPlayer, par3World, par4, par5, par6)) -+ { -+ par1ItemStack.damageItem(1, par2EntityPlayer); -+ return true; -+ } - int var8 = par3World.getBlockId(par4, par5, par6); - int var9 = par3World.getBlockId(par4, par5 + 1, par6); - diff --git a/patches/minecraft/net/minecraft/src/ItemMap.java.patch b/patches/minecraft/net/minecraft/src/ItemMap.java.patch deleted file mode 100644 index 875518d5e..000000000 --- a/patches/minecraft/net/minecraft/src/ItemMap.java.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ItemMap.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ItemMap.java 0000-00-00 00:00:00.000000000 -0000 -@@ -83,7 +83,7 @@ - byte var23 = 0; - byte var24 = 0; - byte var25 = 0; -- int[] var26 = new int[256]; -+ int[] var26 = new int[Block.blocksList.length]; - Chunk var27 = par1World.getChunkFromBlockCoords(var21, var22); - int var28 = var21 & 15; - int var29 = var22 & 15; -@@ -173,7 +173,7 @@ - var33 = 0; - var34 = 0; - -- for (var35 = 0; var35 < 256; ++var35) -+ for (var35 = 0; var35 < Block.blocksList.length; ++var35) - { - if (var26[var35] > var33) - { diff --git a/patches/minecraft/net/minecraft/src/ItemRenderer.java.patch b/patches/minecraft/net/minecraft/src/ItemRenderer.java.patch deleted file mode 100644 index 720b105cd..000000000 --- a/patches/minecraft/net/minecraft/src/ItemRenderer.java.patch +++ /dev/null @@ -1,99 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ItemRenderer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ItemRenderer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,12 @@ - package net.minecraft.src; - - import net.minecraft.client.Minecraft; -+import net.minecraft.src.forge.ForgeHooksClient; -+import net.minecraft.src.forge.IItemRenderer; -+import net.minecraft.src.forge.MinecraftForgeClient; -+import static net.minecraft.src.forge.IItemRenderer.ItemRenderType.*; -+import static net.minecraft.src.forge.IItemRenderer.ItemRendererHelper.*; -+ - import org.lwjgl.opengl.GL11; - import org.lwjgl.opengl.GL12; - -@@ -35,22 +41,21 @@ - public void renderItem(EntityLiving par1EntityLiving, ItemStack par2ItemStack, int par3) - { - GL11.glPushMatrix(); -+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(par2ItemStack, EQUIPPED); - -- if (par2ItemStack.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[par2ItemStack.itemID].getRenderType())) -+ if (customRenderer != null) -+ { -+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture(par2ItemStack.getItem().getTextureFile())); -+ ForgeHooksClient.renderEquippedItem(customRenderer, renderBlocksInstance, par1EntityLiving, par2ItemStack); -+ } -+ else if (par2ItemStack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.blocksList[par2ItemStack.itemID].getRenderType())) - { -- GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); -+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture(par2ItemStack.getItem().getTextureFile())); - this.renderBlocksInstance.renderBlockAsItem(Block.blocksList[par2ItemStack.itemID], par2ItemStack.getItemDamage(), 1.0F); - } - else - { -- if (par2ItemStack.itemID < 256) -- { -- GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png")); -- } -- else -- { -- GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/items.png")); -- } -+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture(par2ItemStack.getItem().getTextureFile())); - - Tessellator var4 = Tessellator.instance; - int var5 = par1EntityLiving.getItemIcon(par2ItemStack, par3); -@@ -246,8 +251,10 @@ - float var11; - float var13; - -- if (var14 != null && var14.itemID == Item.map.shiftedIndex) -+ if (var14 != null && var14.getItem() instanceof ItemMap) - { -+ IItemRenderer custom = MinecraftForgeClient.getItemRenderer(var14, FIRST_PERSON_MAP); -+ - GL11.glPushMatrix(); - var7 = 0.8F; - var17 = var3.getSwingProgress(par1); -@@ -313,8 +320,15 @@ - var26.addVertexWithUV((double)(128 + var27), (double)(0 - var27), 0.0D, 1.0D, 0.0D); - var26.addVertexWithUV((double)(0 - var27), (double)(0 - var27), 0.0D, 0.0D, 0.0D); - var26.draw(); -- MapData var23 = Item.map.getMapData(var14, this.mc.theWorld); -- this.mapItemRenderer.renderMap(this.mc.thePlayer, this.mc.renderEngine, var23); -+ MapData var23 = ((ItemMap)var14.getItem()).getMapData(var14, this.mc.theWorld); -+ if (custom == null) -+ { -+ this.mapItemRenderer.renderMap(this.mc.thePlayer, this.mc.renderEngine, var23); -+ } -+ else -+ { -+ custom.renderItem(FIRST_PERSON_MAP, var14, mc.thePlayer, mc.renderEngine, var23); -+ } - GL11.glPopMatrix(); - } - else if (var14 != null) -@@ -414,12 +428,15 @@ - if (var14.getItem().requiresMultipleRenderPasses()) - { - this.renderItem(var3, var14, 0); -- var9 = Item.itemsList[var14.itemID].getColorFromDamage(var14.getItemDamage(), 1); -- var10 = (float)(var9 >> 16 & 255) / 255.0F; -- var11 = (float)(var9 >> 8 & 255) / 255.0F; -- var12 = (float)(var9 & 255) / 255.0F; -- GL11.glColor4f(var6 * var10, var6 * var11, var6 * var12, 1.0F); -- this.renderItem(var3, var14, 1); -+ for (int x = 1; x < var14.getItem().getRenderPasses(var14.getItemDamage()); x++) -+ { -+ var9 = Item.itemsList[var14.itemID].getColorFromDamage(var14.getItemDamage(), x); -+ var10 = (float)(var9 >> 16 & 255) / 255.0F; -+ var11 = (float)(var9 >> 8 & 255) / 255.0F; -+ var12 = (float)(var9 & 255) / 255.0F; -+ GL11.glColor4f(var6 * var10, var6 * var11, var6 * var12, 1.0F); -+ this.renderItem(var3, var14, x); -+ } - } - else - { diff --git a/patches/minecraft/net/minecraft/src/ItemShears.java.patch b/patches/minecraft/net/minecraft/src/ItemShears.java.patch deleted file mode 100644 index 343de9a58..000000000 --- a/patches/minecraft/net/minecraft/src/ItemShears.java.patch +++ /dev/null @@ -1,89 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ItemShears.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ItemShears.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,8 @@ - package net.minecraft.src; - -+import java.util.ArrayList; -+import net.minecraft.src.forge.IShearable; -+ - public class ItemShears extends Item - { - public ItemShears(int par1) -@@ -11,13 +14,12 @@ - - public boolean onBlockDestroyed(ItemStack par1ItemStack, int par2, int par3, int par4, int par5, EntityLiving par6EntityLiving) - { -- if (par2 != Block.leaves.blockID && par2 != Block.web.blockID && par2 != Block.tallGrass.blockID && par2 != Block.vine.blockID) -+ if (par2 != Block.leaves.blockID && par2 != Block.web.blockID && par2 != Block.tallGrass.blockID && par2 != Block.vine.blockID && !(Block.blocksList[par2] instanceof IShearable)) - { - return super.onBlockDestroyed(par1ItemStack, par2, par3, par4, par5, par6EntityLiving); - } - else - { -- par1ItemStack.damageItem(1, par6EntityLiving); - return true; - } - } -@@ -38,4 +40,62 @@ - { - return par2Block.blockID != Block.web.blockID && par2Block.blockID != Block.leaves.blockID ? (par2Block.blockID == Block.cloth.blockID ? 5.0F : super.getStrVsBlock(par1ItemStack, par2Block)) : 15.0F; - } -+ -+ @Override -+ public void useItemOnEntity(ItemStack itemstack, EntityLiving entity) -+ { -+ if (entity.worldObj.isRemote) -+ { -+ return; -+ } -+ if (entity instanceof IShearable) -+ { -+ IShearable target = (IShearable)entity; -+ if (target.isShearable(itemstack, entity.worldObj, (int)entity.posX, (int)entity.posY, (int)entity.posZ)) -+ { -+ ArrayList drops = target.onSheared(itemstack, entity.worldObj, (int)entity.posX, (int)entity.posY, (int)entity.posZ, -+ EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, itemstack)); -+ for(ItemStack stack : drops) -+ { -+ EntityItem ent = entity.entityDropItem(stack, 1.0F); -+ ent.motionY += entity.rand.nextFloat() * 0.05F; -+ ent.motionX += (entity.rand.nextFloat() - entity.rand.nextFloat()) * 0.1F; -+ ent.motionZ += (entity.rand.nextFloat() - entity.rand.nextFloat()) * 0.1F; -+ } -+ itemstack.damageItem(1, entity); -+ } -+ } -+ } -+ -+ @Override -+ public boolean onBlockStartBreak(ItemStack itemstack, int x, int y, int z, EntityPlayer player) -+ { -+ if (player.worldObj.isRemote) -+ { -+ return false; -+ } -+ int id = player.worldObj.getBlockId(x, y, z); -+ if (Block.blocksList[id] != null && Block.blocksList[id] instanceof IShearable) -+ { -+ IShearable target = (IShearable)Block.blocksList[id]; -+ if (target.isShearable(itemstack, player.worldObj, x, y, z)) -+ { -+ ArrayList drops = target.onSheared(itemstack, player.worldObj, x, y, z, -+ EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, itemstack)); -+ for(ItemStack stack : drops) -+ { -+ float f = 0.7F; -+ double d = (double)(player.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; -+ double d1 = (double)(player.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; -+ double d2 = (double)(player.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; -+ EntityItem entityitem = new EntityItem(player.worldObj, (double)x + d, (double)y + d1, (double)z + d2, stack); -+ entityitem.delayBeforeCanPickup = 10; -+ player.worldObj.spawnEntityInWorld(entityitem); -+ } -+ itemstack.damageItem(1, player); -+ player.addStat(StatList.mineBlockStatArray[id], 1); -+ } -+ } -+ return false; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/ItemTool.java.patch b/patches/minecraft/net/minecraft/src/ItemTool.java.patch deleted file mode 100644 index b7b67bb67..000000000 --- a/patches/minecraft/net/minecraft/src/ItemTool.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/ItemTool.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/ItemTool.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,13 +1,15 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ItemTool extends Item - { - /** Array of blocks the tool has extra effect against. */ - private Block[] blocksEffectiveAgainst; -- protected float efficiencyOnProperMaterial = 4.0F; -+ public float efficiencyOnProperMaterial = 4.0F; - - /** Damage versus entities. */ -- private int damageVsEntity; -+ public int damageVsEntity; - - /** The material this tool is made from. */ - protected EnumToolMaterial toolMaterial; -@@ -79,4 +81,15 @@ - { - return this.toolMaterial.getEnchantability(); - } -+ -+ /** FORGE: Overridden to allow custom tool effectiveness */ -+ @Override -+ public float getStrVsBlock(ItemStack stack, Block block, int meta) -+ { -+ if (ForgeHooks.isToolEffective(stack, block, meta)) -+ { -+ return efficiencyOnProperMaterial; -+ } -+ return getStrVsBlock(stack, block); -+ } - } diff --git a/patches/minecraft/net/minecraft/src/MovingObjectPosition.java.patch b/patches/minecraft/net/minecraft/src/MovingObjectPosition.java.patch deleted file mode 100644 index 6f0af78f8..000000000 --- a/patches/minecraft/net/minecraft/src/MovingObjectPosition.java.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/MovingObjectPosition.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/MovingObjectPosition.java 0000-00-00 00:00:00.000000000 -0000 -@@ -25,6 +25,9 @@ - - /** The hit entity */ - public Entity entityHit; -+ -+ /** Used to determine what sub-segment is hit */ -+ public int subHit = -1; - - public MovingObjectPosition(int par1, int par2, int par3, int par4, Vec3D par5Vec3D) - { diff --git a/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch b/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch deleted file mode 100644 index 134198f16..000000000 --- a/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch +++ /dev/null @@ -1,155 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/NetClientHandler.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/NetClientHandler.java 0000-00-00 00:00:00.000000000 -0000 -@@ -14,9 +14,16 @@ - import java.util.List; - import java.util.Map; - import java.util.Random; -+import java.util.logging.Level; - - import cpw.mods.fml.client.FMLClientHandler; - import net.minecraft.client.Minecraft; -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.ForgeHooksClient; -+import net.minecraft.src.forge.MessageManager; -+import net.minecraft.src.forge.ModCompatibilityClient; -+import net.minecraft.src.forge.packets.ForgePacket; -+import java.io.UnsupportedEncodingException; - - public class NetClientHandler extends NetHandler - { -@@ -50,6 +57,8 @@ - this.mc = par1Minecraft; - Socket var4 = new Socket(InetAddress.getByName(par2Str), par3); - this.netManager = new NetworkManager(var4, "Client", this); -+ -+ ForgeHooks.onConnect(netManager); - } - - /** -@@ -78,6 +87,7 @@ - this.currentServerMaxPlayers = par1Packet1Login.maxPlayers; - ((PlayerControllerMP)this.mc.playerController).setCreative(par1Packet1Login.serverMode == 1); - FMLClientHandler.instance().handleServerLogin(par1Packet1Login, this, netManager); -+ ForgeHooksClient.onLogin(par1Packet1Login, this, netManager); - } - - public void handlePickupSpawn(Packet21PickupSpawn par1Packet21PickupSpawn) -@@ -182,6 +192,19 @@ - { - var8 = new EntityFallingSand(this.worldClient, var2, var4, var6, Block.dragonEgg.blockID); - } -+ -+ try -+ { -+ var8 = ModCompatibilityClient.mlmpVehicleSpawn(par1Packet23VehicleSpawn.type, -+ worldClient, var2, var4, var6, -+ getEntityByID(par1Packet23VehicleSpawn.throwerEntityId), var8); -+ } -+ catch (Exception e) -+ { -+ ModLoader.getLogger().throwing("NetClientHandler", "handleVehicleSpawn", e); -+ ModLoader.throwException(String.format("Error initalizing entity of type %d", par1Packet23VehicleSpawn.type), e); -+ return; -+ } - - if (var8 != null) - { -@@ -438,7 +461,7 @@ - { - short var6 = var4.readShort(); - short var7 = var4.readShort(); -- int var8 = (var7 & 4095) >> 4; -+ int var8 = (var7 & 0xFFF0) >> 4; //4096 fix, And vanilla bug fix - int var9 = var7 & 15; - int var10 = var6 >> 12 & 15; - int var11 = var6 >> 8 & 15; -@@ -486,7 +509,7 @@ - - public void handleKickDisconnect(Packet255KickDisconnect par1Packet255KickDisconnect) - { -- this.netManager.networkShutdown("disconnect.kicked", new Object[0]); -+ this.netManager.networkShutdown("disconnect.kicked", par1Packet255KickDisconnect.reason); - this.disconnected = true; - this.mc.changeWorld1((World)null); - this.mc.displayGuiScreen(new GuiDisconnected("disconnect.disconnected", "disconnect.genericReason", new Object[] {par1Packet255KickDisconnect.reason})); -@@ -550,8 +573,12 @@ - - public void handleChat(Packet3Chat par1Packet3Chat) - { -- FMLClientHandler.instance().handleChatPacket(par1Packet3Chat); -- this.mc.ingameGUI.addChatMessage(par1Packet3Chat.message); -+ par1Packet3Chat.message = ForgeHooks.onClientChatRecv(par1Packet3Chat.message); -+ if (par1Packet3Chat.message != null) -+ { -+ FMLClientHandler.instance().handleChatPacket(par1Packet3Chat); -+ this.mc.ingameGUI.addChatMessage(par1Packet3Chat.message); -+ } - } - - public void handleAnimation(Packet18Animation par1Packet18Animation) -@@ -641,7 +668,7 @@ - } - else if (par1Packet2Handshake.username.equals("-")) - { -- this.addToSendQueue(new Packet1Login(this.mc.session.username, 29)); -+ this.addToSendQueue(ForgeHooksClient.onSendLogin(new Packet1Login(this.mc.session.username, 29))); - } - else - { -@@ -654,7 +681,7 @@ - - if (var6.equalsIgnoreCase("ok")) - { -- this.addToSendQueue(new Packet1Login(this.mc.session.username, 29)); -+ this.addToSendQueue(ForgeHooksClient.onSendLogin(new Packet1Login(this.mc.session.username, 29))); - } - else - { -@@ -835,6 +862,9 @@ - case 5: - var2.displayGUIBrewingStand(new TileEntityBrewingStand()); - var2.craftingInventory.windowId = par1Packet100OpenWindow.windowId; -+ break; -+ default: -+ ModCompatibilityClient.mlmpOpenWindow(par1Packet100OpenWindow); - } - } - -@@ -941,6 +971,19 @@ - { - ((TileEntityMobSpawner)var2).setMobID(EntityList.getStringFromID(par1Packet132TileEntityData.customParam1)); - } -+ else if (var2 != null) -+ { -+ var2.onDataPacket(netManager, par1Packet132TileEntityData); -+ } -+ else -+ { -+ Packet132TileEntityData pkt = par1Packet132TileEntityData; -+ ModLoader.getLogger().log(Level.WARNING, String.format( -+ "Received a TileEntityData packet for a location that did not have a TileEntity: (%d, %d, %d) %d: %d, %d, %d", -+ pkt.xPosition, pkt.yPosition, pkt.zPosition, -+ pkt.actionType, -+ pkt.customParam1, pkt.customParam2, pkt.customParam3)); -+ } - } - } - -@@ -1014,6 +1057,10 @@ - { - ItemMap.getMPMapData(par1Packet131MapData.uniqueID, this.mc.theWorld).updateMPMapData(par1Packet131MapData.itemData); - } -+ else if (ForgeHooks.onItemDataPacket(netManager, par1Packet131MapData)) -+ { -+ ; -+ } - else - { - System.out.println("Unknown itemid: " + par1Packet131MapData.uniqueID); -@@ -1120,5 +1167,6 @@ - public void handleCustomPayload(Packet250CustomPayload par1Packet250CustomPayload) - { - FMLClientHandler.instance().handlePacket250(par1Packet250CustomPayload); -+ ForgeHooksClient.onCustomPayload(par1Packet250CustomPayload, netManager); - } - } diff --git a/patches/minecraft/net/minecraft/src/NetworkManager.java.patch b/patches/minecraft/net/minecraft/src/NetworkManager.java.patch deleted file mode 100644 index e892a033e..000000000 --- a/patches/minecraft/net/minecraft/src/NetworkManager.java.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/NetworkManager.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/NetworkManager.java 0000-00-00 00:00:00.000000000 -0000 -@@ -11,6 +11,8 @@ - import java.util.Collections; - import java.util.List; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class NetworkManager - { - /** Synchronization object used for read and write threads. */ -@@ -307,6 +309,7 @@ - { - ; - } -+ ForgeHooks.onDisconnect(this, par1Str, par2ArrayOfObj); - } - } - -@@ -430,4 +433,14 @@ - { - return par0NetworkManager.writeThread; - } -+ -+ /** -+ * Retrieves the current associated network handler. -+ * Added so modders don't have to use reflection. -+ * @return The current registered Network Handler -+ */ -+ public NetHandler getNetHandler() -+ { -+ return netHandler; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/Packet53BlockChange.java.patch b/patches/minecraft/net/minecraft/src/Packet53BlockChange.java.patch deleted file mode 100644 index d4c5ac62e..000000000 --- a/patches/minecraft/net/minecraft/src/Packet53BlockChange.java.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/Packet53BlockChange.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/Packet53BlockChange.java 0000-00-00 00:00:00.000000000 -0000 -@@ -4,6 +4,8 @@ - import java.io.DataOutputStream; - import java.io.IOException; - -+import net.minecraft.src.forge.ForgeHooksClient; -+ - public class Packet53BlockChange extends Packet - { - /** Block X position. */ -@@ -34,7 +36,14 @@ - this.xPosition = par1DataInputStream.readInt(); - this.yPosition = par1DataInputStream.read(); - this.zPosition = par1DataInputStream.readInt(); -- this.type = par1DataInputStream.read(); -+ if (ForgeHooksClient.enable4096) -+ { -+ this.type = par1DataInputStream.readInt(); -+ } -+ else -+ { -+ this.type = par1DataInputStream.read(); -+ } - this.metadata = par1DataInputStream.read(); - } - -@@ -46,7 +55,14 @@ - par1DataOutputStream.writeInt(this.xPosition); - par1DataOutputStream.write(this.yPosition); - par1DataOutputStream.writeInt(this.zPosition); -- par1DataOutputStream.write(this.type); -+ if (ForgeHooksClient.enable4096) -+ { -+ par1DataOutputStream.writeInt(this.type); -+ } -+ else -+ { -+ par1DataOutputStream.write(this.type); -+ } - par1DataOutputStream.write(this.metadata); - } - -@@ -63,6 +79,6 @@ - */ - public int getPacketSize() - { -- return 11; -+ return ForgeHooksClient.enable4096 ? 14 : 11; - } - } diff --git a/patches/minecraft/net/minecraft/src/PlayerController.java.patch b/patches/minecraft/net/minecraft/src/PlayerController.java.patch deleted file mode 100644 index f7e3de2c6..000000000 --- a/patches/minecraft/net/minecraft/src/PlayerController.java.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/PlayerController.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/PlayerController.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,7 @@ - package net.minecraft.src; - - import net.minecraft.client.Minecraft; -+import net.minecraft.src.forge.ForgeHooks; - - public abstract class PlayerController - { -@@ -39,7 +40,7 @@ - { - var5.playAuxSFX(2001, par1, par2, par3, var6.blockID + (var5.getBlockMetadata(par1, par2, par3) << 12)); - int var7 = var5.getBlockMetadata(par1, par2, par3); -- boolean var8 = var5.setBlockWithNotify(par1, par2, par3, 0); -+ boolean var8 = var6.removeBlockByPlayer(var5, mc.thePlayer, par1, par2, par3); - - if (var8) - { -@@ -86,6 +87,7 @@ - if (var5.stackSize == 0) - { - par1EntityPlayer.inventory.mainInventory[par1EntityPlayer.inventory.currentItem] = null; -+ ForgeHooks.onDestroyCurrentItem(par1EntityPlayer, var5); - } - - return true; diff --git a/patches/minecraft/net/minecraft/src/PlayerControllerCreative.java.patch b/patches/minecraft/net/minecraft/src/PlayerControllerCreative.java.patch deleted file mode 100644 index 3d86ace05..000000000 --- a/patches/minecraft/net/minecraft/src/PlayerControllerCreative.java.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/PlayerControllerCreative.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/PlayerControllerCreative.java 0000-00-00 00:00:00.000000000 -0000 -@@ -52,6 +52,11 @@ - */ - public static void clickBlockCreative(Minecraft par0Minecraft, PlayerController par1PlayerController, int par2, int par3, int par4, int par5) - { -+ ItemStack itemstack = par0Minecraft.thePlayer.getCurrentEquippedItem(); -+ if (itemstack != null && itemstack.getItem().onBlockStartBreak(itemstack, par2, par3, par4, par0Minecraft.thePlayer)) -+ { -+ return; -+ } - if (!par0Minecraft.theWorld.func_48457_a(par0Minecraft.thePlayer, par2, par3, par4, par5)) - { - par1PlayerController.onPlayerDestroyBlock(par2, par3, par4, par5); -@@ -63,6 +68,13 @@ - */ - public boolean onPlayerRightClick(EntityPlayer par1EntityPlayer, World par2World, ItemStack par3ItemStack, int par4, int par5, int par6, int par7) - { -+ if (par3ItemStack != null && -+ par3ItemStack.getItem() != null && -+ par3ItemStack.getItem().onItemUseFirst(par3ItemStack, par1EntityPlayer, par2World, par4, par5, par6, par7)) -+ { -+ return true; -+ } -+ - int var8 = par2World.getBlockId(par4, par5, par6); - - if (var8 > 0 && Block.blocksList[var8].blockActivated(par2World, par4, par5, par6, par1EntityPlayer)) diff --git a/patches/minecraft/net/minecraft/src/PlayerControllerMP.java.patch b/patches/minecraft/net/minecraft/src/PlayerControllerMP.java.patch deleted file mode 100644 index b87ef269c..000000000 --- a/patches/minecraft/net/minecraft/src/PlayerControllerMP.java.patch +++ /dev/null @@ -1,72 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/PlayerControllerMP.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/PlayerControllerMP.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,7 @@ - package net.minecraft.src; - - import net.minecraft.client.Minecraft; -+import net.minecraft.src.forge.ForgeHooks; - - public class PlayerControllerMP extends PlayerController - { -@@ -75,6 +76,11 @@ - */ - public boolean onPlayerDestroyBlock(int par1, int par2, int par3, int par4) - { -+ ItemStack stack = mc.thePlayer.getCurrentEquippedItem(); -+ if (stack != null && stack.getItem().onBlockStartBreak(stack, par1, par2, par3, mc.thePlayer)) -+ { -+ return false; -+ } - if (this.creativeMode) - { - return super.onPlayerDestroyBlock(par1, par2, par3, par4); -@@ -121,7 +127,7 @@ - Block.blocksList[var5].onBlockClicked(this.mc.theWorld, par1, par2, par3, this.mc.thePlayer); - } - -- if (var5 > 0 && Block.blocksList[var5].blockStrength(this.mc.thePlayer) >= 1.0F) -+ if (var5 > 0 && Block.blocksList[var5].blockStrength(mc.theWorld, mc.thePlayer, par1, par2, par3) >= 1.0F) - { - this.onPlayerDestroyBlock(par1, par2, par3, par4); - } -@@ -177,7 +183,7 @@ - } - - Block var6 = Block.blocksList[var5]; -- this.curBlockDamageMP += var6.blockStrength(this.mc.thePlayer); -+ this.curBlockDamageMP += var6.blockStrength(mc.theWorld, mc.thePlayer, par1, par2, par3); - - if (this.stepSoundTickCounter % 4.0F == 0.0F && var6 != null) - { -@@ -263,6 +269,14 @@ - { - this.syncCurrentPlayItem(); - this.netClientHandler.addToSendQueue(new Packet15Place(par4, par5, par6, par7, par1EntityPlayer.inventory.getCurrentItem())); -+ -+ if (par3ItemStack != null && -+ par3ItemStack.getItem() != null && -+ par3ItemStack.getItem().onItemUseFirst(par3ItemStack, par1EntityPlayer, par2World, par4, par5, par6, par7)) -+ { -+ return true; -+ } -+ - int var8 = par2World.getBlockId(par4, par5, par6); - - if (var8 > 0 && Block.blocksList[var8].blockActivated(par2World, par4, par5, par6, par1EntityPlayer)) -@@ -284,7 +298,15 @@ - } - else - { -- return par3ItemStack.useItem(par1EntityPlayer, par2World, par4, par5, par6, par7); -+ if (!par3ItemStack.useItem(par1EntityPlayer, par2World, par4, par5, par6, par7)) -+ { -+ return false; -+ } -+ if (par3ItemStack.stackSize <= 0) -+ { -+ ForgeHooks.onDestroyCurrentItem(par1EntityPlayer, par3ItemStack); -+ } -+ return true; - } - } - diff --git a/patches/minecraft/net/minecraft/src/PlayerControllerSP.java.patch b/patches/minecraft/net/minecraft/src/PlayerControllerSP.java.patch deleted file mode 100644 index a0bdfb656..000000000 --- a/patches/minecraft/net/minecraft/src/PlayerControllerSP.java.patch +++ /dev/null @@ -1,83 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/PlayerControllerSP.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/PlayerControllerSP.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,7 @@ - package net.minecraft.src; - - import net.minecraft.client.Minecraft; -+import net.minecraft.src.forge.ForgeHooks; - - public class PlayerControllerSP extends PlayerController - { -@@ -35,11 +36,17 @@ - */ - public boolean onPlayerDestroyBlock(int par1, int par2, int par3, int par4) - { -+ ItemStack stack = mc.thePlayer.getCurrentEquippedItem(); -+ if (stack != null && stack.getItem().onBlockStartBreak(stack, par1, par2, par3, mc.thePlayer)) -+ { -+ return false; -+ } -+ - int var5 = this.mc.theWorld.getBlockId(par1, par2, par3); - int var6 = this.mc.theWorld.getBlockMetadata(par1, par2, par3); - boolean var7 = super.onPlayerDestroyBlock(par1, par2, par3, par4); - ItemStack var8 = this.mc.thePlayer.getCurrentEquippedItem(); -- boolean var9 = this.mc.thePlayer.canHarvestBlock(Block.blocksList[var5]); -+ boolean var9 = Block.blocksList[var5].canHarvestBlock(mc.thePlayer, var6); - - if (var8 != null) - { -@@ -75,7 +82,7 @@ - Block.blocksList[var5].onBlockClicked(this.mc.theWorld, par1, par2, par3, this.mc.thePlayer); - } - -- if (var5 > 0 && Block.blocksList[var5].blockStrength(this.mc.thePlayer) >= 1.0F) -+ if (var5 > 0 && Block.blocksList[var5].blockStrength(mc.theWorld, mc.thePlayer, par1, par2, par3) >= 1.0F) - { - this.onPlayerDestroyBlock(par1, par2, par3, par4); - } -@@ -117,7 +124,7 @@ - } - - Block var6 = Block.blocksList[var5]; -- this.curBlockDamage += var6.blockStrength(this.mc.thePlayer); -+ this.curBlockDamage += var6.blockStrength(mc.theWorld, this.mc.thePlayer, par1, par2, par3); - - if (this.blockDestroySoundCounter % 4.0F == 0.0F && var6 != null) - { -@@ -195,8 +202,34 @@ - */ - public boolean onPlayerRightClick(EntityPlayer par1EntityPlayer, World par2World, ItemStack par3ItemStack, int par4, int par5, int par6, int par7) - { -+ if (par3ItemStack != null && -+ par3ItemStack.getItem() != null && -+ par3ItemStack.getItem().onItemUseFirst(par3ItemStack, par1EntityPlayer, par2World, par4, par5, par6, par7)) -+ { -+ return true; -+ } -+ - int var8 = par2World.getBlockId(par4, par5, par6); -- return var8 > 0 && Block.blocksList[var8].blockActivated(par2World, par4, par5, par6, par1EntityPlayer) ? true : (par3ItemStack == null ? false : par3ItemStack.useItem(par1EntityPlayer, par2World, par4, par5, par6, par7)); -+ if (var8 > 0 && Block.blocksList[var8].blockActivated(par2World, par4, par5, par6, par1EntityPlayer)) -+ { -+ return true; -+ } -+ -+ if (par3ItemStack == null) -+ { -+ return false; -+ } -+ -+ if (!par3ItemStack.useItem(par1EntityPlayer, par2World, par4, par5, par6, par7)) -+ { -+ return false; -+ } -+ -+ if (par3ItemStack.stackSize <= 0) -+ { -+ ForgeHooks.onDestroyCurrentItem(par1EntityPlayer, par3ItemStack); -+ } -+ return true; - } - - public boolean func_35642_f() diff --git a/patches/minecraft/net/minecraft/src/RailLogic.java.patch b/patches/minecraft/net/minecraft/src/RailLogic.java.patch deleted file mode 100644 index 8e40775ce..000000000 --- a/patches/minecraft/net/minecraft/src/RailLogic.java.patch +++ /dev/null @@ -1,89 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/RailLogic.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/RailLogic.java 0000-00-00 00:00:00.000000000 -0000 -@@ -3,7 +3,7 @@ - import java.util.ArrayList; - import java.util.List; - --class RailLogic -+public class RailLogic - { - /** Reference to the World object. */ - private World worldObj; -@@ -18,6 +18,7 @@ - private List connectedTracks; - - final BlockRail rail; -+ private final boolean canMakeSlopes; - - public RailLogic(BlockRail par1BlockRail, World par2World, int par3, int par4, int par5) - { -@@ -28,18 +29,12 @@ - this.trackY = par4; - this.trackZ = par5; - int var6 = par2World.getBlockId(par3, par4, par5); -- int var7 = par2World.getBlockMetadata(par3, par4, par5); -- -- if (BlockRail.isPoweredBlockRail((BlockRail)Block.blocksList[var6])) -- { -- this.isPoweredRail = true; -- var7 &= -9; -- } -- else -- { -- this.isPoweredRail = false; -- } -- -+ -+ BlockRail target = (BlockRail)Block.blocksList[var6]; -+ int var7 = target.getBasicRailMetadata(par2World, null, par3, par4, par5); -+ isPoweredRail = !target.isFlexibleRail(par2World, par3, par4, par5); -+ canMakeSlopes = target.canMakeSlopes(par2World, par3, par4, par5); -+ - this.setConnections(var7); - } - -@@ -258,7 +253,7 @@ - } - } - -- if (var6 == 0) -+ if (var6 == 0 && canMakeSlopes) - { - if (BlockRail.isRailBlockAt(this.worldObj, this.trackX, this.trackY + 1, this.trackZ - 1)) - { -@@ -271,7 +266,7 @@ - } - } - -- if (var6 == 1) -+ if (var6 == 1 && canMakeSlopes) - { - if (BlockRail.isRailBlockAt(this.worldObj, this.trackX + 1, this.trackY + 1, this.trackZ)) - { -@@ -422,7 +417,7 @@ - } - } - -- if (var7 == 0) -+ if (var7 == 0 && canMakeSlopes) - { - if (BlockRail.isRailBlockAt(this.worldObj, this.trackX, this.trackY + 1, this.trackZ - 1)) - { -@@ -435,7 +430,7 @@ - } - } - -- if (var7 == 1) -+ if (var7 == 1 && canMakeSlopes) - { - if (BlockRail.isRailBlockAt(this.worldObj, this.trackX + 1, this.trackY + 1, this.trackZ)) - { -@@ -485,7 +480,7 @@ - /** - * get number of adjacent tracks - */ -- static int getNAdjacentTracks(RailLogic par0RailLogic) -+ public static int getNAdjacentTracks(RailLogic par0RailLogic) - { - return par0RailLogic.getAdjacentTracks(); - } diff --git a/patches/minecraft/net/minecraft/src/RenderBiped.java.patch b/patches/minecraft/net/minecraft/src/RenderBiped.java.patch deleted file mode 100644 index aadf06dc7..000000000 --- a/patches/minecraft/net/minecraft/src/RenderBiped.java.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/RenderBiped.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/RenderBiped.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,10 @@ - package net.minecraft.src; - -+import static net.minecraft.src.forge.IItemRenderer.ItemRenderType.EQUIPPED; -+import static net.minecraft.src.forge.IItemRenderer.ItemRendererHelper.BLOCK_3D; -+import net.minecraft.src.forge.IItemRenderer; -+import net.minecraft.src.forge.MinecraftForgeClient; -+ - import org.lwjgl.opengl.GL11; - - public class RenderBiped extends RenderLiving -@@ -32,7 +37,10 @@ - GL11.glTranslatef(-0.0625F, 0.4375F, 0.0625F); - float var4; - -- if (var3.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType())) -+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var3, EQUIPPED); -+ boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, var3, BLOCK_3D)); -+ -+ if (var3.getItem() instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType()))) - { - var4 = 0.5F; - GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); -@@ -72,7 +80,10 @@ - - if (var3.getItem().requiresMultipleRenderPasses()) - { -- this.renderManager.itemRenderer.renderItem(par1EntityLiving, var3, 1); -+ for (int x = 1; x < var3.getItem().getRenderPasses(var3.getItemDamage()); x++) -+ { -+ this.renderManager.itemRenderer.renderItem(par1EntityLiving, var3, x); -+ } - } - - GL11.glPopMatrix(); diff --git a/patches/minecraft/net/minecraft/src/RenderBlocks.java.patch b/patches/minecraft/net/minecraft/src/RenderBlocks.java.patch deleted file mode 100644 index 00d63342b..000000000 --- a/patches/minecraft/net/minecraft/src/RenderBlocks.java.patch +++ /dev/null @@ -1,140 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/RenderBlocks.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/RenderBlocks.java 0000-00-00 00:00:00.000000000 -0000 -@@ -456,9 +456,8 @@ - public boolean renderBlockBed(Block par1Block, int par2, int par3, int par4) - { - Tessellator var5 = Tessellator.instance; -- int var6 = this.blockAccess.getBlockMetadata(par2, par3, par4); -- int var7 = BlockBed.getDirection(var6); -- boolean var8 = BlockBed.isBlockFootOfBed(var6); -+ int var7 = par1Block.getBedDirection(blockAccess, par2, par3, par4); -+ boolean var8 = par1Block.isBedFoot(blockAccess, par2, par3, par4); - float var9 = 0.5F; - float var10 = 1.0F; - float var11 = 0.8F; -@@ -1386,7 +1385,7 @@ - double var30; - double var32; - -- if (!this.blockAccess.isBlockNormalCube(par2, par3 - 1, par4) && !Block.fire.canBlockCatchFire(this.blockAccess, par2, par3 - 1, par4)) -+ if (!this.blockAccess.isBlockNormalCube(par2, par3 - 1, par4) && !Block.fire.canBlockCatchFire(this.blockAccess, par2, par3 - 1, par4, 1)) - { - float var36 = 0.2F; - float var19 = 0.0625F; -@@ -1406,7 +1405,7 @@ - var9 = var20; - } - -- if (Block.fire.canBlockCatchFire(this.blockAccess, par2 - 1, par3, par4)) -+ if (Block.fire.canBlockCatchFire(this.blockAccess, par2 - 1, par3, par4, 5)) - { - var5.addVertexWithUV((double)((float)par2 + var36), (double)((float)par3 + var17 + var19), (double)(par4 + 1), var11, var13); - var5.addVertexWithUV((double)(par2 + 0), (double)((float)(par3 + 0) + var19), (double)(par4 + 1), var11, var15); -@@ -1418,7 +1417,7 @@ - var5.addVertexWithUV((double)((float)par2 + var36), (double)((float)par3 + var17 + var19), (double)(par4 + 1), var11, var13); - } - -- if (Block.fire.canBlockCatchFire(this.blockAccess, par2 + 1, par3, par4)) -+ if (Block.fire.canBlockCatchFire(this.blockAccess, par2 + 1, par3, par4, 4)) - { - var5.addVertexWithUV((double)((float)(par2 + 1) - var36), (double)((float)par3 + var17 + var19), (double)(par4 + 0), var9, var13); - var5.addVertexWithUV((double)(par2 + 1 - 0), (double)((float)(par3 + 0) + var19), (double)(par4 + 0), var9, var15); -@@ -1430,7 +1429,7 @@ - var5.addVertexWithUV((double)((float)(par2 + 1) - var36), (double)((float)par3 + var17 + var19), (double)(par4 + 0), var9, var13); - } - -- if (Block.fire.canBlockCatchFire(this.blockAccess, par2, par3, par4 - 1)) -+ if (Block.fire.canBlockCatchFire(this.blockAccess, par2, par3, par4 - 1, 3)) - { - var5.addVertexWithUV((double)(par2 + 0), (double)((float)par3 + var17 + var19), (double)((float)par4 + var36), var11, var13); - var5.addVertexWithUV((double)(par2 + 0), (double)((float)(par3 + 0) + var19), (double)(par4 + 0), var11, var15); -@@ -1442,7 +1441,7 @@ - var5.addVertexWithUV((double)(par2 + 0), (double)((float)par3 + var17 + var19), (double)((float)par4 + var36), var11, var13); - } - -- if (Block.fire.canBlockCatchFire(this.blockAccess, par2, par3, par4 + 1)) -+ if (Block.fire.canBlockCatchFire(this.blockAccess, par2, par3, par4 + 1, 2)) - { - var5.addVertexWithUV((double)(par2 + 1), (double)((float)par3 + var17 + var19), (double)((float)(par4 + 1) - var36), var9, var13); - var5.addVertexWithUV((double)(par2 + 1), (double)((float)(par3 + 0) + var19), (double)(par4 + 1 - 0), var9, var15); -@@ -1454,7 +1453,7 @@ - var5.addVertexWithUV((double)(par2 + 1), (double)((float)par3 + var17 + var19), (double)((float)(par4 + 1) - var36), var9, var13); - } - -- if (Block.fire.canBlockCatchFire(this.blockAccess, par2, par3 + 1, par4)) -+ if (Block.fire.canBlockCatchFire(this.blockAccess, par2, par3 + 1, par4, 0)) - { - var20 = (double)par2 + 0.5D + 0.5D; - var22 = (double)par2 + 0.5D - 0.5D; -@@ -3610,7 +3609,7 @@ - var27 = par1Block.getBlockTexture(this.blockAccess, par2, par3, par4, 2); - this.renderEastFace(par1Block, (double)par2, (double)par3, (double)par4, var27); - -- if (cfgGrassFix && var27 == 3 && this.overrideBlockTexture < 0) -+ if (Tessellator.instance.defaultTexture && cfgGrassFix && var27 == 3 && this.overrideBlockTexture < 0) - { - this.colorRedTopLeft *= par5; - this.colorRedBottomLeft *= par5; -@@ -3733,7 +3732,7 @@ - var27 = par1Block.getBlockTexture(this.blockAccess, par2, par3, par4, 3); - this.renderWestFace(par1Block, (double)par2, (double)par3, (double)par4, par1Block.getBlockTexture(this.blockAccess, par2, par3, par4, 3)); - -- if (cfgGrassFix && var27 == 3 && this.overrideBlockTexture < 0) -+ if (Tessellator.instance.defaultTexture && cfgGrassFix && var27 == 3 && this.overrideBlockTexture < 0) - { - this.colorRedTopLeft *= par5; - this.colorRedBottomLeft *= par5; -@@ -3856,7 +3855,7 @@ - var27 = par1Block.getBlockTexture(this.blockAccess, par2, par3, par4, 4); - this.renderNorthFace(par1Block, (double)par2, (double)par3, (double)par4, var27); - -- if (cfgGrassFix && var27 == 3 && this.overrideBlockTexture < 0) -+ if (Tessellator.instance.defaultTexture && cfgGrassFix && var27 == 3 && this.overrideBlockTexture < 0) - { - this.colorRedTopLeft *= par5; - this.colorRedBottomLeft *= par5; -@@ -3979,7 +3978,7 @@ - var27 = par1Block.getBlockTexture(this.blockAccess, par2, par3, par4, 5); - this.renderSouthFace(par1Block, (double)par2, (double)par3, (double)par4, var27); - -- if (cfgGrassFix && var27 == 3 && this.overrideBlockTexture < 0) -+ if (Tessellator.instance.defaultTexture && cfgGrassFix && var27 == 3 && this.overrideBlockTexture < 0) - { - this.colorRedTopLeft *= par5; - this.colorRedBottomLeft *= par5; -@@ -4091,7 +4090,7 @@ - var28 = par1Block.getBlockTexture(this.blockAccess, par2, par3, par4, 2); - this.renderEastFace(par1Block, (double)par2, (double)par3, (double)par4, var28); - -- if (cfgGrassFix && var28 == 3 && this.overrideBlockTexture < 0) -+ if (Tessellator.instance.defaultTexture && cfgGrassFix && var28 == 3 && this.overrideBlockTexture < 0) - { - var8.setColorOpaque_F(var18 * par5, var21 * par6, var24 * par7); - this.renderEastFace(par1Block, (double)par2, (double)par3, (double)par4, 38); -@@ -4107,7 +4106,7 @@ - var28 = par1Block.getBlockTexture(this.blockAccess, par2, par3, par4, 3); - this.renderWestFace(par1Block, (double)par2, (double)par3, (double)par4, var28); - -- if (cfgGrassFix && var28 == 3 && this.overrideBlockTexture < 0) -+ if (Tessellator.instance.defaultTexture && cfgGrassFix && var28 == 3 && this.overrideBlockTexture < 0) - { - var8.setColorOpaque_F(var18 * par5, var21 * par6, var24 * par7); - this.renderWestFace(par1Block, (double)par2, (double)par3, (double)par4, 38); -@@ -4123,7 +4122,7 @@ - var28 = par1Block.getBlockTexture(this.blockAccess, par2, par3, par4, 4); - this.renderNorthFace(par1Block, (double)par2, (double)par3, (double)par4, var28); - -- if (cfgGrassFix && var28 == 3 && this.overrideBlockTexture < 0) -+ if (Tessellator.instance.defaultTexture && cfgGrassFix && var28 == 3 && this.overrideBlockTexture < 0) - { - var8.setColorOpaque_F(var19 * par5, var22 * par6, var25 * par7); - this.renderNorthFace(par1Block, (double)par2, (double)par3, (double)par4, 38); -@@ -4139,7 +4138,7 @@ - var28 = par1Block.getBlockTexture(this.blockAccess, par2, par3, par4, 5); - this.renderSouthFace(par1Block, (double)par2, (double)par3, (double)par4, var28); - -- if (cfgGrassFix && var28 == 3 && this.overrideBlockTexture < 0) -+ if (Tessellator.instance.defaultTexture && cfgGrassFix && var28 == 3 && this.overrideBlockTexture < 0) - { - var8.setColorOpaque_F(var19 * par5, var22 * par6, var25 * par7); - this.renderSouthFace(par1Block, (double)par2, (double)par3, (double)par4, 38); diff --git a/patches/minecraft/net/minecraft/src/RenderEngine.java.patch b/patches/minecraft/net/minecraft/src/RenderEngine.java.patch deleted file mode 100644 index e7043c227..000000000 --- a/patches/minecraft/net/minecraft/src/RenderEngine.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/RenderEngine.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/RenderEngine.java 0000-00-00 00:00:00.000000000 -0000 -@@ -27,6 +27,8 @@ - import cpw.mods.fml.client.FMLClientHandler; - import cpw.mods.fml.common.FMLCommonHandler; - -+import net.minecraft.src.forge.ForgeHooksClient; -+ - public class RenderEngine - { - /** Use mipmaps for all bound textures (unused at present) */ -@@ -59,7 +61,7 @@ - public boolean blurTexture = false; - - /** Texture pack */ -- private TexturePackList texturePack; -+ public TexturePackList texturePack; - - /** Missing texture image */ - private BufferedImage missingTextureImage = new BufferedImage(64, 64, 2); -@@ -169,6 +171,7 @@ - { - try - { -+ ForgeHooksClient.onTextureLoadPre(par1Str); - this.singleIntBuffer.clear(); - GLAllocation.generateTextureNames(this.singleIntBuffer); - int var6 = this.singleIntBuffer.get(0); -@@ -212,6 +215,7 @@ - } - - this.textureMap.put(par1Str, Integer.valueOf(var6)); -+ ForgeHooksClient.onTextureLoad(par1Str, var6); - return var6; - } - catch (Exception var5) diff --git a/patches/minecraft/net/minecraft/src/RenderGlobal.java.patch b/patches/minecraft/net/minecraft/src/RenderGlobal.java.patch deleted file mode 100644 index 00a5ba37a..000000000 --- a/patches/minecraft/net/minecraft/src/RenderGlobal.java.patch +++ /dev/null @@ -1,73 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/RenderGlobal.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/RenderGlobal.java 0000-00-00 00:00:00.000000000 -0000 -@@ -15,10 +15,10 @@ - public List tileEntities = new ArrayList(); - - /** A reference to the World object. */ -- private World worldObj; -+ public World worldObj; - - /** The RenderEngine instance used by RenderGlobal */ -- private RenderEngine renderEngine; -+ public RenderEngine renderEngine; - private List worldRenderersToUpdate = new ArrayList(); - private WorldRenderer[] sortedWorldRenderers; - private WorldRenderer[] worldRenderers; -@@ -30,10 +30,10 @@ - private int glRenderListBase; - - /** A reference to the Minecraft object. */ -- private Minecraft mc; -+ public Minecraft mc; - - /** Global render blocks */ -- private RenderBlocks globalRenderBlocks; -+ public RenderBlocks globalRenderBlocks; - - /** OpenGL occlusion query base */ - private IntBuffer glOcclusionQueryBase; -@@ -1835,6 +1835,7 @@ - double var17 = this.mc.renderViewEntity.posY - par4; - double var19 = this.mc.renderViewEntity.posZ - par6; - EntityFX var21 = null; -+ Object effectObject = null; - - if (par1Str.equals("hugeexplosion")) - { -@@ -1954,6 +1955,7 @@ - else if (par1Str.equals("snowballpoof")) - { - var21 = new EntityBreakingFX(this.worldObj, par2, par4, par6, Item.snowball); -+ effectObject = Item.snowball; - } - else if (par1Str.equals("dripWater")) - { -@@ -1970,6 +1972,7 @@ - else if (par1Str.equals("slime")) - { - var21 = new EntityBreakingFX(this.worldObj, par2, par4, par6, Item.slimeBall); -+ effectObject = Item.slimeBall; - } - else if (par1Str.equals("heart")) - { -@@ -1983,17 +1986,19 @@ - { - var24 = Integer.parseInt(par1Str.substring(par1Str.indexOf("_") + 1)); - var21 = new EntityBreakingFX(this.worldObj, par2, par4, par6, par8, par10, par12, Item.itemsList[var24]); -+ effectObject = Item.itemsList[var24]; - } - else if (par1Str.startsWith("tilecrack_")) - { - var24 = Integer.parseInt(par1Str.substring(par1Str.indexOf("_") + 1)); - var21 = new EntityDiggingFX(this.worldObj, par2, par4, par6, par8, par10, par12, Block.blocksList[var24], 0, 0); -+ effectObject = Block.blocksList[var24]; - } - } - - if (var21 != null) - { -- this.mc.effectRenderer.addEffect((EntityFX)var21); -+ this.mc.effectRenderer.addEffect((EntityFX)var21, effectObject); - } - - return (EntityFX)var21; diff --git a/patches/minecraft/net/minecraft/src/RenderItem.java.patch b/patches/minecraft/net/minecraft/src/RenderItem.java.patch deleted file mode 100644 index 26a5ae756..000000000 --- a/patches/minecraft/net/minecraft/src/RenderItem.java.patch +++ /dev/null @@ -1,115 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/RenderItem.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/RenderItem.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,9 @@ - package net.minecraft.src; - - import java.util.Random; -+ -+import net.minecraft.src.forge.ForgeHooksClient; -+ - import org.lwjgl.opengl.GL11; - import org.lwjgl.opengl.GL12; - -@@ -54,11 +57,15 @@ - float var19; - float var18; - float var23; -- -- if (var10.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[var10.itemID].getRenderType())) -+ -+ if (ForgeHooksClient.renderEntityItem(par1EntityItem, var10, var11, var12, random, renderManager.renderEngine, renderBlocks)) -+ { -+ ; -+ } -+ else if (var10.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.blocksList[var10.itemID].getRenderType())) - { - GL11.glRotatef(var12, 0.0F, 1.0F, 0.0F); -- this.loadTexture("/terrain.png"); -+ this.loadTexture(Block.blocksList[var10.itemID].getTextureFile()); - float var21 = 0.25F; - var15 = Block.blocksList[var10.itemID].getRenderType(); - -@@ -94,10 +101,11 @@ - if (var10.getItem().requiresMultipleRenderPasses()) - { - GL11.glScalef(0.5F, 0.5F, 0.5F); -- this.loadTexture("/gui/items.png"); -+ this.loadTexture(Item.itemsList[var10.itemID].getTextureFile()); - -- for (var14 = 0; var14 <= 1; ++var14) -+ for (var14 = 0; var14 < var10.getItem().getRenderPasses(var10.getItemDamage()); ++var14) - { -+ this.random.setSeed(187L); //Fixes Vanilla bug where layers would not render aligns properly. - var15 = var10.getItem().func_46057_a(var10.getItemDamage(), var14); - var16 = 1.0F; - -@@ -117,15 +125,8 @@ - { - GL11.glScalef(0.5F, 0.5F, 0.5F); - var14 = var10.getIconIndex(); -- -- if (var10.itemID < 256) -- { -- this.loadTexture("/terrain.png"); -- } -- else -- { -- this.loadTexture("/gui/items.png"); -- } -+ -+ this.loadTexture(var10.getItem().getTextureFile()); - - if (this.field_27004_a) - { -@@ -187,9 +188,9 @@ - float var12; - float var13; - -- if (par3 < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[par3].getRenderType())) -+ if (Item.itemsList[par3] instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.blocksList[par3].getRenderType())) - { -- par2RenderEngine.bindTexture(par2RenderEngine.getTexture("/terrain.png")); -+ par2RenderEngine.bindTexture(par2RenderEngine.getTexture(Block.blocksList[par3].getTextureFile())); - Block var15 = Block.blocksList[par3]; - GL11.glPushMatrix(); - GL11.glTranslatef((float)(par6 - 2), (float)(par7 + 3), -3.0F + this.zLevel); -@@ -221,9 +222,9 @@ - if (Item.itemsList[par3].requiresMultipleRenderPasses()) - { - GL11.glDisable(GL11.GL_LIGHTING); -- par2RenderEngine.bindTexture(par2RenderEngine.getTexture("/gui/items.png")); -+ par2RenderEngine.bindTexture(par2RenderEngine.getTexture(Item.itemsList[par3].getTextureFile())); - -- for (var8 = 0; var8 <= 1; ++var8) -+ for (var8 = 0; var8 < Item.itemsList[par3].getRenderPasses(par4); ++var8) - { - int var9 = Item.itemsList[par3].func_46057_a(par4, var8); - var10 = Item.itemsList[par3].getColorFromDamage(par4, var8); -@@ -245,14 +246,7 @@ - { - GL11.glDisable(GL11.GL_LIGHTING); - -- if (par3 < 256) -- { -- par2RenderEngine.bindTexture(par2RenderEngine.getTexture("/terrain.png")); -- } -- else -- { -- par2RenderEngine.bindTexture(par2RenderEngine.getTexture("/gui/items.png")); -- } -+ par2RenderEngine.bindTexture(par2RenderEngine.getTexture(Item.itemsList[par3].getTextureFile())); - - var8 = Item.itemsList[par3].getColorFromDamage(par4, 0); - float var14 = (float)(var8 >> 16 & 255) / 255.0F; -@@ -279,7 +273,10 @@ - { - if (par3ItemStack != null) - { -- this.drawItemIntoGui(par1FontRenderer, par2RenderEngine, par3ItemStack.itemID, par3ItemStack.getItemDamage(), par3ItemStack.getIconIndex(), par4, par5); -+ if (!ForgeHooksClient.renderInventoryItem(renderBlocks, par2RenderEngine, par3ItemStack, field_27004_a, zLevel, (float)par4, (float)par5)) -+ { -+ this.drawItemIntoGui(par1FontRenderer, par2RenderEngine, par3ItemStack.itemID, par3ItemStack.getItemDamage(), par3ItemStack.getIconIndex(), par4, par5); -+ } - - if (par3ItemStack != null && par3ItemStack.hasEffect()) - { diff --git a/patches/minecraft/net/minecraft/src/RenderManager.java.patch b/patches/minecraft/net/minecraft/src/RenderManager.java.patch deleted file mode 100644 index 8d58215cc..000000000 --- a/patches/minecraft/net/minecraft/src/RenderManager.java.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/RenderManager.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/RenderManager.java 0000-00-00 00:00:00.000000000 -0000 -@@ -124,12 +124,14 @@ - - if (par4EntityLiving.isPlayerSleeping()) - { -- int var7 = par1World.getBlockId(MathHelper.floor_double(par4EntityLiving.posX), MathHelper.floor_double(par4EntityLiving.posY), MathHelper.floor_double(par4EntityLiving.posZ)); -+ int x = MathHelper.floor_double(par4EntityLiving.posX); -+ int y = MathHelper.floor_double(par4EntityLiving.posY); -+ int z = MathHelper.floor_double(par4EntityLiving.posZ); -+ Block block = Block.blocksList[par1World.getBlockId(x, y, z)]; - -- if (var7 == Block.bed.blockID) -+ if (block != null && block.isBed(par1World, x, y, z, par4EntityLiving)) - { -- int var8 = par1World.getBlockMetadata(MathHelper.floor_double(par4EntityLiving.posX), MathHelper.floor_double(par4EntityLiving.posY), MathHelper.floor_double(par4EntityLiving.posZ)); -- int var9 = var8 & 3; -+ int var9 = block.getBedDirection(par1World, x, y, z); - this.playerViewY = (float)(var9 * 90 + 180); - this.playerViewX = 0.0F; - } diff --git a/patches/minecraft/net/minecraft/src/RenderPlayer.java.patch b/patches/minecraft/net/minecraft/src/RenderPlayer.java.patch deleted file mode 100644 index cb3ab266a..000000000 --- a/patches/minecraft/net/minecraft/src/RenderPlayer.java.patch +++ /dev/null @@ -1,73 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/RenderPlayer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/RenderPlayer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -4,8 +4,13 @@ - import java.util.Arrays; - import java.util.List; - -+import static net.minecraft.src.forge.IItemRenderer.ItemRenderType.EQUIPPED; -+import static net.minecraft.src.forge.IItemRenderer.ItemRendererHelper.BLOCK_3D; - import net.minecraft.client.Minecraft; - import org.lwjgl.opengl.GL11; -+import net.minecraft.src.forge.IArmorTextureProvider; -+import net.minecraft.src.forge.IItemRenderer; -+import net.minecraft.src.forge.MinecraftForgeClient; - - public class RenderPlayer extends RenderLiving - { -@@ -36,7 +41,14 @@ - if (var5 instanceof ItemArmor) - { - ItemArmor var6 = (ItemArmor)var5; -- this.loadTexture("/armor/" + armorFilenamePrefix[var6.renderIndex] + "_" + (par2 == 2 ? 2 : 1) + ".png"); -+ if (var5 instanceof IArmorTextureProvider) -+ { -+ loadTexture(((IArmorTextureProvider)var5).getArmorTextureFile(var4)); -+ } -+ else -+ { -+ this.loadTexture("/armor/" + armorFilenamePrefix[var6.renderIndex] + "_" + (par2 == 2 ? 2 : 1) + ".png"); -+ } - ModelBiped var7 = par2 == 2 ? this.modelArmor : this.modelArmorChestplate; - var7.bipedHead.showModel = par2 == 0; - var7.bipedHeadwear.showModel = par2 == 0; -@@ -163,12 +175,15 @@ - super.renderEquippedItems(par1EntityPlayer, par2); - ItemStack var3 = par1EntityPlayer.inventory.armorItemInSlot(3); - -- if (var3 != null && var3.getItem().shiftedIndex < 256) -+ if (var3 != null && var3.getItem() instanceof ItemBlock) - { - GL11.glPushMatrix(); - this.modelBipedMain.bipedHead.postRender(0.0625F); - -- if (RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType())) -+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var3, EQUIPPED); -+ boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, var3, BLOCK_3D)); -+ -+ if (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType())) - { - float var4 = 0.625F; - GL11.glTranslatef(0.0F, -0.25F, 0.0F); -@@ -269,8 +284,11 @@ - { - var20 = var21.getItemUseAction(); - } -- -- if (var21.itemID < 256 && RenderBlocks.renderItemIn3d(Block.blocksList[var21.itemID].getRenderType())) -+ -+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var21, EQUIPPED); -+ boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, var21, BLOCK_3D)); -+ -+ if (var21.getItem() instanceof ItemBlock && (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[var21.itemID].getRenderType()))) - { - var6 = 0.5F; - GL11.glTranslatef(0.0F, 0.1875F, -0.3125F); -@@ -323,7 +341,7 @@ - - if (var21.getItem().requiresMultipleRenderPasses()) - { -- for (int var25 = 0; var25 <= 1; ++var25) -+ for (int var25 = 0; var25 < var21.getItem().getRenderPasses(var21.getItemDamage()); ++var25) - { - int var24 = var21.getItem().getColorFromDamage(var21.getItemDamage(), var25); - float var26 = (float)(var24 >> 16 & 255) / 255.0F; diff --git a/patches/minecraft/net/minecraft/src/RenderSnowMan.java.patch b/patches/minecraft/net/minecraft/src/RenderSnowMan.java.patch deleted file mode 100644 index 3386b2db0..000000000 --- a/patches/minecraft/net/minecraft/src/RenderSnowMan.java.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/RenderSnowMan.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/RenderSnowMan.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,10 @@ - package net.minecraft.src; - -+import static net.minecraft.src.forge.IItemRenderer.ItemRenderType.EQUIPPED; -+import static net.minecraft.src.forge.IItemRenderer.ItemRendererHelper.BLOCK_3D; -+import net.minecraft.src.forge.IItemRenderer; -+import net.minecraft.src.forge.MinecraftForgeClient; -+ - import org.lwjgl.opengl.GL11; - - public class RenderSnowMan extends RenderLiving -@@ -19,12 +24,15 @@ - super.renderEquippedItems(par1EntitySnowman, par2); - ItemStack var3 = new ItemStack(Block.pumpkin, 1); - -- if (var3 != null && var3.getItem().shiftedIndex < 256) -+ if (var3 != null && var3.getItem() instanceof ItemBlock) - { - GL11.glPushMatrix(); - this.snowmanModel.field_40305_c.postRender(0.0625F); - -- if (RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType())) -+ IItemRenderer customRenderer = MinecraftForgeClient.getItemRenderer(var3, EQUIPPED); -+ boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(EQUIPPED, var3, BLOCK_3D)); -+ -+ if (is3D || RenderBlocks.renderItemIn3d(Block.blocksList[var3.itemID].getRenderType())) - { - float var4 = 0.625F; - GL11.glTranslatef(0.0F, -0.34375F, 0.0F); diff --git a/patches/minecraft/net/minecraft/src/SlotCrafting.java.patch b/patches/minecraft/net/minecraft/src/SlotCrafting.java.patch deleted file mode 100644 index d7c69e9db..000000000 --- a/patches/minecraft/net/minecraft/src/SlotCrafting.java.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/SlotCrafting.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/SlotCrafting.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,9 @@ - - import cpw.mods.fml.client.FMLClientHandler; - -+import cpw.mods.fml.client.FMLClientHandler; -+import net.minecraft.src.forge.ForgeHooks; -+ - public class SlotCrafting extends Slot - { - /** The craft matrix inventory linked to this result slot. */ -@@ -99,6 +102,7 @@ - public void onPickupFromSlot(ItemStack par1ItemStack) - { - FMLClientHandler.instance().onItemCrafted(thePlayer, par1ItemStack, craftMatrix); -+ ForgeHooks.onTakenFromCrafting(thePlayer, par1ItemStack, craftMatrix); - this.func_48434_c(par1ItemStack); - - for (int var2 = 0; var2 < this.craftMatrix.getSizeInventory(); ++var2) diff --git a/patches/minecraft/net/minecraft/src/SoundManager.java.patch b/patches/minecraft/net/minecraft/src/SoundManager.java.patch deleted file mode 100644 index 1d2071033..000000000 --- a/patches/minecraft/net/minecraft/src/SoundManager.java.patch +++ /dev/null @@ -1,108 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/SoundManager.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/SoundManager.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,9 @@ - - import java.io.File; - import java.util.Random; -+ -+import net.minecraft.src.forge.ForgeHooksClient; -+import net.minecraft.src.forge.ModCompatibilityClient; - import paulscode.sound.SoundSystem; - import paulscode.sound.SoundSystemConfig; - import paulscode.sound.codecs.CodecJOrbis; -@@ -36,10 +39,12 @@ - /** RNG. */ - private Random rand = new Random(); - private int ticksBeforeMusic; -+ -+ public static int MUSIC_INTERVAL = 12000; - - public SoundManager() - { -- this.ticksBeforeMusic = this.rand.nextInt(12000); -+ this.ticksBeforeMusic = this.rand.nextInt(MUSIC_INTERVAL); - } - - /** -@@ -54,6 +59,8 @@ - { - this.tryToSetLibraryAndCodecs(); - } -+ ModCompatibilityClient.audioModLoad(this); -+ ForgeHooksClient.onLoadSoundSettings(this); - } - - /** -@@ -73,6 +80,8 @@ - SoundSystemConfig.setCodec("ogg", CodecJOrbis.class); - SoundSystemConfig.setCodec("mus", CodecMus.class); - SoundSystemConfig.setCodec("wav", CodecWav.class); -+ ModCompatibilityClient.audioModAddCodecs(); -+ ForgeHooksClient.onSetupAudio(this); - sndSystem = new SoundSystem(); - this.options.soundVolume = var1; - this.options.musicVolume = var2; -@@ -161,10 +170,12 @@ - } - - SoundPoolEntry var1 = this.soundPoolMusic.getRandomSound(); -+ var1 = ModCompatibilityClient.audioModPickBackgroundMusic(this, var1); -+ var1 = ForgeHooksClient.onPlayBackgroundMusic(this, var1); - - if (var1 != null) - { -- this.ticksBeforeMusic = this.rand.nextInt(12000) + 12000; -+ this.ticksBeforeMusic = this.rand.nextInt(MUSIC_INTERVAL) + MUSIC_INTERVAL; - sndSystem.backgroundMusic("BgMusic", var1.soundUrl, var1.soundName, false); - sndSystem.setVolume("BgMusic", this.options.musicVolume); - sndSystem.play("BgMusic"); -@@ -214,6 +225,7 @@ - if (par1Str != null) - { - SoundPoolEntry var8 = this.soundPoolStreaming.getRandomSoundFromSoundPool(par1Str); -+ var8 = ForgeHooksClient.onPlayStreaming(this, var8, par1Str, par2, par3, par4); - - if (var8 != null && par5 > 0.0F) - { -@@ -239,6 +251,7 @@ - if (loaded && this.options.soundVolume != 0.0F) - { - SoundPoolEntry var7 = this.soundPoolSounds.getRandomSoundFromSoundPool(par1Str); -+ var7 = ForgeHooksClient.onPlaySound(this, var7, par1Str, par2, par3, par4, par5, par6); - - if (var7 != null && par5 > 0.0F) - { -@@ -274,6 +287,7 @@ - if (loaded && this.options.soundVolume != 0.0F) - { - SoundPoolEntry var4 = this.soundPoolSounds.getRandomSoundFromSoundPool(par1Str); -+ var4 = ForgeHooksClient.onPlaySoundEffect(this, var4, par1Str, par2, par3); - - if (var4 != null) - { -@@ -293,4 +307,25 @@ - } - } - } -+ -+ /** Getters for private class members **/ -+ public static SoundSystem getSoundSystem() -+ { -+ return sndSystem; -+ } -+ -+ public SoundPool getSoundsPool() -+ { -+ return soundPoolSounds; -+ } -+ -+ public SoundPool getStreamingPool() -+ { -+ return soundPoolStreaming; -+ } -+ -+ public SoundPool getMusicPool() -+ { -+ return soundPoolMusic; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/SoundPool.java.patch b/patches/minecraft/net/minecraft/src/SoundPool.java.patch deleted file mode 100644 index 19349d154..000000000 --- a/patches/minecraft/net/minecraft/src/SoundPool.java.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/SoundPool.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/SoundPool.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,7 @@ - - import java.io.File; - import java.net.MalformedURLException; -+import java.net.URL; - import java.util.ArrayList; - import java.util.HashMap; - import java.util.List; -@@ -33,6 +34,25 @@ - */ - public SoundPoolEntry addSound(String par1Str, File par2File) - { -+ try -+ { -+ return addSound(par1Str, par2File.toURI().toURL()); -+ } -+ catch (MalformedURLException ex) -+ { -+ ex.printStackTrace(); -+ throw new RuntimeException(ex); -+ } -+ } -+ /** -+ * URL version of addSound, as the back-end sound engine has full support for various types of URLs -+ * -+ * @param par1Str The name of the sound to add -+ * @param url The url of the sound resource -+ * @return A SoundPoolEntry for the newly added sound -+ */ -+ public SoundPoolEntry addSound(String par1Str, URL url) -+ { - try - { - String var3 = par1Str; -@@ -53,13 +73,13 @@ - this.nameToSoundPoolEntriesMapping.put(par1Str, new ArrayList()); - } - -- SoundPoolEntry var4 = new SoundPoolEntry(var3, par2File.toURI().toURL()); -+ SoundPoolEntry var4 = new SoundPoolEntry(var3, url); - ((List)this.nameToSoundPoolEntriesMapping.get(par1Str)).add(var4); - this.allSoundPoolEntries.add(var4); - ++this.numberOfSoundPoolEntries; - return var4; - } -- catch (MalformedURLException var5) -+ catch (Exception var5) - { - var5.printStackTrace(); - throw new RuntimeException(var5); diff --git a/patches/minecraft/net/minecraft/src/SpawnerAnimals.java.patch b/patches/minecraft/net/minecraft/src/SpawnerAnimals.java.patch deleted file mode 100644 index 71e6785db..000000000 --- a/patches/minecraft/net/minecraft/src/SpawnerAnimals.java.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/SpawnerAnimals.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/SpawnerAnimals.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,10 +1,14 @@ - package net.minecraft.src; - -+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 net.minecraft.src.forge.ForgeHooks; -+ - public final class SpawnerAnimals - { - /** The 17x17 area around the player where mobs can spawn */ -@@ -20,7 +24,7 @@ - { - Chunk var3 = par0World.getChunkFromChunkCoords(par1, par2); - int var4 = par1 * 16 + par0World.rand.nextInt(16); -- int var5 = par0World.rand.nextInt(var3 == null ? 128 : Math.max(128, var3.getTopFilledSegment())); -+ int var5 = par0World.rand.nextInt(var3 == null ? 128 : Math.max(128, var3.getTopFilledSegment() + 15)); //Vanilla Bug that causes mobs to not spawn on the topmost chunk with blocks. - int var6 = par2 * 16 + par0World.rand.nextInt(16); - return new ChunkPosition(var4, var5, var6); - } -@@ -78,6 +82,12 @@ - if ((!var34.getPeacefulCreature() || par2) && (var34.getPeacefulCreature() || par1) && par0World.countEntities(var34.getCreatureClass()) <= var34.getMaxNumberOfCreature() * eligibleChunksForSpawning.size() / 256) - { - Iterator var35 = eligibleChunksForSpawning.keySet().iterator(); -+ if (mod_MinecraftForge.SPAWNER_MAKE_MORE_RANDOM) -+ { -+ ArrayList tmp = new ArrayList(eligibleChunksForSpawning.keySet()); -+ Collections.shuffle(tmp); -+ var35 = tmp.iterator(); -+ } - label108: - - while (var35.hasNext()) -@@ -202,7 +212,8 @@ - else - { - int var5 = par1World.getBlockId(par2, par3 - 1, par4); -- return Block.isNormalCube(var5) && var5 != Block.bedrock.blockID && !par1World.isBlockNormalCube(par2, par3, par4) && !par1World.getBlockMaterial(par2, par3, par4).isLiquid() && !par1World.isBlockNormalCube(par2, par3 + 1, par4); -+ boolean spawnBlock = (Block.blocksList[var5] != null && Block.blocksList[var5].canCreatureSpawn(par0EnumCreatureType, par1World, par2, par3 - 1, par4)); -+ return spawnBlock && var5 != Block.bedrock.blockID && !par1World.isBlockNormalCube(par2, par3, par4) && !par1World.getBlockMaterial(par2, par3, par4).isLiquid() && !par1World.isBlockNormalCube(par2, par3 + 1, par4); - } - } - -@@ -211,6 +222,16 @@ - */ - private static void creatureSpecificInit(EntityLiving par0EntityLiving, World par1World, float par2, float par3, float par4) - { -+ if (ForgeHooks.onEntitySpawnSpecial(par0EntityLiving, par1World, par2, par3, par4)) //Deprecated in 1.2.5, remove in 1.3 -+ { -+ return; -+ } -+ -+ if (ForgeHooks.onEntityLivingSpawn(par0EntityLiving, par1World, par2, par3, par4)) -+ { -+ return; -+ } -+ - if (par0EntityLiving instanceof EntitySpider && par1World.rand.nextInt(100) == 0) - { - EntitySkeleton var7 = new EntitySkeleton(par1World); diff --git a/patches/minecraft/net/minecraft/src/StatList.java.patch b/patches/minecraft/net/minecraft/src/StatList.java.patch deleted file mode 100644 index 40656ca2d..000000000 --- a/patches/minecraft/net/minecraft/src/StatList.java.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/StatList.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/StatList.java 0000-00-00 00:00:00.000000000 -0000 -@@ -166,9 +166,9 @@ - */ - private static StatBase[] initMinableStats(String par0Str, int par1) - { -- StatBase[] var2 = new StatBase[256]; -+ StatBase[] var2 = new StatBase[Block.blocksList.length]; - -- for (int var3 = 0; var3 < 256; ++var3) -+ for (int var3 = 0; var3 < Block.blocksList.length; ++var3) - { - if (Block.blocksList[var3] != null && Block.blocksList[var3].getEnableStats()) - { diff --git a/patches/minecraft/net/minecraft/src/Teleporter.java.patch b/patches/minecraft/net/minecraft/src/Teleporter.java.patch deleted file mode 100644 index 061c33b6c..000000000 --- a/patches/minecraft/net/minecraft/src/Teleporter.java.patch +++ /dev/null @@ -1,41 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/Teleporter.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/Teleporter.java 0000-00-00 00:00:00.000000000 -0000 -@@ -70,7 +70,7 @@ - { - double var15 = (double)var14 + 0.5D - par2Entity.posZ; - -- for (int var17 = 127; var17 >= 0; --var17) -+ for (int var17 = par1World.getHeight() - 1; var17 >= 0; --var17) //BugFix - { - if (par1World.getBlockId(var11, var17, var14) == Block.portal.blockID) - { -@@ -170,7 +170,7 @@ - var18 = (double)var17 + 0.5D - par2Entity.posZ; - label274: - -- for (var20 = 127; var20 >= 0; --var20) -+ for (var20 = par1World.getHeight() - 1; var20 >= 0; --var20) //BugFix - { - if (par1World.isAirBlock(var14, var20, var17)) - { -@@ -236,7 +236,7 @@ - var18 = (double)var17 + 0.5D - par2Entity.posZ; - label222: - -- for (var20 = 127; var20 >= 0; --var20) -+ for (var20 = par1World.getHeight() - 1; var20 >= 0; --var20) //BugFix - { - if (par1World.isAirBlock(var14, var20, var17)) - { -@@ -304,9 +304,9 @@ - var10 = 70; - } - -- if (var10 > 118) -+ if (var10 > par1World.getHeight() - 10) //BugFix - { -- var10 = 118; -+ var10 = par1World.getHeight() - 10; //BugFix - } - - var16 = var10; diff --git a/patches/minecraft/net/minecraft/src/Tessellator.java.patch b/patches/minecraft/net/minecraft/src/Tessellator.java.patch deleted file mode 100644 index 166c4b1d4..000000000 --- a/patches/minecraft/net/minecraft/src/Tessellator.java.patch +++ /dev/null @@ -1,219 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/Tessellator.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/Tessellator.java 0000-00-00 00:00:00.000000000 -0000 -@@ -5,12 +5,20 @@ - import java.nio.FloatBuffer; - import java.nio.IntBuffer; - import java.nio.ShortBuffer; -+import java.util.Arrays; -+ - import org.lwjgl.opengl.ARBVertexBufferObject; - import org.lwjgl.opengl.GL11; - import org.lwjgl.opengl.GLContext; - - public class Tessellator - { -+ private static int nativeBufferSize = 0x200000; -+ private static int trivertsInBuffer = (nativeBufferSize / 48) * 6; -+ public static boolean renderingWorldRenderer = false; -+ public boolean defaultTexture = false; -+ private int rawBufferSize = 0; -+ public int textureID = 0; - /** - * Boolean used to check whether quads should be drawn as four triangles. Initialized to true and never changed. - */ -@@ -22,16 +30,16 @@ - private static boolean tryVBO = false; - - /** The byte buffer used for GL allocation. */ -- private ByteBuffer byteBuffer; -+ private static ByteBuffer byteBuffer = GLAllocation.createDirectByteBuffer(nativeBufferSize * 4); - - /** The same memory as byteBuffer, but referenced as an integer buffer. */ -- private IntBuffer intBuffer; -+ private static IntBuffer intBuffer = byteBuffer.asIntBuffer(); - - /** The same memory as byteBuffer, but referenced as an float buffer. */ -- private FloatBuffer floatBuffer; -+ private static FloatBuffer floatBuffer = byteBuffer.asFloatBuffer(); - - /** Short buffer */ -- private ShortBuffer shortBuffer; -+ private static ShortBuffer shortBuffer = byteBuffer.asShortBuffer(); - - /** Raw integer array. */ - private int[] rawBuffer; -@@ -80,37 +88,37 @@ - private boolean isColorDisabled = false; - - /** The draw mode currently being used by the tessellator. */ -- private int drawMode; -+ public int drawMode; - - /** - * An offset to be applied along the x-axis for all vertices in this draw call. - */ -- private double xOffset; -+ public double xOffset; - - /** - * An offset to be applied along the y-axis for all vertices in this draw call. - */ -- private double yOffset; -+ public double yOffset; - - /** - * An offset to be applied along the z-axis for all vertices in this draw call. - */ -- private double zOffset; -+ public double zOffset; - - /** The normal to be applied to the face being drawn. */ - private int normal; - - /** The static instance of the Tessellator. */ -- public static final Tessellator instance = new Tessellator(2097152); -+ public static Tessellator instance = new Tessellator(); - - /** Whether this tessellator is currently in draw mode. */ -- private boolean isDrawing = false; -+ public boolean isDrawing = false; - - /** Whether we are currently using VBO or not. */ -- private boolean useVBO = false; -+ private static boolean useVBO = false; - - /** An IntBuffer used to store the indices of vertex buffer objects. */ -- private IntBuffer vertexBuffers; -+ private static IntBuffer vertexBuffers; - - /** - * The index of the last VBO used. This is used in round-robin fashion, sequentially, through the vboCount vertex -@@ -119,27 +127,23 @@ - private int vboIndex = 0; - - /** Number of vertex buffer objects allocated for use. */ -- private int vboCount = 10; -- -- /** The size of the buffers used (in integers). */ -- private int bufferSize; -+ private static int vboCount = 10; - -- private Tessellator(int par1) -+ static - { -- this.bufferSize = par1; -- this.byteBuffer = GLAllocation.createDirectByteBuffer(par1 * 4); -- this.intBuffer = this.byteBuffer.asIntBuffer(); -- this.floatBuffer = this.byteBuffer.asFloatBuffer(); -- this.shortBuffer = this.byteBuffer.asShortBuffer(); -- this.rawBuffer = new int[par1]; -- this.useVBO = tryVBO && GLContext.getCapabilities().GL_ARB_vertex_buffer_object; -- -- if (this.useVBO) -+ instance.defaultTexture = true; -+ useVBO = tryVBO && GLContext.getCapabilities().GL_ARB_vertex_buffer_object; -+ if (useVBO) - { -- this.vertexBuffers = GLAllocation.createDirectIntBuffer(this.vboCount); -- ARBVertexBufferObject.glGenBuffersARB(this.vertexBuffers); -+ vertexBuffers = GLAllocation.createDirectIntBuffer(vboCount); -+ ARBVertexBufferObject.glGenBuffersARB(vertexBuffers); - } - } -+ -+ public Tessellator() -+ { -+ this.rawBuffer = null; -+ } - - /** - * Draws the data set up in this tessellator and resets the state to prepare for new drawing. -@@ -154,12 +158,23 @@ - { - this.isDrawing = false; - -- if (this.vertexCount > 0) -+ int offs = 0; -+ while (offs < vertexCount) - { -+ int vtc = 0; -+ if (drawMode == 7 && convertQuadsToTriangles) -+ { -+ Math.min(vertexCount - offs, trivertsInBuffer); -+ } -+ else -+ { -+ vtc = Math.min(vertexCount - offs, nativeBufferSize >> 5); -+ } - this.intBuffer.clear(); -- this.intBuffer.put(this.rawBuffer, 0, this.rawBufferIndex); -+ intBuffer.put(rawBuffer, offs * 8, vtc * 8); - this.byteBuffer.position(0); -- this.byteBuffer.limit(this.rawBufferIndex * 4); -+ byteBuffer.limit(vtc * 32); -+ offs += vtc; - - if (this.useVBO) - { -@@ -245,11 +260,11 @@ - - if (this.drawMode == 7 && convertQuadsToTriangles) - { -- GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, this.vertexCount); -+ GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, vtc); - } - else - { -- GL11.glDrawArrays(this.drawMode, 0, this.vertexCount); -+ GL11.glDrawArrays(this.drawMode, 0, vtc); - } - - GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY); -@@ -276,7 +291,13 @@ - GL11.glDisableClientState(GL11.GL_NORMAL_ARRAY); - } - } -- -+ -+ if (rawBufferSize > 0x20000 && rawBufferIndex < (rawBufferSize << 3)) -+ { -+ rawBufferSize = 0; -+ rawBuffer = null; -+ } -+ - int var1 = this.rawBufferIndex * 4; - this.reset(); - return var1; -@@ -439,6 +460,19 @@ - */ - public void addVertex(double par1, double par3, double par5) - { -+ if (rawBufferIndex >= rawBufferSize - 32) -+ { -+ if (rawBufferSize == 0) -+ { -+ rawBufferSize = 0x10000; -+ rawBuffer = new int[rawBufferSize]; -+ } -+ else -+ { -+ rawBufferSize *= 2; -+ rawBuffer = Arrays.copyOf(rawBuffer, rawBufferSize); -+ } -+ } - ++this.addedVertices; - - if (this.drawMode == 7 && convertQuadsToTriangles && this.addedVertices % 4 == 0) -@@ -497,12 +531,6 @@ - this.rawBuffer[this.rawBufferIndex + 2] = Float.floatToRawIntBits((float)(par5 + this.zOffset)); - this.rawBufferIndex += 8; - ++this.vertexCount; -- -- if (this.vertexCount % 4 == 0 && this.rawBufferIndex >= this.bufferSize - 32) -- { -- this.draw(); -- this.isDrawing = true; -- } - } - - /** diff --git a/patches/minecraft/net/minecraft/src/TileEntity.java.patch b/patches/minecraft/net/minecraft/src/TileEntity.java.patch deleted file mode 100644 index 631037287..000000000 --- a/patches/minecraft/net/minecraft/src/TileEntity.java.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/TileEntity.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/TileEntity.java 0000-00-00 00:00:00.000000000 -0000 -@@ -223,4 +223,29 @@ - public static void addNewTileEntityMapping(Class tileEntityClass, String id) { - addMapping(tileEntityClass, id); - } -+ -+ /** -+ * Determines if this TileEntity requires update calls. -+ * @return True if you want updateEntity() to be called, false if not -+ */ -+ public boolean canUpdate() -+ { -+ return true; -+ } -+ -+ /** -+ * Called when you receive a TileEntityData packet for the location this -+ * TileEntity is currently in. On the client, the NetworkManager will always -+ * be the remote server. On the server, it will be whomever is responsible for -+ * sending the packet. -+ * -+ * @param net The NetworkManager the packet originated from -+ * @param pkt The data packet -+ */ -+ public void onDataPacket(NetworkManager net, Packet132TileEntityData pkt){} -+ -+ /** -+ * Called when the chunk this TileEntity is on is Unloaded. -+ */ -+ public void onChunkUnload(){} - } diff --git a/patches/minecraft/net/minecraft/src/TileEntityBrewingStand.java.patch b/patches/minecraft/net/minecraft/src/TileEntityBrewingStand.java.patch deleted file mode 100644 index cd69e22c1..000000000 --- a/patches/minecraft/net/minecraft/src/TileEntityBrewingStand.java.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/TileEntityBrewingStand.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/TileEntityBrewingStand.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,7 +2,9 @@ - - import java.util.List; - --public class TileEntityBrewingStand extends TileEntity implements IInventory -+import net.minecraft.src.forge.ISidedInventory; -+ -+public class TileEntityBrewingStand extends TileEntity implements IInventory, ISidedInventory - { - /** The itemstacks currently placed in the slots of the brewing stand */ - private ItemStack[] brewingItemStacks = new ItemStack[4]; -@@ -322,4 +324,16 @@ - - return var1; - } -+ -+ @Override -+ public int getStartInventorySide(int side) -+ { -+ return (side == 1 ? 3 : 0); -+ } -+ -+ @Override -+ public int getSizeInventorySide(int side) -+ { -+ return (side == 1 ? 1 : 3); -+ } - } diff --git a/patches/minecraft/net/minecraft/src/TileEntityFurnace.java.patch b/patches/minecraft/net/minecraft/src/TileEntityFurnace.java.patch deleted file mode 100644 index 29a559bea..000000000 --- a/patches/minecraft/net/minecraft/src/TileEntityFurnace.java.patch +++ /dev/null @@ -1,96 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/TileEntityFurnace.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/TileEntityFurnace.java 0000-00-00 00:00:00.000000000 -0000 -@@ -3,7 +3,10 @@ - import cpw.mods.fml.client.FMLClientHandler; - import cpw.mods.fml.common.FMLCommonHandler; - --public class TileEntityFurnace extends TileEntity implements IInventory -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.ISidedInventory; -+ -+public class TileEntityFurnace extends TileEntity implements IInventory, ISidedInventory - { - /** - * The ItemStacks that hold the items currently being used in the furnace -@@ -275,8 +278,12 @@ - } - 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()))); -+ ItemStack var1 = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]); -+ if (var1 == null) return false; -+ if (this.furnaceItemStacks[2] == null) return true; -+ if (!this.furnaceItemStacks[2].isItemEqual(var1)) return false; -+ int result = furnaceItemStacks[2].stackSize + var1.stackSize; -+ return (result <= getInventoryStackLimit() && result <= var1.getMaxStackSize()); - } - } - -@@ -287,15 +294,25 @@ - { - if (this.canSmelt()) - { -- ItemStack var1 = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0].getItem().shiftedIndex); -+ ItemStack var1 = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]); - - if (this.furnaceItemStacks[2] == null) - { - this.furnaceItemStacks[2] = var1.copy(); - } -- else if (this.furnaceItemStacks[2].itemID == var1.itemID) -+ else if (this.furnaceItemStacks[2].isItemEqual(var1)) - { -- ++this.furnaceItemStacks[2].stackSize; -+ //========================================================== -+ //Adding extra importance here, so this really small bug -+ //fix stops slipping through the cracks. -+ // -+ //Makes it so that items that result in multiple items are -+ //smelted correctly each time. -+ // -+ // -+ // -+ this.furnaceItemStacks[2].stackSize += var1.stackSize; -+ //========================================================== - } - - --this.furnaceItemStacks[0].stackSize; -@@ -320,12 +337,17 @@ - else - { - int var1 = par1ItemStack.getItem().shiftedIndex; -- if (var1 < 256 && Block.blocksList[var1].blockMaterial == Material.wood) return 300; -+ if (par1ItemStack.getItem() instanceof ItemBlock && Block.blocksList[var1].blockMaterial == Material.wood) return 300; - if (var1 == Item.stick.shiftedIndex) return 100; - if (var1 == Item.coal.shiftedIndex) return 1600; - if (var1 == Item.bucketLava.shiftedIndex) return 20000; - if (var1 == Block.sapling.blockID) return 100; - if (var1 == Item.blazeRod.shiftedIndex) return 2400; -+ int ret = ForgeHooks.getItemBurnTime(par1ItemStack); -+ if (ret > 0) -+ { -+ return ret; -+ } - return FMLCommonHandler.instance().fuelLookup(var1, par1ItemStack.getItemDamageForDisplay()); - } - } -@@ -349,4 +371,18 @@ - public void openChest() {} - - public void closeChest() {} -+ -+ @Override -+ public int getStartInventorySide(int side) -+ { -+ if (side == 0) return 1; -+ if (side == 1) return 0; -+ return 2; -+ } -+ -+ @Override -+ public int getSizeInventorySide(int side) -+ { -+ return 1; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/TileEntityRendererPiston.java.patch b/patches/minecraft/net/minecraft/src/TileEntityRendererPiston.java.patch deleted file mode 100644 index 852dc8b75..000000000 --- a/patches/minecraft/net/minecraft/src/TileEntityRendererPiston.java.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/TileEntityRendererPiston.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/TileEntityRendererPiston.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,8 @@ - package net.minecraft.src; - - import net.minecraft.client.Minecraft; -+import net.minecraft.src.forge.ForgeHooksClient; -+ - import org.lwjgl.opengl.GL11; - - public class TileEntityRendererPiston extends TileEntitySpecialRenderer -@@ -29,7 +31,7 @@ - { - GL11.glShadeModel(GL11.GL_FLAT); - } -- -+ ForgeHooksClient.beforeBlockRender(var9, blockRenderer); - var10.startDrawingQuads(); - var10.setTranslation((double)((float)par2 - (float)par1TileEntityPiston.xCoord + par1TileEntityPiston.getOffsetX(par8)), (double)((float)par4 - (float)par1TileEntityPiston.yCoord + par1TileEntityPiston.getOffsetY(par8)), (double)((float)par6 - (float)par1TileEntityPiston.zCoord + par1TileEntityPiston.getOffsetZ(par8))); - var10.setColorOpaque(1, 1, 1); -@@ -53,6 +55,7 @@ - - var10.setTranslation(0.0D, 0.0D, 0.0D); - var10.draw(); -+ ForgeHooksClient.afterBlockRender(var9, blockRenderer); - RenderHelper.enableStandardItemLighting(); - } - } diff --git a/patches/minecraft/net/minecraft/src/World.java.patch b/patches/minecraft/net/minecraft/src/World.java.patch deleted file mode 100644 index f3479118d..000000000 --- a/patches/minecraft/net/minecraft/src/World.java.patch +++ /dev/null @@ -1,380 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/World.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/World.java 0000-00-00 00:00:00.000000000 -0000 -@@ -9,8 +9,18 @@ - import java.util.Set; - import java.util.TreeSet; - -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.ForgeHooksClient; -+ - public class World implements IBlockAccess - { -+ /** -+ * Used in the getEntitiesWithinAABB functions to expand the search area for entities. -+ * Modders should change this variable to a higher value if it is less then the radius -+ * of one of there entities. -+ */ -+ public static double MAX_ENTITY_RADIUS = 2.0D; -+ - /** - * boolean; if true updates scheduled by scheduleBlockUpdate happen immediately - */ -@@ -79,7 +89,7 @@ - * Contains a timestamp from when the World object was created. Is used in the session.lock file - */ - private long lockTimestamp; -- protected int autosavePeriod; -+ public int autosavePeriod; - - /** Option > Difficulty setting (0 - 3) */ - public int difficultySetting; -@@ -214,6 +224,7 @@ - this.chunkProvider = this.createChunkProvider(); - this.calculateInitialSkylight(); - this.calculateInitialWeather(); -+ ForgeHooks.onWorldLoad(this); - } - - public World(World par1World, WorldProvider par2WorldProvider) -@@ -259,6 +270,7 @@ - this.chunkProvider = this.createChunkProvider(); - this.calculateInitialSkylight(); - this.calculateInitialWeather(); -+ ForgeHooks.onWorldLoad(this); - } - - public World(ISaveHandler par1ISaveHandler, String par2Str, WorldSettings par3WorldSettings) -@@ -340,6 +352,7 @@ - - this.calculateInitialSkylight(); - this.calculateInitialWeather(); -+ ForgeHooks.onWorldLoad(this); - } - - /** -@@ -507,6 +520,7 @@ - } - - this.chunkProvider.saveChunks(par1, par2IProgressUpdate); -+ ForgeHooks.onWorldSave(this); - } - } - -@@ -559,7 +573,8 @@ - */ - public boolean isAirBlock(int par1, int par2, int par3) - { -- return this.getBlockId(par1, par2, par3) == 0; -+ int id = getBlockId(par1, par2, par3); -+ return id == 0 || Block.blocksList[id] == null || Block.blocksList[id].isAirBlock(this, par1, par2, par3); - } - - /** -@@ -1253,7 +1268,9 @@ - int var12 = this.getBlockMetadata(var8, var9, var10); - Block var13 = Block.blocksList[var11]; - -- if ((!par4 || var13 == null || var13.getCollisionBoundingBoxFromPool(this, var8, var9, var10) != null) && var11 > 0 && var13.canCollideCheck(var12, par3)) -+ if (var13 != null && //BugFix NPE on misconfigured block ids. -+ (!par4 || var13 == null || var13.getCollisionBoundingBoxFromPool(this, var8, var9, var10) != null) && -+ var11 > 0 && var13.canCollideCheck(var12, par3)) - { - MovingObjectPosition var14 = var13.collisionRayTrace(this, var8, var9, var10, par1Vec3D, par2Vec3D); - -@@ -1453,6 +1470,12 @@ - */ - public void playSoundAtEntity(Entity par1Entity, String par2Str, float par3, float par4) - { -+ par2Str = ForgeHooksClient.onPlaySoundAtEntity(par1Entity, par2Str, par3, par4); -+ if (par2Str == null) -+ { -+ return; -+ } -+ - for (int var5 = 0; var5 < this.worldAccesses.size(); ++var5) - { - ((IWorldAccess)this.worldAccesses.get(var5)).playSound(par2Str, par1Entity.posX, par1Entity.posY - (double)par1Entity.yOffset, par1Entity.posZ, par3, par4); -@@ -2068,7 +2091,7 @@ - - if (var7 != null) - { -- var7.removeChunkBlockTileEntity(var5.xCoord & 15, var5.yCoord, var5.zCoord & 15); -+ var7.cleanChunkBlockTileEntity(var5.xCoord & 15, var5.yCoord, var5.zCoord & 15); - } - } - } -@@ -2078,6 +2101,10 @@ - - if (!this.entityRemoval.isEmpty()) - { -+ for (Object tile : entityRemoval) -+ { -+ ((TileEntity)tile).onChunkUnload(); -+ } - this.loadedTileEntityList.removeAll(this.entityRemoval); - this.entityRemoval.clear(); - } -@@ -2098,18 +2125,18 @@ - { - this.loadedTileEntityList.add(var8); - } -- -+ } -+ else -+ { - if (this.chunkExists(var8.xCoord >> 4, var8.zCoord >> 4)) - { - Chunk var9 = this.getChunkFromChunkCoords(var8.xCoord >> 4, var8.zCoord >> 4); - - if (var9 != null) - { -- var9.setChunkBlockTileEntity(var8.xCoord & 15, var8.yCoord, var8.zCoord & 15, var8); -+ var9.cleanChunkBlockTileEntity(var8.xCoord & 15, var8.yCoord, var8.zCoord & 15); - } - } -- -- this.markBlockNeedsUpdate(var8.xCoord, var8.yCoord, var8.zCoord); - } - } - -@@ -2122,13 +2149,13 @@ - - public void addTileEntity(Collection par1Collection) - { -- if (this.scanningTileEntities) -+ List dest = scanningTileEntities ? addedTileEntityList : loadedTileEntityList; -+ for(Object entity : par1Collection) - { -- this.addedTileEntityList.addAll(par1Collection); -- } -- else -- { -- this.loadedTileEntityList.addAll(par1Collection); -+ if(((TileEntity)entity).canUpdate()) -+ { -+ dest.add(entity); -+ } - } - } - -@@ -2150,7 +2177,7 @@ - int var4 = MathHelper.floor_double(par1Entity.posZ); - byte var5 = 32; - -- if (!par2 || this.checkChunksExist(var3 - var5, 0, var4 - var5, var3 + var5, 0, var4 + var5)) -+ if (!par2 || this.checkChunksExist(var3 - var5, 0, var4 - var5, var3 + var5, 0, var4 + var5) || ForgeHooks.canUpdateEntity(par1Entity)) - { - par1Entity.lastTickPosX = par1Entity.posX; - par1Entity.lastTickPosY = par1Entity.posY; -@@ -2327,7 +2354,14 @@ - if (var11 == Block.fire.blockID || var11 == Block.lavaMoving.blockID || var11 == Block.lavaStill.blockID) - { - return true; -- } -+ } -+ else -+ { -+ if(var11 > 0 && Block.blocksList[var11].isBlockBurning(this, var8, var9, var10)) -+ { -+ return true; -+ } -+ } - } - } - } -@@ -2631,25 +2665,19 @@ - */ - public void setBlockTileEntity(int par1, int par2, int par3, TileEntity par4TileEntity) - { -- if (par4TileEntity != null && !par4TileEntity.isInvalid()) -+ if (par4TileEntity == null || par4TileEntity.isInvalid()) - { -- if (this.scanningTileEntities) -- { -- par4TileEntity.xCoord = par1; -- par4TileEntity.yCoord = par2; -- par4TileEntity.zCoord = par3; -- this.addedTileEntityList.add(par4TileEntity); -- } -- else -- { -- this.loadedTileEntityList.add(par4TileEntity); -- Chunk var5 = this.getChunkFromChunkCoords(par1 >> 4, par3 >> 4); -- -- if (var5 != null) -- { -- var5.setChunkBlockTileEntity(par1 & 15, par2, par3 & 15, par4TileEntity); -- } -- } -+ return; -+ } -+ List dest = scanningTileEntities ? addedTileEntityList : loadedTileEntityList; -+ if (par4TileEntity.canUpdate()) -+ { -+ dest.add(par4TileEntity); -+ } -+ Chunk chunk = getChunkFromChunkCoords(par1 >> 4, par3 >> 4); -+ if (chunk != null) -+ { -+ chunk.setChunkBlockTileEntity(par1 & 15, par2, par3 & 15, par4TileEntity); - } - } - -@@ -2658,27 +2686,10 @@ - */ - public void removeBlockTileEntity(int par1, int par2, int par3) - { -- TileEntity var4 = this.getBlockTileEntity(par1, par2, par3); -- -- if (var4 != null && this.scanningTileEntities) -+ Chunk chunk = getChunkFromChunkCoords(par1 >> 4, par3 >> 4); -+ if (chunk != null) - { -- var4.invalidate(); -- this.addedTileEntityList.remove(var4); -- } -- else -- { -- if (var4 != null) -- { -- this.addedTileEntityList.remove(var4); -- this.loadedTileEntityList.remove(var4); -- } -- -- Chunk var5 = this.getChunkFromChunkCoords(par1 >> 4, par3 >> 4); -- -- if (var5 != null) -- { -- var5.removeChunkBlockTileEntity(par1 & 15, par2, par3 & 15); -- } -+ chunk.removeChunkBlockTileEntity(par1 & 15, par2, par3 & 15); - } - } - -@@ -2704,7 +2715,8 @@ - */ - public boolean isBlockNormalCube(int par1, int par2, int par3) - { -- return Block.isNormalCube(this.getBlockId(par1, par2, par3)); -+ Block block = Block.blocksList[getBlockId(par1, par2, par3)]; -+ return block != null && block.isBlockNormalCube(this, par1, par2, par3); - } - - /** -@@ -2720,7 +2732,7 @@ - if (var5 != null && !var5.isEmpty()) - { - Block var6 = Block.blocksList[this.getBlockId(par1, par2, par3)]; -- return var6 == null ? false : var6.blockMaterial.isOpaque() && var6.renderAsNormalBlock(); -+ return var6 == null ? false : isBlockNormalCube(par1, par2, par3); - } - else - { -@@ -2985,6 +2997,7 @@ - } - } - } -+ ForgeHooks.addActiveChunks(this, activeChunkSet); - - Profiler.endSection(); - -@@ -3308,7 +3321,7 @@ - - private int computeBlockLightValue(int par1, int par2, int par3, int par4, int par5, int par6) - { -- int var7 = Block.lightValue[par5]; -+ int var7 = (par5 == 0 || Block.blocksList[par5] == null ? 0 : Block.blocksList[par5].getLightValue(this, par2, par3, par4)); - int var8 = this.getSavedLightValue(EnumSkyBlock.Block, par2 - 1, par3, par4) - par6; - int var9 = this.getSavedLightValue(EnumSkyBlock.Block, par2 + 1, par3, par4) - par6; - int var10 = this.getSavedLightValue(EnumSkyBlock.Block, par2, par3 - 1, par4) - par6; -@@ -3668,10 +3681,10 @@ - public List getEntitiesWithinAABBExcludingEntity(Entity par1Entity, AxisAlignedBB par2AxisAlignedBB) - { - this.entitiesWithinAABBExcludingEntity.clear(); -- int var3 = MathHelper.floor_double((par2AxisAlignedBB.minX - 2.0D) / 16.0D); -- int var4 = MathHelper.floor_double((par2AxisAlignedBB.maxX + 2.0D) / 16.0D); -- int var5 = MathHelper.floor_double((par2AxisAlignedBB.minZ - 2.0D) / 16.0D); -- int var6 = MathHelper.floor_double((par2AxisAlignedBB.maxZ + 2.0D) / 16.0D); -+ int var3 = MathHelper.floor_double((par2AxisAlignedBB.minX - MAX_ENTITY_RADIUS) / 16.0D); -+ int var4 = MathHelper.floor_double((par2AxisAlignedBB.maxX + MAX_ENTITY_RADIUS) / 16.0D); -+ int var5 = MathHelper.floor_double((par2AxisAlignedBB.minZ - MAX_ENTITY_RADIUS) / 16.0D); -+ int var6 = MathHelper.floor_double((par2AxisAlignedBB.maxZ + MAX_ENTITY_RADIUS) / 16.0D); - - for (int var7 = var3; var7 <= var4; ++var7) - { -@@ -3692,10 +3705,10 @@ - */ - public List getEntitiesWithinAABB(Class par1Class, AxisAlignedBB par2AxisAlignedBB) - { -- int var3 = MathHelper.floor_double((par2AxisAlignedBB.minX - 2.0D) / 16.0D); -- int var4 = MathHelper.floor_double((par2AxisAlignedBB.maxX + 2.0D) / 16.0D); -- int var5 = MathHelper.floor_double((par2AxisAlignedBB.minZ - 2.0D) / 16.0D); -- int var6 = MathHelper.floor_double((par2AxisAlignedBB.maxZ + 2.0D) / 16.0D); -+ int var3 = MathHelper.floor_double((par2AxisAlignedBB.minX - MAX_ENTITY_RADIUS) / 16.0D); -+ int var4 = MathHelper.floor_double((par2AxisAlignedBB.maxX + MAX_ENTITY_RADIUS) / 16.0D); -+ int var5 = MathHelper.floor_double((par2AxisAlignedBB.minZ - MAX_ENTITY_RADIUS) / 16.0D); -+ int var6 = MathHelper.floor_double((par2AxisAlignedBB.maxZ + MAX_ENTITY_RADIUS) / 16.0D); - ArrayList var7 = new ArrayList(); - - for (int var8 = var3; var8 <= var4; ++var8) -@@ -3840,7 +3853,10 @@ - { - var8 = null; - } -- -+ if (var8 != null && var8.isBlockReplaceable(this, par2, par3, par4)) -+ { -+ var8 = null; -+ } - return par1 > 0 && var8 == null && var9.canPlaceBlockOnSide(this, par2, par3, par4, par6); - } - } -@@ -4399,7 +4415,7 @@ - */ - public int getHeight() - { -- return 256; -+ return worldProvider.hasNoSky ? 128 : 256; //Nether is 128, overworld is 256, Bugfix related to Portal generation - } - - /** -@@ -4449,4 +4465,39 @@ - { - return this.worldInfo.getTerrainType().getHorizon(this); - } -+ -+ -+ /** -+ * Adds a single TileEntity to the world. -+ * TODO: Eloraam fully describe the bug this fixes. -+ * @param entity The TileEntity to be added. -+ */ -+ public void addTileEntity(TileEntity entity) -+ { -+ List dest = scanningTileEntities ? addedTileEntityList : loadedTileEntityList; -+ if(entity.canUpdate()) -+ { -+ dest.add(entity); -+ } -+ } -+ -+ /** -+ * Determine if the given block is considered solid on the -+ * specified side. Used by placement logic. -+ * -+ * @param X Block X Position -+ * @param Y Block Y Position -+ * @param Z Block Z Position -+ * @param side The Side in question -+ * @return True if the side is solid -+ */ -+ public boolean isBlockSolidOnSide(int X, int Y, int Z, int side) -+ { -+ Block block = Block.blocksList[getBlockId(X, Y, Z)]; -+ if(block == null) -+ { -+ return false; -+ } -+ return block.isBlockSolidOnSide(this, X, Y, Z, side); -+ } - } diff --git a/patches/minecraft/net/minecraft/src/WorldGenBigMushroom.java.patch b/patches/minecraft/net/minecraft/src/WorldGenBigMushroom.java.patch deleted file mode 100644 index 972aefa27..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenBigMushroom.java.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenBigMushroom.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenBigMushroom.java 0000-00-00 00:00:00.000000000 -0000 -@@ -54,7 +54,9 @@ - { - var13 = par1World.getBlockId(var11, var9, var12); - -- if (var13 != 0 && var13 != Block.leaves.blockID) -+ Block block = Block.blocksList[var13]; -+ -+ if (var13 != 0 && block != null && !block.isLeaves(par1World, var11, var9, var12)) - { - var8 = false; - } -@@ -186,7 +188,9 @@ - var15 = 0; - } - -- if ((var15 != 0 || par4 >= par4 + var7 - 1) && !Block.opaqueCubeLookup[par1World.getBlockId(var13, var11, var14)]) -+ Block block = Block.blocksList[par1World.getBlockId(var13, var11, var14)]; -+ -+ if ((var15 != 0 || par4 >= par4 + var7 - 1) && (block == null || block.canBeReplacedByLeaves(par1World, var13, var11, var14))) - { - this.setBlockAndMetadata(par1World, var13, var11, var14, Block.mushroomCapBrown.blockID + var6, var15); - } -@@ -198,7 +202,9 @@ - { - var12 = par1World.getBlockId(par3, par4 + var11, par5); - -- if (!Block.opaqueCubeLookup[var12]) -+ Block block = Block.blocksList[var12]; -+ -+ if (block == null || block.canBeReplacedByLeaves(par1World, par3, par4 + var11, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var11, par5, Block.mushroomCapBrown.blockID + var6, 10); - } diff --git a/patches/minecraft/net/minecraft/src/WorldGenDeadBush.java.patch b/patches/minecraft/net/minecraft/src/WorldGenDeadBush.java.patch deleted file mode 100644 index 728e5ab5f..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenDeadBush.java.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenDeadBush.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenDeadBush.java 0000-00-00 00:00:00.000000000 -0000 -@@ -16,10 +16,16 @@ - { - int var11; - -- for (boolean var6 = false; ((var11 = par1World.getBlockId(par3, par4, par5)) == 0 || var11 == Block.leaves.blockID) && par4 > 0; --par4) -+ Block block = null; -+ do - { -- ; -- } -+ block = Block.blocksList[par1World.getBlockId(par3, par4, par5)]; -+ if (block != null && !block.isLeaves(par1World, par3, par4, par5)) -+ { -+ break; -+ } -+ par4--; -+ } while (par4 > 0); - - for (int var7 = 0; var7 < 4; ++var7) - { diff --git a/patches/minecraft/net/minecraft/src/WorldGenDungeons.java.patch b/patches/minecraft/net/minecraft/src/WorldGenDungeons.java.patch deleted file mode 100644 index 7d7e664d4..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenDungeons.java.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenDungeons.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenDungeons.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import net.minecraft.src.forge.MinecraftForge; -+ - public class WorldGenDungeons extends WorldGenerator - { - public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5) -@@ -117,9 +119,9 @@ - - if (var16 != null) - { -- for (int var17 = 0; var17 < 8; ++var17) -+ for (int var17 = 0; var17 < MinecraftForge.getDungeonLootTries(); ++var17) - { -- ItemStack var18 = this.pickCheckLootItem(par2Random); -+ ItemStack var18 = MinecraftForge.getRandomDungeonLoot(par2Random); - - if (var18 != null) - { diff --git a/patches/minecraft/net/minecraft/src/WorldGenForest.java.patch b/patches/minecraft/net/minecraft/src/WorldGenForest.java.patch deleted file mode 100644 index 6290e9f65..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenForest.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenForest.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenForest.java 0000-00-00 00:00:00.000000000 -0000 -@@ -43,7 +43,9 @@ - { - var12 = par1World.getBlockId(var10, var8, var11); - -- if (var12 != 0 && var12 != Block.leaves.blockID) -+ Block block = Block.blocksList[var12]; -+ -+ if (var12 != 0 && (block != null && !block.isLeaves(par1World, var10, var8, var11))) - { - var7 = false; - } -@@ -82,7 +84,10 @@ - { - int var15 = var14 - par5; - -- if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var12, var16, var14)]) -+ Block block = Block.blocksList[par1World.getBlockId(var12, var16, var14)]; -+ -+ if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var12, var16, var14))) - { - this.setBlockAndMetadata(par1World, var12, var16, var14, Block.leaves.blockID, 2); - } -@@ -94,7 +99,9 @@ - { - var10 = par1World.getBlockId(par3, par4 + var16, par5); - -- if (var10 == 0 || var10 == Block.leaves.blockID) -+ Block block = Block.blocksList[var10]; -+ -+ if (var10 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var16, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var16, par5, Block.wood.blockID, 2); - } diff --git a/patches/minecraft/net/minecraft/src/WorldGenHugeTrees.java.patch b/patches/minecraft/net/minecraft/src/WorldGenHugeTrees.java.patch deleted file mode 100644 index 2e1ced6a9..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenHugeTrees.java.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenHugeTrees.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenHugeTrees.java 0000-00-00 00:00:00.000000000 -0000 -@@ -55,7 +55,12 @@ - { - var12 = par1World.getBlockId(var10, var8, var11); - -- if (var12 != 0 && var12 != Block.leaves.blockID && var12 != Block.grass.blockID && var12 != Block.dirt.blockID && var12 != Block.wood.blockID && var12 != Block.sapling.blockID) -+ if (var12 != 0 && -+ (Block.blocksList[var12] != null && !Block.blocksList[var12].isLeaves(par1World, var10, var8, var11)) && -+ var12 != Block.grass.blockID && -+ var12 != Block.dirt.blockID && -+ (Block.blocksList[var12] != null && !Block.blocksList[var12].isWood(par1World, var10, var8, var11)) && -+ var12 != Block.sapling.blockID) - { - var7 = false; - } -@@ -103,7 +108,7 @@ - { - var11 = par1World.getBlockId(par3, par4 + var10, par5); - -- if (var11 == 0 || var11 == Block.leaves.blockID) -+ if (var11 == 0 || Block.blocksList[var11] == null || Block.blocksList[var11].isLeaves(par1World, par3, par4 + var10, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var10, par5, Block.wood.blockID, this.woodMetadata); - -@@ -125,7 +130,7 @@ - { - var11 = par1World.getBlockId(par3 + 1, par4 + var10, par5); - -- if (var11 == 0 || var11 == Block.leaves.blockID) -+ if (var11 == 0 || Block.blocksList[var11] == null || Block.blocksList[var11].isLeaves(par1World, par3 + 1, par4 + var10, par5)) - { - this.setBlockAndMetadata(par1World, par3 + 1, par4 + var10, par5, Block.wood.blockID, this.woodMetadata); - -@@ -145,7 +150,7 @@ - - var11 = par1World.getBlockId(par3 + 1, par4 + var10, par5 + 1); - -- if (var11 == 0 || var11 == Block.leaves.blockID) -+ if (var11 == 0 || Block.blocksList[var11] == null || Block.blocksList[var11].isLeaves(par1World, par3 + 1, par4 + var10, par5 + 1)) - { - this.setBlockAndMetadata(par1World, par3 + 1, par4 + var10, par5 + 1, Block.wood.blockID, this.woodMetadata); - -@@ -165,7 +170,7 @@ - - var11 = par1World.getBlockId(par3, par4 + var10, par5 + 1); - -- if (var11 == 0 || var11 == Block.leaves.blockID) -+ if (var11 == 0 || Block.blocksList[var11] == null || Block.blocksList[var11].isLeaves(par1World, par3, par4 + var10, par5 + 1)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var10, par5 + 1, Block.wood.blockID, this.woodMetadata); - -@@ -216,7 +221,12 @@ - { - int var14 = var13 - par3; - -- if ((var12 >= 0 || var14 >= 0 || var12 * var12 + var14 * var14 <= var10 * var10) && (var12 <= 0 && var14 <= 0 || var12 * var12 + var14 * var14 <= (var10 + 1) * (var10 + 1)) && (par6Random.nextInt(4) != 0 || var12 * var12 + var14 * var14 <= (var10 - 1) * (var10 - 1)) && !Block.opaqueCubeLookup[par1World.getBlockId(var11, var8, var13)]) -+ Block block = Block.blocksList[par1World.getBlockId(var11, var8, var13)]; -+ -+ if ((var12 >= 0 || var14 >= 0 || var12 * var12 + var14 * var14 <= var10 * var10) && -+ (var12 <= 0 && var14 <= 0 || var12 * var12 + var14 * var14 <= (var10 + 1) * (var10 + 1)) && -+ (par6Random.nextInt(4) != 0 || var12 * var12 + var14 * var14 <= (var10 - 1) * (var10 - 1)) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var11, var8, var13))) - { - this.setBlockAndMetadata(par1World, var11, var8, var13, Block.leaves.blockID, this.leavesMetadata); - } diff --git a/patches/minecraft/net/minecraft/src/WorldGenMinable.java.patch b/patches/minecraft/net/minecraft/src/WorldGenMinable.java.patch deleted file mode 100644 index 534b0359c..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenMinable.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenMinable.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenMinable.java 0000-00-00 00:00:00.000000000 -0000 -@@ -6,6 +6,7 @@ - { - /** The block ID of the ore to be placed using this generator. */ - private int minableBlockId; -+ private int minableBlockMeta = 0; - - /** The number of blocks to generate. */ - private int numberOfBlocks; -@@ -15,6 +16,12 @@ - this.minableBlockId = par1; - this.numberOfBlocks = par2; - } -+ -+ public WorldGenMinable(int id, int meta, int number) -+ { -+ this(id, number); -+ minableBlockMeta = meta; -+ } - - public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5) - { -@@ -57,9 +64,10 @@ - { - double var45 = ((double)var44 + 0.5D - var24) / (var28 / 2.0D); - -- if (var39 * var39 + var42 * var42 + var45 * var45 < 1.0D && par1World.getBlockId(var38, var41, var44) == Block.stone.blockID) -+ Block block = Block.blocksList[par1World.getBlockId(var38, var41, var44)]; -+ if (var39 * var39 + var42 * var42 + var45 * var45 < 1.0D && (block != null && block.isGenMineableReplaceable(par1World, var38, var41, var44))) - { -- par1World.setBlock(var38, var41, var44, this.minableBlockId); -+ par1World.setBlockAndMetadata(var38, var41, var44, this.minableBlockId, minableBlockMeta); - } - } - } diff --git a/patches/minecraft/net/minecraft/src/WorldGenShrub.java.patch b/patches/minecraft/net/minecraft/src/WorldGenShrub.java.patch deleted file mode 100644 index 9952430f3..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenShrub.java.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenShrub.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenShrub.java 0000-00-00 00:00:00.000000000 -0000 -@@ -17,10 +17,16 @@ - { - int var15; - -- for (boolean var6 = false; ((var15 = par1World.getBlockId(par3, par4, par5)) == 0 || var15 == Block.leaves.blockID) && par4 > 0; --par4) -+ Block block = null; -+ do - { -- ; -- } -+ block = Block.blocksList[par1World.getBlockId(par3, par4, par5)]; -+ if (block != null && !block.isLeaves(par1World, par3, par4, par5)) -+ { -+ break; -+ } -+ par4--; -+ } while (par4 > 0); - - int var7 = par1World.getBlockId(par3, par4, par5); - -@@ -42,7 +48,9 @@ - { - int var14 = var13 - par5; - -- if ((Math.abs(var12) != var10 || Math.abs(var14) != var10 || par2Random.nextInt(2) != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var11, var8, var13)]) -+ block = Block.blocksList[par1World.getBlockId(var11, var8, var13)]; -+ -+ if ((Math.abs(var12) != var10 || Math.abs(var14) != var10 || par2Random.nextInt(2) != 0) && (block == null || block.canBeReplacedByLeaves(par1World, var11, var8, var13))) - { - this.setBlockAndMetadata(par1World, var11, var8, var13, Block.leaves.blockID, this.field_48197_a); - } diff --git a/patches/minecraft/net/minecraft/src/WorldGenSwamp.java.patch b/patches/minecraft/net/minecraft/src/WorldGenSwamp.java.patch deleted file mode 100644 index 31c67a302..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenSwamp.java.patch +++ /dev/null @@ -1,44 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenSwamp.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenSwamp.java 0000-00-00 00:00:00.000000000 -0000 -@@ -44,7 +44,7 @@ - { - var12 = par1World.getBlockId(var10, var8, var11); - -- if (var12 != 0 && var12 != Block.leaves.blockID) -+ if (var12 != 0 && (Block.blocksList[var12] != null && !Block.blocksList[var12].isLeaves(par1World, var10, var8, var11))) - { - if (var12 != Block.waterStill.blockID && var12 != Block.waterMoving.blockID) - { -@@ -91,7 +91,10 @@ - { - int var15 = var14 - par5; - -- if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var12, var16, var14)]) -+ Block block = Block.blocksList[par1World.getBlockId(var12, var16, var14)]; -+ -+ if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var12, var16, var14))) - { - this.setBlock(par1World, var12, var16, var14, Block.leaves.blockID); - } -@@ -103,7 +106,9 @@ - { - var10 = par1World.getBlockId(par3, par4 + var16, par5); - -- if (var10 == 0 || var10 == Block.leaves.blockID || var10 == Block.waterMoving.blockID || var10 == Block.waterStill.blockID) -+ Block block = Block.blocksList[var10]; -+ -+ if (var10 == 0 || (block != null && block.isLeaves(par1World, par3, par4 + var16, par5)) || var10 == Block.waterMoving.blockID || var10 == Block.waterStill.blockID) - { - this.setBlock(par1World, par3, par4 + var16, par5, Block.wood.blockID); - } -@@ -118,7 +123,8 @@ - { - for (var13 = par5 - var11; var13 <= par5 + var11; ++var13) - { -- if (par1World.getBlockId(var12, var16, var13) == Block.leaves.blockID) -+ Block block = Block.blocksList[par1World.getBlockId(var12, var16, var13)]; -+ if (block != null && block.isLeaves(par1World, var12, var16, var13)) - { - if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var12 - 1, var16, var13) == 0) - { diff --git a/patches/minecraft/net/minecraft/src/WorldGenTaiga1.java.patch b/patches/minecraft/net/minecraft/src/WorldGenTaiga1.java.patch deleted file mode 100644 index 7cd1ad871..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenTaiga1.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenTaiga1.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenTaiga1.java 0000-00-00 00:00:00.000000000 -0000 -@@ -41,7 +41,9 @@ - { - var15 = par1World.getBlockId(var13, var11, var14); - -- if (var15 != 0 && var15 != Block.leaves.blockID) -+ Block block = Block.blocksList[var15]; -+ -+ if (var15 != 0 && (block == null || !block.isLeaves(par1World, var13, var11, var14))) - { - var10 = false; - } -@@ -77,7 +79,10 @@ - { - int var17 = var16 - par5; - -- if ((Math.abs(var15) != var18 || Math.abs(var17) != var18 || var18 <= 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var14, var13, var16)]) -+ Block block = Block.blocksList[par1World.getBlockId(var14, var13, var16)]; -+ -+ if ((Math.abs(var15) != var18 || Math.abs(var17) != var18 || var18 <= 0) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var14, var13, var16))) - { - this.setBlockAndMetadata(par1World, var14, var13, var16, Block.leaves.blockID, 1); - } -@@ -98,7 +103,9 @@ - { - var14 = par1World.getBlockId(par3, par4 + var13, par5); - -- if (var14 == 0 || var14 == Block.leaves.blockID) -+ Block block = Block.blocksList[var14]; -+ -+ if (var14 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var13, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var13, par5, Block.wood.blockID, 1); - } diff --git a/patches/minecraft/net/minecraft/src/WorldGenTaiga2.java.patch b/patches/minecraft/net/minecraft/src/WorldGenTaiga2.java.patch deleted file mode 100644 index cb2a78571..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenTaiga2.java.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenTaiga2.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenTaiga2.java 0000-00-00 00:00:00.000000000 -0000 -@@ -45,7 +45,9 @@ - { - var15 = par1World.getBlockId(var13, var11, var14); - -- if (var15 != 0 && var15 != Block.leaves.blockID) -+ Block block = Block.blocksList[var15]; -+ -+ if (var15 != 0 && block != null && !block.isLeaves(par1World, var13, var11, var14)) - { - var10 = false; - } -@@ -87,7 +89,9 @@ - { - int var20 = var19 - par5; - -- if ((Math.abs(var18) != var21 || Math.abs(var20) != var21 || var21 <= 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var17, var16, var19)]) -+ Block block = Block.blocksList[par1World.getBlockId(var17, var16, var19)]; -+ -+ if ((Math.abs(var18) != var21 || Math.abs(var20) != var21 || var21 <= 0) && (block == null || block.canBeReplacedByLeaves(par1World, var17, var16, var19))) - { - this.setBlockAndMetadata(par1World, var17, var16, var19, Block.leaves.blockID, 1); - } -@@ -117,7 +121,9 @@ - { - var17 = par1World.getBlockId(par3, par4 + var16, par5); - -- if (var17 == 0 || var17 == Block.leaves.blockID) -+ Block block = Block.blocksList[var17]; -+ -+ if (var17 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var16, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var16, par5, Block.wood.blockID, 1); - } diff --git a/patches/minecraft/net/minecraft/src/WorldGenTallGrass.java.patch b/patches/minecraft/net/minecraft/src/WorldGenTallGrass.java.patch deleted file mode 100644 index d061ed8f5..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenTallGrass.java.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenTallGrass.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenTallGrass.java 0000-00-00 00:00:00.000000000 -0000 -@@ -18,10 +18,16 @@ - { - int var11; - -- for (boolean var6 = false; ((var11 = par1World.getBlockId(par3, par4, par5)) == 0 || var11 == Block.leaves.blockID) && par4 > 0; --par4) -+ Block block = null; -+ do - { -- ; -- } -+ block = Block.blocksList[par1World.getBlockId(par3, par4, par5)]; -+ if (block != null && !block.isLeaves(par1World, par3, par4, par5)) -+ { -+ break; -+ } -+ par4--; -+ } while (par4 > 0); - - for (int var7 = 0; var7 < 128; ++var7) - { diff --git a/patches/minecraft/net/minecraft/src/WorldGenTrees.java.patch b/patches/minecraft/net/minecraft/src/WorldGenTrees.java.patch deleted file mode 100644 index 679b07c03..000000000 --- a/patches/minecraft/net/minecraft/src/WorldGenTrees.java.patch +++ /dev/null @@ -1,50 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldGenTrees.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldGenTrees.java 0000-00-00 00:00:00.000000000 -0000 -@@ -64,7 +64,13 @@ - { - var12 = par1World.getBlockId(var10, var8, var11); - -- if (var12 != 0 && var12 != Block.leaves.blockID && var12 != Block.grass.blockID && var12 != Block.dirt.blockID && var12 != Block.wood.blockID) -+ Block block = Block.blocksList[var12]; -+ -+ if (var12 != 0 && -+ !block.isLeaves(par1World, var10, var8, var11) && -+ var12 != Block.grass.blockID && -+ var12 != Block.dirt.blockID && -+ !block.isWood(par1World, var10, var8, var11)) - { - var7 = false; - } -@@ -107,7 +113,10 @@ - { - int var17 = var16 - par5; - -- if ((Math.abs(var15) != var13 || Math.abs(var17) != var13 || par2Random.nextInt(2) != 0 && var12 != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var14, var11, var16)]) -+ Block block = Block.blocksList[par1World.getBlockId(var14, var11, var16)]; -+ -+ if ((Math.abs(var15) != var13 || Math.abs(var17) != var13 || par2Random.nextInt(2) != 0 && var12 != 0) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var14, var11, var16))) - { - this.setBlockAndMetadata(par1World, var14, var11, var16, Block.leaves.blockID, this.metaLeaves); - } -@@ -119,7 +128,9 @@ - { - var12 = par1World.getBlockId(par3, par4 + var11, par5); - -- if (var12 == 0 || var12 == Block.leaves.blockID) -+ Block block = Block.blocksList[var12]; -+ -+ if (var12 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var11, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var11, par5, Block.wood.blockID, this.metaWood); - -@@ -159,7 +170,8 @@ - { - for (var15 = par5 - var13; var15 <= par5 + var13; ++var15) - { -- if (par1World.getBlockId(var14, var11, var15) == Block.leaves.blockID) -+ Block block = Block.blocksList[par1World.getBlockId(var14, var11, var15)]; -+ if (block != null && block.isLeaves(par1World, var14, var11, var15)) - { - if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14 - 1, var11, var15) == 0) - { diff --git a/patches/minecraft/net/minecraft/src/WorldProvider.java.patch b/patches/minecraft/net/minecraft/src/WorldProvider.java.patch deleted file mode 100644 index a551f0826..000000000 --- a/patches/minecraft/net/minecraft/src/WorldProvider.java.patch +++ /dev/null @@ -1,56 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldProvider.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldProvider.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.DimensionManager; -+ - public abstract class WorldProvider - { - /** world object being used */ -@@ -174,7 +176,7 @@ - - public static WorldProvider getProviderForDimension(int par0) - { -- return (WorldProvider)(par0 == -1 ? new WorldProviderHell() : (par0 == 0 ? new WorldProviderSurface() : (par0 == 1 ? new WorldProviderEnd() : null))); -+ return DimensionManager.createProviderFor(par0); - } - - /** -@@ -225,4 +227,36 @@ - { - return false; - } -+ -+ /** -+ * Returns the sub-folder of the world folder that this WorldProvider saves to. -+ * EXA: DIM1, DIM-1 -+ * @return The sub-folder name to save this world's chunks to. -+ */ -+ public abstract String getSaveFolder(); -+ -+ /** -+ * A message to display to the user when they transfer to this dimension. -+ * -+ * @return The message to be displayed -+ */ -+ public abstract String getWelcomeMessage(); -+ -+ /** -+ * A Message to display to the user when they transfer out of this dismension. -+ * -+ * @return The message to be displayed -+ */ -+ public abstract String getDepartMessage(); -+ -+ /** -+ * The dimensions movement factor. Relative to normal overworld. -+ * It is applied to the players position when they transfer dimensions. -+ * Exa: Nether movement is 8.0 -+ * @return The movement factor -+ */ -+ public double getMovementFactor() -+ { -+ return 1.0; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/WorldProviderEnd.java.patch b/patches/minecraft/net/minecraft/src/WorldProviderEnd.java.patch deleted file mode 100644 index 379b2ecc0..000000000 --- a/patches/minecraft/net/minecraft/src/WorldProviderEnd.java.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldProviderEnd.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldProviderEnd.java 0000-00-00 00:00:00.000000000 -0000 -@@ -115,4 +115,22 @@ - { - return true; - } -+ -+ @Override -+ public String getSaveFolder() -+ { -+ return "DIM1"; -+ } -+ -+ @Override -+ public String getWelcomeMessage() -+ { -+ return "Entering the End"; -+ } -+ -+ @Override -+ public String getDepartMessage() -+ { -+ return "Leaving the End"; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/WorldProviderHell.java.patch b/patches/minecraft/net/minecraft/src/WorldProviderHell.java.patch deleted file mode 100644 index 5fd187ea6..000000000 --- a/patches/minecraft/net/minecraft/src/WorldProviderHell.java.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldProviderHell.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldProviderHell.java 0000-00-00 00:00:00.000000000 -0000 -@@ -76,4 +76,28 @@ - { - return true; - } -+ -+ @Override -+ public String getSaveFolder() -+ { -+ return "DIM-1"; -+ } -+ -+ @Override -+ public String getWelcomeMessage() -+ { -+ return "Entering the Nether"; -+ } -+ -+ @Override -+ public String getDepartMessage() -+ { -+ return "Leaving the Nether"; -+ } -+ -+ @Override -+ public double getMovementFactor() -+ { -+ return 8.0; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/WorldProviderSurface.java.patch b/patches/minecraft/net/minecraft/src/WorldProviderSurface.java.patch deleted file mode 100644 index a61e158e5..000000000 --- a/patches/minecraft/net/minecraft/src/WorldProviderSurface.java.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldProviderSurface.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldProviderSurface.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,4 +2,22 @@ - - public class WorldProviderSurface extends WorldProvider - { -+ -+ @Override -+ public String getSaveFolder() -+ { -+ return null; -+ } -+ -+ @Override -+ public String getWelcomeMessage() -+ { -+ return null; -+ } -+ -+ @Override -+ public String getDepartMessage() -+ { -+ return null; -+ } - } diff --git a/patches/minecraft/net/minecraft/src/WorldRenderer.java.patch b/patches/minecraft/net/minecraft/src/WorldRenderer.java.patch deleted file mode 100644 index c7002c974..000000000 --- a/patches/minecraft/net/minecraft/src/WorldRenderer.java.patch +++ /dev/null @@ -1,71 +0,0 @@ ---- ../src_base/minecraft/net/minecraft/src/WorldRenderer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft/net/minecraft/src/WorldRenderer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -3,6 +3,9 @@ - import java.util.ArrayList; - import java.util.HashSet; - import java.util.List; -+ -+import net.minecraft.src.forge.ForgeHooksClient; -+ - import org.lwjgl.opengl.GL11; - - public class WorldRenderer -@@ -10,7 +13,6 @@ - /** Reference to the World object. */ - public World worldObj; - private int glRenderList = -1; -- private static Tessellator tessellator = Tessellator.instance; - public static int chunksUpdated = 0; - public int posX; - public int posY; -@@ -179,11 +181,12 @@ - GL11.glTranslatef(-8.0F, -8.0F, -8.0F); - GL11.glScalef(var19, var19, var19); - GL11.glTranslatef(8.0F, 8.0F, 8.0F); -- tessellator.startDrawingQuads(); -- tessellator.setTranslation((double)(-this.posX), (double)(-this.posY), (double)(-this.posZ)); -+ ForgeHooksClient.beforeRenderPass(var11); -+ Tessellator.instance.startDrawingQuads(); -+ Tessellator.instance.setTranslation((double)(-this.posX), (double)(-this.posY), (double)(-this.posZ)); - } - -- if (var11 == 0 && Block.blocksList[var18].hasTileEntity()) -+ if (var11 == 0 && Block.blocksList[var18] != null && Block.blocksList[var18].hasTileEntity(var9.getBlockMetadata(var17, var15, var16))) - { - TileEntity var23 = var9.getBlockTileEntity(var17, var15, var16); - -@@ -196,14 +199,17 @@ - Block var24 = Block.blocksList[var18]; - int var20 = var24.getRenderBlockPass(); - -- if (var20 != var11) -+ if (var20 > var11) - { - var12 = true; - } -- else if (var20 == var11) -+ if (!ForgeHooksClient.canRenderInPass(var24, var11)) - { -- var13 |= var10.renderBlockByRenderType(var24, var17, var15, var16); -+ continue; - } -+ ForgeHooksClient.beforeBlockRender(var24, var10); -+ var13 |= var10.renderBlockByRenderType(var24, var17, var15, var16); -+ ForgeHooksClient.afterBlockRender(var24, var10); - } - } - } -@@ -211,10 +217,11 @@ - - if (var14) - { -- this.bytesDrawn += tessellator.draw(); -+ ForgeHooksClient.afterRenderPass(var11); -+ this.bytesDrawn += Tessellator.instance.draw(); - GL11.glPopMatrix(); - GL11.glEndList(); -- tessellator.setTranslation(0.0D, 0.0D, 0.0D); -+ Tessellator.instance.setTranslation(0.0D, 0.0D, 0.0D); - } - else - { diff --git a/patches/minecraft_server/net/minecraft/server/MinecraftServer.java.patch b/patches/minecraft_server/net/minecraft/server/MinecraftServer.java.patch deleted file mode 100644 index c961262af..000000000 --- a/patches/minecraft_server/net/minecraft/server/MinecraftServer.java.patch +++ /dev/null @@ -1,247 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/server/MinecraftServer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/server/MinecraftServer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -9,6 +9,7 @@ - import java.util.Collections; - import java.util.EnumSet; - import java.util.HashMap; -+import java.util.Hashtable; - import java.util.Iterator; - import java.util.List; - import java.util.Random; -@@ -47,11 +48,13 @@ - import net.minecraft.src.ThreadServerApplication; - import net.minecraft.src.ThreadServerSleep; - import net.minecraft.src.Vec3D; -+import net.minecraft.src.World; - import net.minecraft.src.WorldManager; - import net.minecraft.src.WorldServer; - import net.minecraft.src.WorldServerMulti; - import net.minecraft.src.WorldSettings; - import net.minecraft.src.WorldType; -+import net.minecraft.src.forge.DimensionManager; - - public class MinecraftServer implements Runnable, ICommandListener, IServer - { -@@ -72,9 +75,10 @@ - public PropertyManager propertyManagerObj; - - /** The server world manager. */ -- public WorldServer[] worldMngr; -+ //public WorldServer[] worldMngr; - public long[] field_40027_f = new long[100]; -- public long[][] field_40028_g; -+ //public long[][] field_40028_g; -+ public Hashtable worldTickTimes = new Hashtable(); - - /** the server config manager for this server */ - public ServerConfigurationManager configManager; -@@ -102,7 +106,7 @@ - - /** A list containing all the commands entered. */ - private List commands = Collections.synchronizedList(new ArrayList()); -- public EntityTracker[] entityTracker = new EntityTracker[3]; -+ //public EntityTracker[] entityTracker = new EntityTracker[3]; - - /** True if the server is in online mode. */ - public boolean onlineMode; -@@ -132,6 +136,8 @@ - public long[] field_48082_x = new long[100]; - private RConThreadQuery rconQueryThread; - private RConThreadMain rconMainThread; -+ -+ public int spawnProtectionSize = 16; - - public MinecraftServer() - { -@@ -166,6 +172,7 @@ - this.allowFlight = this.propertyManagerObj.getBooleanProperty("allow-flight", false); - this.motd = this.propertyManagerObj.getStringProperty("motd", "A Minecraft Server"); - this.motd.replace('\u00a7', '$'); -+ spawnProtectionSize = this.propertyManagerObj.getIntProperty("spawn-protection-size", 16); - InetAddress var2 = null; - - if (this.hostname.length() > 0) -@@ -198,9 +205,11 @@ - - FMLServerHandler.instance().onLoadComplete(); - this.configManager = new ServerConfigurationManager(this); -+ /* - this.entityTracker[0] = new EntityTracker(this, 0); - this.entityTracker[1] = new EntityTracker(this, -1); - this.entityTracker[2] = new EntityTracker(this, 1); -+ */ - long var3 = System.nanoTime(); - String var5 = this.propertyManagerObj.getStringProperty("level-name", "world"); - String var6 = this.propertyManagerObj.getStringProperty("level-seed", ""); -@@ -268,53 +277,36 @@ - logger.info("Converting map!"); - par1ISaveFormat.convertMapFormat(par2Str, new ConvertProgressUpdater(this)); - } -- -+ /* - this.worldMngr = new WorldServer[3]; - this.field_40028_g = new long[this.worldMngr.length][100]; -+ */ - int var6 = this.propertyManagerObj.getIntProperty("gamemode", 0); - var6 = WorldSettings.validGameType(var6); - logger.info("Default game type: " + var6); - boolean var7 = this.propertyManagerObj.getBooleanProperty("generate-structures", true); - WorldSettings var8 = new WorldSettings(par3, var6, var7, false, par5WorldType); - AnvilSaveHandler var9 = new AnvilSaveHandler(new File("."), par2Str, true); -- -- for (int var10 = 0; var10 < this.worldMngr.length; ++var10) -- { -- byte var11 = 0; -- -- if (var10 == 1) -- { -- var11 = -1; -- } -- -- if (var10 == 2) -- { -- var11 = 1; -- } -- -- if (var10 == 0) -- { -- this.worldMngr[var10] = new WorldServer(this, var9, par2Str, var11, var8); -- } -- else -- { -- this.worldMngr[var10] = new WorldServerMulti(this, var9, par2Str, var11, var8, this.worldMngr[0]); -- } -- -- this.worldMngr[var10].addWorldAccess(new WorldManager(this, this.worldMngr[var10])); -- this.worldMngr[var10].difficultySetting = this.propertyManagerObj.getIntProperty("difficulty", 1); -- this.worldMngr[var10].setAllowedSpawnTypes(this.propertyManagerObj.getBooleanProperty("spawn-monsters", true), this.spawnPeacefulMobs); -- this.worldMngr[var10].getWorldInfo().setGameType(var6); -- this.configManager.setPlayerManager(this.worldMngr); -+ -+ WorldServer overWorld = new WorldServer(this, var9, par2Str, 0, var8); -+ for (Integer id : DimensionManager.getIDs()) -+ { -+ WorldServer world = (id == 0 ? overWorld : new WorldServerMulti(this, var9, par2Str, id, var8, overWorld)); -+ world.addWorldAccess(new WorldManager(this, world)); -+ world.difficultySetting = propertyManagerObj.getIntProperty("difficulty", 1); -+ world.setAllowedSpawnTypes(propertyManagerObj.getBooleanProperty("spawn-monsters", true), spawnPeacefulMobs); -+ world.getWorldInfo().setGameType(var6); -+ worldTickTimes.put(id, new long[100]); - } -+ configManager.setPlayerManager(new WorldServer[]{ overWorld }); - - short var22 = 196; - long var23 = System.currentTimeMillis(); - -- for (int var13 = 0; var13 < 1; ++var13) -+ for (Integer id : DimensionManager.getIDs()) - { -- logger.info("Preparing start region for level " + var13); -- WorldServer var14 = this.worldMngr[var13]; -+ logger.info("Preparing start region for level " + id); -+ WorldServer var14 = (WorldServer)DimensionManager.getWorld(id); - ChunkCoordinates var15 = var14.getSpawnPoint(); - - for (int var16 = -var22; var16 <= var22 && this.serverRunning; var16 += 16) -@@ -375,9 +367,9 @@ - { - logger.info("Saving chunks"); - -- for (int var1 = 0; var1 < this.worldMngr.length; ++var1) -+ for (World world : DimensionManager.getWorlds()) - { -- WorldServer var2 = this.worldMngr[var1]; -+ WorldServer var2 = (WorldServer)world; - var2.saveWorld(true, (IProgressUpdate)null); - var2.func_30006_w(); - } -@@ -395,13 +387,14 @@ - this.configManager.savePlayerStates(); - } - -- for (int var1 = 0; var1 < this.worldMngr.length; ++var1) -+ for (World world : DimensionManager.getWorlds()) - { -- WorldServer var2 = this.worldMngr[var1]; -+ WorldServer var2 = (WorldServer)world; - - if (var2 != null) - { - this.saveServerWorld(); -+ break; //Added because saveServerWorld() loops through all worlds anyways. - } - } - } -@@ -444,7 +437,7 @@ - var3 += var7; - var1 = var5; - -- if (this.worldMngr[0].isAllPlayersFullyAsleep()) -+ if (((WorldServer)DimensionManager.getWorld(0)).isAllPlayersFullyAsleep()) - { - this.doTick(); - var3 = 0L; -@@ -547,13 +540,13 @@ - Vec3D.initialize(); - ++this.deathTime; - -- for (var9 = 0; var9 < this.worldMngr.length; ++var9) -+ for (Integer id : DimensionManager.getIDs()) - { - long var10 = System.nanoTime(); - -- if (var9 == 0 || this.propertyManagerObj.getBooleanProperty("allow-nether", true)) -+ if (id == 0 || this.propertyManagerObj.getBooleanProperty("allow-nether", true)) - { -- WorldServer var7 = this.worldMngr[var9]; -+ WorldServer var7 = (WorldServer)DimensionManager.getWorld(id); - - if (this.deathTime % 20 == 0) - { -@@ -574,15 +567,15 @@ - } - } - -- this.field_40028_g[var9][this.deathTime % 100] = System.nanoTime() - var10; -+ worldTickTimes.get(id)[this.deathTime % 100] = System.nanoTime() - var10; - } - - this.networkServer.handleNetworkListenThread(); - this.configManager.onTick(); - -- for (var9 = 0; var9 < this.entityTracker.length; ++var9) -+ for (World world : DimensionManager.getWorlds()) - { -- this.entityTracker[var9].updateTrackedEntities(); -+ ((WorldServer)world).entityTracker.updateTrackedEntities(); - } - - for (var9 = 0; var9 < this.playersOnline.size(); ++var9) -@@ -697,7 +690,8 @@ - */ - public WorldServer getWorldManager(int par1) - { -- return par1 == -1 ? this.worldMngr[1] : (par1 == 1 ? this.worldMngr[2] : this.worldMngr[0]); -+ WorldServer ret = (WorldServer)DimensionManager.getWorld(par1); -+ return (ret != null ? ret : (WorldServer)DimensionManager.getWorld(0)); - } - - /** -@@ -705,7 +699,7 @@ - */ - public EntityTracker getEntityTracker(int par1) - { -- return par1 == -1 ? this.entityTracker[1] : (par1 == 1 ? this.entityTracker[2] : this.entityTracker[0]); -+ return getWorldManager(par1).entityTracker; - } - - /** -@@ -875,7 +869,7 @@ - */ - public String getServerBrand() - { -- return "fml"; -+ return "forge"; - } - - /** diff --git a/patches/minecraft_server/net/minecraft/src/AnvilChunkLoader.java.patch b/patches/minecraft_server/net/minecraft/src/AnvilChunkLoader.java.patch deleted file mode 100644 index fa005be0d..000000000 --- a/patches/minecraft_server/net/minecraft/src/AnvilChunkLoader.java.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/AnvilChunkLoader.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/AnvilChunkLoader.java 0000-00-00 00:00:00.000000000 -0000 -@@ -10,6 +10,8 @@ - import java.util.List; - import java.util.Set; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class AnvilChunkLoader implements IChunkLoader, IThreadedFileIO - { - private List field_48469_a = new ArrayList(); -@@ -88,6 +90,7 @@ - } - - var5.removeUnknownBlocks(); -+ ForgeHooks.onChunkLoadData(par1World, var5, par4NBTTagCompound); - return var5; - } - } -@@ -103,6 +106,7 @@ - var3.setTag("Level", var4); - this.writeChunkToNBT(par2Chunk, par1World, var4); - this.func_48463_a(par2Chunk.getChunkCoordIntPair(), var3); -+ ForgeHooks.onChunkSaveData(par1World, par2Chunk, var3); - } - catch (Exception var5) - { diff --git a/patches/minecraft_server/net/minecraft/src/AnvilSaveHandler.java.patch b/patches/minecraft_server/net/minecraft/src/AnvilSaveHandler.java.patch deleted file mode 100644 index 6bf81620e..000000000 --- a/patches/minecraft_server/net/minecraft/src/AnvilSaveHandler.java.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/AnvilSaveHandler.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/AnvilSaveHandler.java 0000-00-00 00:00:00.000000000 -0000 -@@ -18,15 +18,9 @@ - File var2 = this.getWorldDirectory(); - File var3; - -- if (par1WorldProvider instanceof WorldProviderHell) -+ if (par1WorldProvider.getSaveFolder() != null) - { -- var3 = new File(var2, "DIM-1"); -- var3.mkdirs(); -- return new AnvilChunkLoader(var3); -- } -- else if (par1WorldProvider instanceof WorldProviderEnd) -- { -- var3 = new File(var2, "DIM1"); -+ var3 = new File(var2, par1WorldProvider.getSaveFolder()); - var3.mkdirs(); - return new AnvilChunkLoader(var3); - } diff --git a/patches/minecraft_server/net/minecraft/src/Block.java.patch b/patches/minecraft_server/net/minecraft/src/Block.java.patch deleted file mode 100644 index 4f3650dd6..000000000 --- a/patches/minecraft_server/net/minecraft/src/Block.java.patch +++ /dev/null @@ -1,695 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/Block.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/Block.java 0000-00-00 00:00:00.000000000 -0000 -@@ -3,7 +3,10 @@ - import java.util.ArrayList; - import java.util.Random; - --public class Block -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.ITextureProvider; -+ -+public class Block implements ITextureProvider - { - public static final StepSound soundPowderFootstep = new StepSound("stone", 1.0F, 1.0F); - public static final StepSound soundWoodFootstep = new StepSound("wood", 1.0F, 1.0F); -@@ -257,6 +260,7 @@ - lightOpacity[par1] = this.isOpaqueCube() ? 255 : 0; - canBlockGrass[par1] = !par2Material.getCanBlockGrass(); - } -+ isDefaultTexture = (getTextureFile() != null && getTextureFile().equalsIgnoreCase("/terrain.png")); - } - - /** -@@ -397,7 +401,7 @@ - - public boolean hasTileEntity() - { -- return this.isBlockContainer; -+ return hasTileEntity(0); - } - - /** -@@ -536,12 +540,16 @@ - return this.blockID; - } - -+ - /** -- * Defines whether or not a play can break the block with current tool. -+ * Deprecated in favor of a metadata sensitive version -+ * @param entityplayer Entity attacking the block -+ * @return - */ -+ @Deprecated - public float blockStrength(EntityPlayer par1EntityPlayer) - { -- return this.blockHardness < 0.0F ? 0.0F : (!par1EntityPlayer.canHarvestBlock(this) ? 1.0F / this.blockHardness / 100.0F : par1EntityPlayer.getCurrentPlayerStrVsBlock(this) / this.blockHardness / 30.0F); -+ return blockStrength(par1EntityPlayer, 0); - } - - /** -@@ -560,17 +568,13 @@ - if (!par1World.isRemote) - { - int var8 = this.quantityDroppedWithBonus(par7, par1World.rand); -- -- for (int var9 = 0; var9 < var8; ++var9) -+ -+ ArrayList items = getBlockDropped(par1World, par2, par3, par4, par5, par7); -+ for (ItemStack item : items) - { - if (par1World.rand.nextFloat() <= par6) - { -- int var10 = this.idDropped(par5, par1World.rand, par7); -- -- if (var10 > 0) -- { -- this.dropBlockAsItem_do(par1World, par2, par3, par4, new ItemStack(var10, 1, this.damageDropped(par5))); -- } -+ this.dropBlockAsItem_do(par1World, par2, par3, par4, item); - } - } - } -@@ -853,7 +857,7 @@ - par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); - par2EntityPlayer.addExhaustion(0.025F); - -- if (this.canSilkHarvest() && EnchantmentHelper.getSilkTouchModifier(par2EntityPlayer.inventory)) -+ if (this.canSilkHarvest(par1World, par2EntityPlayer, par3, par4, par5, par6) && EnchantmentHelper.getSilkTouchModifier(par2EntityPlayer.inventory)) - { - ItemStack var8 = this.createStackedBlock(par6); - -@@ -974,6 +978,613 @@ - */ - public void onFallenUpon(World par1World, int par2, int par3, int par4, Entity par5Entity, float par6) {} - -+ /* =================================================== FORGE START =====================================*/ -+ protected static int blockFireSpreadSpeed[] = new int[blocksList.length]; -+ protected static int blockFlammability[] = new int[blocksList.length]; -+ protected String currentTexture = "/terrain.png"; -+ public boolean isDefaultTexture = true; -+ /** -+ * Get a light value for this block, normal ranges are between 0 and 15 -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return The light value -+ */ -+ public int getLightValue(IBlockAccess world, int x, int y, int z) -+ { -+ return lightValue[blockID]; -+ } -+ -+ /** -+ * Checks if a player or entity can use this block to 'climb' like a ladder. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block should act like a ladder -+ */ -+ public boolean isLadder(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Return true if the block is a normal, solid cube. This -+ * determines indirect power state, entity ejection from blocks, and a few -+ * others. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block is a full cube -+ */ -+ public boolean isBlockNormalCube(World world, int x, int y, int z) -+ { -+ return blockMaterial.isOpaque() && renderAsNormalBlock(); -+ } -+ -+ /** -+ * Checks if the block is a solid face on the given side, used by placement logic. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @param size The side to check -+ * @return True if the block is solid on the specified side. -+ */ -+ public boolean isBlockSolidOnSide(World world, int x, int y, int z, int side) -+ { -+ int meta = world.getBlockMetadata(x, y, z); -+ if (this instanceof BlockStep) -+ { -+ return (((meta & 8) == 8 && (side == 1)) || isOpaqueCube()); -+ } -+ else if (this instanceof BlockFarmland) -+ { -+ return (side != 1 && side != 0); -+ } -+ else if (this instanceof BlockStairs) -+ { -+ boolean flipped = ((meta & 4) != 0); -+ return ((meta & 3) + side == 5) || (side == 1 && flipped); -+ } -+ return isBlockNormalCube(world, x, y, z); -+ } -+ -+ /** -+ * Determines if a new block can be replace the space occupied by this one, -+ * Used in the player's placement code to make the block act like water, and lava. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block is replaceable by another block -+ */ -+ public boolean isBlockReplaceable(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Determines if this block should set fire and deal fire damage -+ * to entities coming into contact with it. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block should deal damage -+ */ -+ public boolean isBlockBurning(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Determines this block should be treated as an air block -+ * by the rest of the code. This method is primarily -+ * useful for creating pure logic-blocks that will be invisible -+ * to the player and otherwise interact as air would. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block considered air -+ */ -+ public boolean isAirBlock(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Metadata sensitive version of the default getHardness function. -+ * -+ * @param meta The block's current metatdata -+ * @return Block hardness -+ */ -+ public float getHardness(int meta) -+ { -+ return blockHardness; -+ } -+ -+ /** -+ * Determines this block's strength against being destroyed by a player. -+ * -+ * @param world The current world -+ * @param player The player damaging the block, may be null -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return A value -+ */ -+ public float blockStrength(World world, EntityPlayer player, int x, int y, int z) -+ { -+ return blockStrength(player, world.getBlockMetadata(x, y, z)); -+ } -+ -+ /** -+ * Determines this block's strength against being destroyed by a player. -+ * -+ * @param player The player damaging the block, may be null -+ * @param meta The block's current metadata -+ * @return The larger the value, the faster it breaks. -+ */ -+ public float blockStrength(EntityPlayer player, int meta) -+ { -+ return ForgeHooks.blockStrength(this, player, meta); -+ } -+ -+ /** -+ * Determines if the player can harvest this block, obtaining it's drops when the block is destroyed. -+ * -+ * @param player The player damaging the block, may be null -+ * @param meta The block's current metadata -+ * @return True tospawn the drops -+ */ -+ public boolean canHarvestBlock(EntityPlayer player, int meta) -+ { -+ return ForgeHooks.canHarvestBlock(this, player, meta); -+ } -+ -+ /** -+ * Called when a player removes a block. This is responsible for -+ * actually destroying the block, and the block is intact at time of call. -+ * This is called regardless of whether the player can harvest the block or -+ * not. -+ * -+ * Return true if the block is actually destroyed. -+ * -+ * Note: When used in multiplayer, this is called on both client and -+ * server sides! -+ * -+ * @param world The current world -+ * @param player The player damaging the block, may be null -+ * @param x X Position -+ * @param y Y position -+ * @param z Z position -+ * @return True if the block is actually destroyed. -+ */ -+ public boolean removeBlockByPlayer(World world, EntityPlayer player, int x, int y, int z) -+ { -+ return world.setBlockWithNotify(x, y, z, 0); -+ } -+ -+ /** -+ * Called when a new CreativeContainer is opened, populate the list -+ * with all of the items for this block you want a player in creative mode -+ * to have access to. -+ * -+ * @param itemList The list of items to display on the creative inventory. -+ */ -+ public void addCreativeItems(ArrayList itemList) -+ { -+ } -+ -+ /** -+ * Chance that fire will spread and consume this block. -+ * 300 being a 100% chance, 0, being a 0% chance. -+ * -+ * @param world The current world -+ * @param x The blocks X position -+ * @param y The blocks Y position -+ * @param z The blocks Z position -+ * @param metadata The blocks current metadata -+ * @param face The face that the fire is coming from -+ * @return A number ranging from 0 to 300 relating used to determine if the block will be consumed by fire -+ */ -+ public int getFlammability(IBlockAccess world, int x, int y, int z, int metadata, int face) -+ { -+ return blockFlammability[blockID]; -+ } -+ -+ /** -+ * Called when fire is updating, checks if a block face can catch fire. -+ * -+ * -+ * @param world The current world -+ * @param x The blocks X position -+ * @param y The blocks Y position -+ * @param z The blocks Z position -+ * @param metadata The blocks current metadata -+ * @param face The face that the fire is coming from -+ * @return True if the face can be on fire, false otherwise. -+ */ -+ public boolean isFlammable(IBlockAccess world, int x, int y, int z, int metadata, int face) -+ { -+ return getFlammability(world, x, y, z, metadata, face) > 0; -+ } -+ -+ /** -+ * Called when fire is updating on a neighbor block. -+ * The higher the number returned, the faster fire will spread around this block. -+ * -+ * @param world The current world -+ * @param x The blocks X position -+ * @param y The blocks Y position -+ * @param z The blocks Z position -+ * @param metadata The blocks current metadata -+ * @param face The face that the fire is coming from -+ * @return A number that is used to determine the speed of fire growth around the block -+ */ -+ public int getFireSpreadSpeed(World world, int x, int y, int z, int metadata, int face) -+ { -+ return blockFireSpreadSpeed[blockID]; -+ } -+ -+ /** -+ * Currently only called by fire when it is on top of this block. -+ * Returning true will prevent the fire from naturally dying during updating. -+ * Also prevents firing from dying from rain. -+ * -+ * @param world The current world -+ * @param x The blocks X position -+ * @param y The blocks Y position -+ * @param z The blocks Z position -+ * @param metadata The blocks current metadata -+ * @param face The face that the fire is coming from -+ * @return -+ */ -+ public boolean isFireSource(World world, int x, int y, int z, int metadata, int face) -+ { -+ if (blockID == Block.netherrack.blockID && face == 0) -+ { -+ return true; -+ } -+ if ((world.worldProvider instanceof WorldProviderEnd) && blockID == Block.bedrock.blockID && face == 0) -+ { -+ return true; -+ } -+ return false; -+ } -+ -+ /** -+ * Called by BlockFire to setup the burn values of vanilla blocks. -+ * @param id The block id -+ * @param encouragement How much the block encourages fire to spread -+ * @param flammability how easy a block is to catch fire -+ */ -+ public static void setBurnProperties(int id, int encouragement, int flammability) -+ { -+ blockFireSpreadSpeed[id] = encouragement; -+ blockFlammability[id] = flammability; -+ } -+ -+ /** -+ * Called throughout the code as a replacement for block instanceof BlockContainer -+ * Moving this to the Block base class allows for mods that wish to extend vinella -+ * blocks, and also want to have a tile entity on that block, may. -+ * -+ * Return true from this function to specify this block has a tile entity. -+ * -+ * @param metadata Metadata of the current block -+ * @return True if block has a tile entity, false otherwise -+ */ -+ public boolean hasTileEntity(int metadata) -+ { -+ return isBlockContainer; -+ } -+ -+ /** -+ * Called throughout the code as a replacement for BlockContainer.getBlockEntity -+ * Return the same thing you would from that function. -+ * This will fall back to BlockContainer.getBlockEntity if this block is a BlockContainer. -+ * -+ * @param metadata The Metadata of the current block -+ * @return A instance of a class extending TileEntity -+ */ -+ public TileEntity getTileEntity(int metadata) -+ { -+ if (this instanceof BlockContainer) -+ { -+ return ((BlockContainer)this).getBlockEntity(metadata); -+ } -+ return null; -+ } -+ -+ /** -+ * Metadata and fortune sensitive version, this replaces the old (int meta, Random rand) -+ * version in 1.1. -+ * -+ * @param meta Blocks Metadata -+ * @param fortune Current item fortune level -+ * @param random Random number generator -+ * @return The number of items to drop -+ */ -+ public int quantityDropped(int meta, int fortune, Random random) -+ { -+ return quantityDroppedWithBonus(fortune, random); -+ } -+ -+ /** -+ * This returns a complete list of items dropped from this block. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param Y Y Position -+ * @param Z Z Position -+ * @param metadata Current metadata -+ * @param fortune Breakers fortune level -+ * @return A ArrayList containing all items this block drops -+ */ -+ public ArrayList getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ -+ int count = quantityDropped(metadata, fortune, world.rand); -+ for(int i = 0; i < count; i++) -+ { -+ int id = idDropped(metadata, world.rand, 0); -+ if (id > 0) -+ { -+ ret.add(new ItemStack(id, 1, damageDropped(metadata))); -+ } -+ } -+ return ret; -+ } -+ -+ /** -+ * Return true from this function if the player with silk touch can harvest this block directly, and not it's normal drops. -+ * -+ * @param world The world -+ * @param player The player doing the harvesting -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param metadata The metadata -+ * @return True if the block can be directly harvested using silk touch -+ */ -+ public boolean canSilkHarvest(World world, EntityPlayer player, int x, int y, int z, int metadata) -+ { -+ if (this instanceof BlockGlass) -+ { -+ return true; -+ } -+ return renderAsNormalBlock() && !hasTileEntity(metadata); -+ } -+ -+ /** -+ * Determines if a specified mob type can spawn on this block, returning false will -+ * prevent any mob from spawning on the block. -+ * -+ * @param type The Mob Category Type -+ * @param world The current world -+ * @param x The X Position -+ * @param y The Y Position -+ * @param z The Z Position -+ * @return True to allow a mob of the specified category to spawn, false to prevent it. -+ */ -+ public boolean canCreatureSpawn(EnumCreatureType type, World world, int x, int y, int z) -+ { -+ int meta = world.getBlockMetadata(x, y, z); -+ if (this instanceof BlockStep) -+ { -+ if (mod_MinecraftForge.SPAWNER_ALLOW_ON_INVERTED) -+ { -+ return (((meta & 8) == 8) || isOpaqueCube()); -+ } -+ else -+ { -+ return isNormalCube(this.blockID); -+ } -+ } -+ else if (this instanceof BlockStairs) -+ { -+ if (mod_MinecraftForge.SPAWNER_ALLOW_ON_INVERTED) -+ { -+ return ((meta & 4) != 0); -+ } -+ else -+ { -+ return isNormalCube(this.blockID); -+ } -+ } -+ return isBlockSolidOnSide(world, x, y, z, 1); -+ } -+ -+ /** -+ * Determines if this block is classified as a Bed, Allowing -+ * players to sleep in it, though the block has to specifically -+ * perform the sleeping functionality in it's activated event. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param player The player or camera entity, null in some cases. -+ * @return True to treat this as a bed -+ */ -+ public boolean isBed(World world, int x, int y, int z, EntityLiving player) -+ { -+ return blockID == Block.bed.blockID; -+ } -+ -+ /** -+ * Returns the position that the player is moved to upon -+ * waking up, or respawning at the bed. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param player The player or camera entity, null in some cases. -+ * @return The spawn position -+ */ -+ public ChunkCoordinates getBedSpawnPosition(World world, int x, int y, int z, EntityPlayer player) -+ { -+ return BlockBed.getNearestEmptyChunkCoordinates(world, x, y, z, 0); -+ } -+ -+ /** -+ * Called when a user either starts or stops sleeping in the bed. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param player The player or camera entity, null in some cases. -+ * @param occupied True if we are occupying the bed, or false if they are stopping use of the bed -+ */ -+ public void setBedOccupied(World world, int x, int y, int z, EntityPlayer player, boolean occupied) -+ { -+ BlockBed.setBedOccupied(world, x, y, z, occupied); -+ } -+ -+ /** -+ * Returns the direction of the block. Same values that -+ * are returned by BlockDirectional -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return Bed direction -+ */ -+ public int getBedDirection(IBlockAccess world, int x, int y, int z) -+ { -+ return BlockBed.getDirection(world.getBlockMetadata(x, y, z)); -+ } -+ -+ /** -+ * Determines if the current block is the foot half of the bed. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return True if the current block is the foot side of a bed. -+ */ -+ public boolean isBedFoot(IBlockAccess world, int x, int y, int z) -+ { -+ return BlockBed.isBlockFootOfBed(world.getBlockMetadata(x, y, z)); -+ } -+ -+ /** -+ * Called when a leaf should start its decay process. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ */ -+ public void beginLeavesDecay(World world, int x, int y, int z){} -+ -+ /** -+ * Determines if this block can prevent leaves connected to it from decaying. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return true if the presence this block can prevent leaves from decaying. -+ */ -+ public boolean canSustainLeaves(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Determines if this block is considered a leaf block, used to apply the leaf decay and generation system. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return true if this block is considered leaves. -+ */ -+ public boolean isLeaves(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Used during tree growth to determine if newly generated leaves can replace this block. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return true if this block can be replaced by growing leaves. -+ */ -+ public boolean canBeReplacedByLeaves(World world, int x, int y, int z) -+ { -+ return !Block.opaqueCubeLookup[this.blockID]; -+ } -+ -+ /** -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return true if the block is wood (logs) -+ */ -+ public boolean isWood(World world, int x, int y, int z) -+ { -+ return false; -+ } -+ -+ /** -+ * Determines if the current block is replaceable by Ore veins during world generation. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @return True to allow this block to be replaced by a ore -+ */ -+ public boolean isGenMineableReplaceable(World world, int x, int y, int z) -+ { -+ return blockID == stone.blockID; -+ } -+ -+ /** -+ * Grabs the current texture file used for this block -+ */ -+ @Override -+ public String getTextureFile() -+ { -+ return currentTexture; -+ } -+ -+ /** -+ * Sets the current texture file for this block, used when rendering. -+ * Default is "/terrain.png" -+ * -+ * @param texture The texture file -+ */ -+ public void setTextureFile(String texture) -+ { -+ currentTexture = texture; -+ isDefaultTexture = false; -+ } -+ - static - { - Item.itemsList[cloth.blockID] = (new ItemCloth(cloth.blockID - 256)).setItemName("cloth"); diff --git a/patches/minecraft_server/net/minecraft/src/BlockButton.java.patch b/patches/minecraft_server/net/minecraft/src/BlockButton.java.patch deleted file mode 100644 index 9322d4d54..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockButton.java.patch +++ /dev/null @@ -1,90 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockButton.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockButton.java 0000-00-00 00:00:00.000000000 -0000 -@@ -49,7 +49,10 @@ - */ - public boolean canPlaceBlockOnSide(World par1World, int par2, int par3, int par4, int par5) - { -- return par5 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1) ? true : (par5 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : (par5 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : par5 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4))); -+ return (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) || -+ (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) || -+ (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) || -+ (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)); - } - - /** -@@ -57,7 +60,10 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2 - 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : par1World.isBlockNormalCube(par2, par3, par4 + 1))); -+ return par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) || -+ par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2); - } - - /** -@@ -70,19 +76,19 @@ - int var7 = var6 & 8; - var6 &= 7; - -- if (par5 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var6 = 4; - } -- else if (par5 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ else if (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var6 = 3; - } -- else if (par5 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ else if (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var6 = 2; - } -- else if (par5 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ else if (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var6 = 1; - } -@@ -99,7 +105,11 @@ - */ - private int getOrientation(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2 - 1, par3, par4) ? 1 : (par1World.isBlockNormalCube(par2 + 1, par3, par4) ? 2 : (par1World.isBlockNormalCube(par2, par3, par4 - 1) ? 3 : (par1World.isBlockNormalCube(par2, par3, par4 + 1) ? 4 : 1))); -+ if (par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) return 1; -+ if (par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) return 2; -+ if (par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) return 3; -+ if (par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) return 4; -+ return 1; - } - - /** -@@ -113,22 +123,22 @@ - int var6 = par1World.getBlockMetadata(par2, par3, par4) & 7; - boolean var7 = false; - -- if (!par1World.isBlockNormalCube(par2 - 1, par3, par4) && var6 == 1) -+ if (!par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) && var6 == 1) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2 + 1, par3, par4) && var6 == 2) -+ if (!par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) && var6 == 2) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3, par4 - 1) && var6 == 3) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) && var6 == 3) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3, par4 + 1) && var6 == 4) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) && var6 == 4) - { - var7 = true; - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockChest.java.patch b/patches/minecraft_server/net/minecraft/src/BlockChest.java.patch deleted file mode 100644 index 8e5d69cd9..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockChest.java.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockChest.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockChest.java 0000-00-00 00:00:00.000000000 -0000 -@@ -371,7 +371,7 @@ - { - return true; - } -- else if (par1World.isBlockNormalCube(par2, par3 + 1, par4)) -+ else if (par1World.isBlockSolidOnSide(par2, par3 + 1, par4, 0)) - { - return true; - } -@@ -379,19 +379,19 @@ - { - return true; - } -- else if (par1World.getBlockId(par2 - 1, par3, par4) == this.blockID && (par1World.isBlockNormalCube(par2 - 1, par3 + 1, par4) || isOcelotBlockingChest(par1World, par2 - 1, par3, par4))) -+ else if (par1World.getBlockId(par2 - 1, par3, par4) == this.blockID && (par1World.isBlockSolidOnSide(par2 - 1, par3 + 1, par4, 0) || isOcelotBlockingChest(par1World, par2 - 1, par3, par4))) - { - return true; - } -- else if (par1World.getBlockId(par2 + 1, par3, par4) == this.blockID && (par1World.isBlockNormalCube(par2 + 1, par3 + 1, par4) || isOcelotBlockingChest(par1World, par2 + 1, par3, par4))) -+ else if (par1World.getBlockId(par2 + 1, par3, par4) == this.blockID && (par1World.isBlockSolidOnSide(par2 + 1, par3 + 1, par4, 0) || isOcelotBlockingChest(par1World, par2 + 1, par3, par4))) - { - return true; - } -- else if (par1World.getBlockId(par2, par3, par4 - 1) == this.blockID && (par1World.isBlockNormalCube(par2, par3 + 1, par4 - 1) || isOcelotBlockingChest(par1World, par2, par3, par4 - 1))) -+ else if (par1World.getBlockId(par2, par3, par4 - 1) == this.blockID && (par1World.isBlockSolidOnSide(par2, par3 + 1, par4 - 1, 0) || isOcelotBlockingChest(par1World, par2, par3, par4 - 1))) - { - return true; - } -- else if (par1World.getBlockId(par2, par3, par4 + 1) == this.blockID && (par1World.isBlockNormalCube(par2, par3 + 1, par4 + 1) || isOcelotBlockingChest(par1World, par2, par3, par4 + 1))) -+ else if (par1World.getBlockId(par2, par3, par4 + 1) == this.blockID && (par1World.isBlockSolidOnSide(par2, par3 + 1, par4 + 1, 0) || isOcelotBlockingChest(par1World, par2, par3, par4 + 1))) - { - return true; - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockContainer.java.patch b/patches/minecraft_server/net/minecraft/src/BlockContainer.java.patch deleted file mode 100644 index bfaff5aa6..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockContainer.java.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockContainer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockContainer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -20,7 +20,7 @@ - public void onBlockAdded(World par1World, int par2, int par3, int par4) - { - super.onBlockAdded(par1World, par2, par3, par4); -- par1World.setBlockTileEntity(par2, par3, par4, this.getBlockEntity()); -+ par1World.setBlockTileEntity(par2, par3, par4, this.getBlockEntity(par1World.getBlockMetadata(par2, par3, par4))); - } - - /** -@@ -51,4 +51,14 @@ - var7.receiveClientEvent(par5, par6); - } - } -+ -+ /** -+ * Metatdata sensitive version of getBlockEntity -+ * @param metadata The Metatdata for the current block -+ * @return A instance of the TileEntity class associated with this block -+ */ -+ public TileEntity getBlockEntity(int metadata) -+ { -+ return getBlockEntity(); -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockCrops.java.patch b/patches/minecraft_server/net/minecraft/src/BlockCrops.java.patch deleted file mode 100644 index 5bb566fd8..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockCrops.java.patch +++ /dev/null @@ -1,54 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockCrops.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockCrops.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,7 @@ - package net.minecraft.src; - - import java.util.Random; -+import java.util.ArrayList; - - public class BlockCrops extends BlockFlower - { -@@ -129,31 +130,23 @@ - return 6; - } - -- /** -- * Drops the block items with a specified chance of dropping the specified items -- */ -- public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7) -+ @Override -+ public ArrayList getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) - { -- super.dropBlockAsItemWithChance(par1World, par2, par3, par4, par5, par6, 0); -- -- if (!par1World.isRemote) -+ ArrayList ret = new ArrayList(); -+ if (metadata == 7) - { -- int var8 = 3 + par7; -- -- for (int var9 = 0; var9 < var8; ++var9) -+ ret.add(new ItemStack(Item.wheat)); -+ } -+ -+ for (int n = 0; n < 3 + fortune; n++) -+ { -+ if (world.rand.nextInt(15) < metadata) - { -- if (par1World.rand.nextInt(15) <= par5) -- { -- float var10 = 0.7F; -- float var11 = par1World.rand.nextFloat() * var10 + (1.0F - var10) * 0.5F; -- float var12 = par1World.rand.nextFloat() * var10 + (1.0F - var10) * 0.5F; -- float var13 = par1World.rand.nextFloat() * var10 + (1.0F - var10) * 0.5F; -- EntityItem var14 = new EntityItem(par1World, (double)((float)par2 + var11), (double)((float)par3 + var12), (double)((float)par4 + var13), new ItemStack(Item.seeds)); -- var14.delayBeforeCanPickup = 10; -- par1World.spawnEntityInWorld(var14); -- } -+ ret.add(new ItemStack(Item.seeds)); - } - } -+ return ret; - } - - /** diff --git a/patches/minecraft_server/net/minecraft/src/BlockDoor.java.patch b/patches/minecraft_server/net/minecraft/src/BlockDoor.java.patch deleted file mode 100644 index 422183839..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockDoor.java.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockDoor.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockDoor.java 0000-00-00 00:00:00.000000000 -0000 -@@ -167,7 +167,7 @@ - { - if (this.blockMaterial == Material.iron) - { -- return true; -+ return false; - } - else - { -@@ -249,7 +249,7 @@ - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4)) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1)) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - var7 = true; -@@ -302,7 +302,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par3 >= 255 ? false : par1World.isBlockNormalCube(par2, par3 - 1, par4) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); -+ return par3 >= 255 ? false : par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && super.canPlaceBlockAt(par1World, par2, par3, par4) && super.canPlaceBlockAt(par1World, par2, par3 + 1, par4); - } - - /** diff --git a/patches/minecraft_server/net/minecraft/src/BlockFire.java.patch b/patches/minecraft_server/net/minecraft/src/BlockFire.java.patch deleted file mode 100644 index b3a6e6964..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockFire.java.patch +++ /dev/null @@ -1,227 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockFire.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockFire.java 0000-00-00 00:00:00.000000000 -0000 -@@ -25,6 +25,8 @@ - */ - public void initializeBlock() - { -+ abilityToCatchFire = Block.blockFlammability; -+ chanceToEncourageFire = Block.blockFireSpreadSpeed; - this.setBurnRate(Block.planks.blockID, 5, 20); - this.setBurnRate(Block.fence.blockID, 5, 20); - this.setBurnRate(Block.stairCompactPlanks.blockID, 5, 20); -@@ -44,8 +46,7 @@ - */ - private void setBurnRate(int par1, int par2, int par3) - { -- this.chanceToEncourageFire[par1] = par2; -- this.abilityToCatchFire[par1] = par3; -+ Block.setBurnProperties(par1, par2, par3); - } - - /** -@@ -103,7 +104,8 @@ - */ - public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) - { -- boolean var6 = par1World.getBlockId(par2, par3 - 1, par4) == Block.netherrack.blockID; -+ Block base = Block.blocksList[par1World.getBlockId(par2, par3 - 1, par4)]; -+ boolean var6 = (base != null && base.isFireSource(par1World, par2, par3 - 1, par4, par1World.getBlockMetadata(par2, par3 - 1, par4), 0)); - - if (par1World.worldProvider instanceof WorldProviderEnd && par1World.getBlockId(par2, par3 - 1, par4) == Block.bedrock.blockID) - { -@@ -132,12 +134,12 @@ - - if (!var6 && !this.canNeighborBurn(par1World, par2, par3, par4)) - { -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) || var7 > 3) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) || var7 > 3) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - } - } -- else if (!var6 && !this.canBlockCatchFire(par1World, par2, par3 - 1, par4) && var7 == 15 && par5Random.nextInt(4) == 0) -+ else if (!var6 && !this.canBlockCatchFire(par1World, par2, par3 - 1, par4, 1) && var7 == 15 && par5Random.nextInt(4) == 0) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - } -@@ -151,12 +153,12 @@ - var9 = -50; - } - -- this.tryToCatchBlockOnFire(par1World, par2 + 1, par3, par4, 300 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2 - 1, par3, par4, 300 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2, par3 - 1, par4, 250 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2, par3 + 1, par4, 250 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2, par3, par4 - 1, 300 + var9, par5Random, var7); -- this.tryToCatchBlockOnFire(par1World, par2, par3, par4 + 1, 300 + var9, par5Random, var7); -+ this.tryToCatchBlockOnFire(par1World, par2 + 1, par3, par4, 300 + var9, par5Random, var7, 4); -+ this.tryToCatchBlockOnFire(par1World, par2 - 1, par3, par4, 300 + var9, par5Random, var7, 5); -+ this.tryToCatchBlockOnFire(par1World, par2, par3 - 1, par4, 250 + var9, par5Random, var7, 1); -+ this.tryToCatchBlockOnFire(par1World, par2, par3 + 1, par4, 250 + var9, par5Random, var7, 0); -+ this.tryToCatchBlockOnFire(par1World, par2, par3, par4 - 1, 300 + var9, par5Random, var7, 3); -+ this.tryToCatchBlockOnFire(par1World, par2, par3, par4 + 1, 300 + var9, par5Random, var7, 2); - - for (int var10 = par2 - 1; var10 <= par2 + 1; ++var10) - { -@@ -204,9 +206,21 @@ - } - } - -+ /** Deprecated for a side-sensitive version */ -+ @Deprecated - private void tryToCatchBlockOnFire(World par1World, int par2, int par3, int par4, int par5, Random par6Random, int par7) - { -- int var8 = this.abilityToCatchFire[par1World.getBlockId(par2, par3, par4)]; -+ tryToCatchBlockOnFire(par1World, par2, par3, par4, par5, par6Random, par7, 0); -+ } -+ -+ private void tryToCatchBlockOnFire(World par1World, int par2, int par3, int par4, int par5, Random par6Random, int par7, int face) -+ { -+ int var8 = 0; -+ Block block = Block.blocksList[par1World.getBlockId(par2, par3, par4)]; -+ if (block != null) -+ { -+ var8 = block.getFlammability(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), face); -+ } - - if (par6Random.nextInt(par5) < var8) - { -@@ -240,7 +254,12 @@ - */ - private boolean canNeighborBurn(World par1World, int par2, int par3, int par4) - { -- return this.canBlockCatchFire(par1World, par2 + 1, par3, par4) ? true : (this.canBlockCatchFire(par1World, par2 - 1, par3, par4) ? true : (this.canBlockCatchFire(par1World, par2, par3 - 1, par4) ? true : (this.canBlockCatchFire(par1World, par2, par3 + 1, par4) ? true : (this.canBlockCatchFire(par1World, par2, par3, par4 - 1) ? true : this.canBlockCatchFire(par1World, par2, par3, par4 + 1))))); -+ return this.canBlockCatchFire(par1World, par2 + 1, par3, par4, 4) || -+ this.canBlockCatchFire(par1World, par2 - 1, par3, par4, 5) || -+ this.canBlockCatchFire(par1World, par2, par3 - 1, par4, 1) || -+ this.canBlockCatchFire(par1World, par2, par3 + 1, par4, 0) || -+ this.canBlockCatchFire(par1World, par2, par3, par4 - 1, 3) || -+ this.canBlockCatchFire(par1World, par2, par3, par4 + 1, 2); - } - - /** -@@ -256,15 +275,15 @@ - } - else - { -- int var6 = this.getChanceToEncourageFire(par1World, par2 + 1, par3, par4, var5); -- var6 = this.getChanceToEncourageFire(par1World, par2 - 1, par3, par4, var6); -- var6 = this.getChanceToEncourageFire(par1World, par2, par3 - 1, par4, var6); -- var6 = this.getChanceToEncourageFire(par1World, par2, par3 + 1, par4, var6); -- var6 = this.getChanceToEncourageFire(par1World, par2, par3, par4 - 1, var6); -- var6 = this.getChanceToEncourageFire(par1World, par2, par3, par4 + 1, var6); -+ int var6 = this.getChanceToEncourageFire(par1World, par2 + 1, par3, par4, var5, 4); -+ var6 = this.getChanceToEncourageFire(par1World, par2 - 1, par3, par4, var6, 5); -+ var6 = this.getChanceToEncourageFire(par1World, par2, par3 - 1, par4, var6, 1); -+ var6 = this.getChanceToEncourageFire(par1World, par2, par3 + 1, par4, var6, 0); -+ var6 = this.getChanceToEncourageFire(par1World, par2, par3, par4 - 1, var6, 3); -+ var6 = this.getChanceToEncourageFire(par1World, par2, par3, par4 + 1, var6, 2); - return var6; - } -- } -+ } - - /** - * Returns if this block is collidable (only used by Fire). Args: x, y, z -@@ -276,21 +295,24 @@ - - /** - * Checks the specified block coordinate to see if it can catch fire. Args: blockAccess, x, y, z -+ * Deprecated for a side-sensitive version - */ -+ @Deprecated - public boolean canBlockCatchFire(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) - { -- return this.chanceToEncourageFire[par1IBlockAccess.getBlockId(par2, par3, par4)] > 0; -+ return canBlockCatchFire(par1IBlockAccess, par2, par3, par4, 0); - } - - /** - * Retrieves a specified block's chance to encourage their neighbors to burn and if the number is greater than the - * current number passed in it will return its number instead of the passed in one. Args: world, x, y, z, - * curChanceToEncourageFire -+ * Deprecated for a side-sensitive version - */ -+ @Deprecated - public int getChanceToEncourageFire(World par1World, int par2, int par3, int par4, int par5) - { -- int var6 = this.chanceToEncourageFire[par1World.getBlockId(par2, par3, par4)]; -- return var6 > par5 ? var6 : par5; -+ return getChanceToEncourageFire(par1World, par2, par3, par4, par5, 0); - } - - /** -@@ -298,7 +320,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2, par3 - 1, par4) || this.canNeighborBurn(par1World, par2, par3, par4); -+ return par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) || this.canNeighborBurn(par1World, par2, par3, par4); - } - - /** -@@ -307,7 +329,7 @@ - */ - public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) - { -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && !this.canNeighborBurn(par1World, par2, par3, par4)) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && !this.canNeighborBurn(par1World, par2, par3, par4)) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - } -@@ -320,7 +342,7 @@ - { - if (par1World.worldProvider.worldType > 0 || par1World.getBlockId(par2, par3 - 1, par4) != Block.obsidian.blockID || !Block.portal.tryToCreatePortal(par1World, par2, par3, par4)) - { -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && !this.canNeighborBurn(par1World, par2, par3, par4)) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && !this.canNeighborBurn(par1World, par2, par3, par4)) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - } -@@ -330,4 +352,46 @@ - } - } - } -+ -+ /** -+ * Side sensitive version that calls the block function. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param face The side the fire is coming from -+ * @return True if the face can catch fire. -+ */ -+ public boolean canBlockCatchFire(IBlockAccess world, int x, int y, int z, int face) -+ { -+ Block block = Block.blocksList[world.getBlockId(x, y, z)]; -+ if (block != null) -+ { -+ return block.isFlammable(world, x, y, z, world.getBlockMetadata(x, y, z), face); -+ } -+ return false; -+ } -+ -+ /** -+ * Side sensitive version that calls the block function. -+ * -+ * @param world The current world -+ * @param x X Position -+ * @param y Y Position -+ * @param z Z Position -+ * @param oldChance The previous maximum chance. -+ * @param face The side the fire is coming from -+ * @return The chance of the block catching fire, or oldChance if it is higher -+ */ -+ public int getChanceToEncourageFire(World world, int x, int y, int z, int oldChance, int face) -+ { -+ int newChance = 0; -+ Block block = Block.blocksList[world.getBlockId(x, y, z)]; -+ if (block != null) -+ { -+ newChance = block.getFireSpreadSpeed(world, x, y, z, world.getBlockMetadata(x, y, z), face); -+ } -+ return (newChance > oldChance ? newChance : oldChance); -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockLadder.java.patch b/patches/minecraft_server/net/minecraft/src/BlockLadder.java.patch deleted file mode 100644 index ee5f7f66c..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockLadder.java.patch +++ /dev/null @@ -1,79 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockLadder.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockLadder.java 0000-00-00 00:00:00.000000000 -0000 -@@ -71,7 +71,10 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2 - 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : par1World.isBlockNormalCube(par2, par3, par4 + 1))); -+ return par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) || -+ par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2); - } - - /** -@@ -82,22 +85,22 @@ - { - int var6 = par1World.getBlockMetadata(par2, par3, par4); - -- if ((var6 == 0 || par5 == 2) && par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if ((var6 == 0 || par5 == 2) && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var6 = 2; - } - -- if ((var6 == 0 || par5 == 3) && par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ if ((var6 == 0 || par5 == 3) && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var6 = 3; - } - -- if ((var6 == 0 || par5 == 4) && par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ if ((var6 == 0 || par5 == 4) && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var6 = 4; - } - -- if ((var6 == 0 || par5 == 5) && par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ if ((var6 == 0 || par5 == 5) && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var6 = 5; - } -@@ -114,22 +117,22 @@ - int var6 = par1World.getBlockMetadata(par2, par3, par4); - boolean var7 = false; - -- if (var6 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if (var6 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var7 = true; - } - -- if (var6 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ if (var6 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var7 = true; - } - -- if (var6 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ if (var6 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var7 = true; - } - -- if (var6 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ if (var6 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var7 = true; - } -@@ -150,4 +153,10 @@ - { - return 1; - } -+ -+ @Override -+ public boolean isLadder(World world, int x, int y, int z) -+ { -+ return true; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockLeaves.java.patch b/patches/minecraft_server/net/minecraft/src/BlockLeaves.java.patch deleted file mode 100644 index 3ff4b62b6..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockLeaves.java.patch +++ /dev/null @@ -1,93 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockLeaves.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockLeaves.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,8 +1,11 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - --public class BlockLeaves extends BlockLeavesBase -+import net.minecraft.src.forge.IShearable; -+ -+public class BlockLeaves extends BlockLeavesBase implements IShearable - { - /** - * The base index in terrain.png corresponding to the fancy version of the leaf texture. This is stored so we can -@@ -36,10 +39,9 @@ - { - int var10 = par1World.getBlockId(par2 + var7, par3 + var8, par4 + var9); - -- if (var10 == Block.leaves.blockID) -+ if (Block.blocksList[var10] != null) - { -- int var11 = par1World.getBlockMetadata(par2 + var7, par3 + var8, par4 + var9); -- par1World.setBlockMetadata(par2 + var7, par3 + var8, par4 + var9, var11 | 8); -+ Block.blocksList[var10].beginLeavesDecay(par1World, par2 + var7, par3 + var8, par4 + var9); - } - } - } -@@ -84,12 +86,14 @@ - for (var14 = -var7; var14 <= var7; ++var14) - { - var15 = par1World.getBlockId(par2 + var12, par3 + var13, par4 + var14); -+ -+ Block block = Block.blocksList[var15]; - -- if (var15 == Block.wood.blockID) -+ if (block != null && block.canSustainLeaves(par1World, par2 + var12, par3 + var13, par4 + var14)) - { - this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = 0; - } -- else if (var15 == Block.leaves.blockID) -+ else if (block != null && block.isLeaves(par1World, par2 + var12, par3 + var13, par4 + var14)) - { - this.adjacentTreeBlocks[(var12 + var11) * var10 + (var13 + var11) * var9 + var14 + var11] = -2; - } -@@ -216,15 +220,7 @@ - */ - public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) - { -- if (!par1World.isRemote && par2EntityPlayer.getCurrentEquippedItem() != null && par2EntityPlayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex) -- { -- par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); -- this.dropBlockAsItem_do(par1World, par3, par4, par5, new ItemStack(Block.leaves.blockID, 1, par6 & 3)); -- } -- else -- { -- super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -- } -+ super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); - } - - /** -@@ -259,4 +255,30 @@ - { - super.onEntityWalking(par1World, par2, par3, par4, par5Entity); - } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int x, int y, int z, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z) & 3)); -+ return ret; -+ } -+ -+ @Override -+ public void beginLeavesDecay(World world, int x, int y, int z) -+ { -+ world.setBlockMetadata(x, y, z, world.getBlockMetadata(x, y, z) | 8); -+ } -+ -+ @Override -+ public boolean isLeaves(World world, int x, int y, int z) -+ { -+ return true; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockLever.java.patch b/patches/minecraft_server/net/minecraft/src/BlockLever.java.patch deleted file mode 100644 index 368d83f05..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockLever.java.patch +++ /dev/null @@ -1,100 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockLever.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockLever.java 0000-00-00 00:00:00.000000000 -0000 -@@ -46,7 +46,11 @@ - */ - public boolean canPlaceBlockOnSide(World par1World, int par2, int par3, int par4, int par5) - { -- return par5 == 1 && par1World.isBlockNormalCube(par2, par3 - 1, par4) ? true : (par5 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1) ? true : (par5 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : (par5 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : par5 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4)))); -+ return (par5 == 1 && par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1)) || -+ (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) || -+ (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) || -+ (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) || -+ (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)); - } - - /** -@@ -54,7 +58,11 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2 - 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2 + 1, par3, par4) ? true : (par1World.isBlockNormalCube(par2, par3, par4 - 1) ? true : (par1World.isBlockNormalCube(par2, par3, par4 + 1) ? true : par1World.isBlockNormalCube(par2, par3 - 1, par4)))); -+ return par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) || -+ par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) || -+ par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1); - } - - /** -@@ -68,27 +76,27 @@ - var6 &= 7; - var6 = -1; - -- if (par5 == 1 && par1World.isBlockNormalCube(par2, par3 - 1, par4)) -+ if (par5 == 1 && par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1)) - { - var6 = 5 + par1World.rand.nextInt(2); - } - -- if (par5 == 2 && par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var6 = 4; - } - -- if (par5 == 3 && par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ if (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var6 = 3; - } - -- if (par5 == 4 && par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ if (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var6 = 2; - } - -- if (par5 == 5 && par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ if (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var6 = 1; - } -@@ -115,32 +123,32 @@ - int var6 = par1World.getBlockMetadata(par2, par3, par4) & 7; - boolean var7 = false; - -- if (!par1World.isBlockNormalCube(par2 - 1, par3, par4) && var6 == 1) -+ if (!par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) && var6 == 1) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2 + 1, par3, par4) && var6 == 2) -+ if (!par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) && var6 == 2) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3, par4 - 1) && var6 == 3) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) && var6 == 3) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3, par4 + 1) && var6 == 4) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) && var6 == 4) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && var6 == 5) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && var6 == 5) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4) && var6 == 6) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) && var6 == 6) - { - var7 = true; - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockLog.java.patch b/patches/minecraft_server/net/minecraft/src/BlockLog.java.patch deleted file mode 100644 index c417d1cde..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockLog.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockLog.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockLog.java 0000-00-00 00:00:00.000000000 -0000 -@@ -53,14 +53,9 @@ - { - int var10 = par1World.getBlockId(par2 + var7, par3 + var8, par4 + var9); - -- if (var10 == Block.leaves.blockID) -+ if (Block.blocksList[var10] != null) - { -- int var11 = par1World.getBlockMetadata(par2 + var7, par3 + var8, par4 + var9); -- -- if ((var11 & 8) == 0) -- { -- par1World.setBlockMetadata(par2 + var7, par3 + var8, par4 + var9, var11 | 8); -- } -+ Block.blocksList[var10].beginLeavesDecay(par1World, par2 + var7, par3 + var8, par4 + var9); - } - } - } -@@ -83,4 +78,16 @@ - { - return par1; - } -+ -+ @Override -+ public boolean canSustainLeaves(World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ @Override -+ public boolean isWood(World world, int x, int y, int z) -+ { -+ return true; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockNetherStalk.java.patch b/patches/minecraft_server/net/minecraft/src/BlockNetherStalk.java.patch deleted file mode 100644 index 88c900e81..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockNetherStalk.java.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockNetherStalk.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockNetherStalk.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,6 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - - public class BlockNetherStalk extends BlockFlower -@@ -66,30 +67,20 @@ - return 6; - } - -- /** -- * Drops the block items with a specified chance of dropping the specified items -- */ -- public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7) -+ @Override -+ public ArrayList getBlockDropped(World world, int x, int y, int z, int metadata, int fortune) - { -- if (!par1World.isRemote) -+ ArrayList ret = new ArrayList(); -+ int n = 1; -+ if (metadata >= 3) - { -- int var8 = 1; -- -- if (par5 >= 3) -- { -- var8 = 2 + par1World.rand.nextInt(3); -- -- if (par7 > 0) -- { -- var8 += par1World.rand.nextInt(par7 + 1); -- } -- } -- -- for (int var9 = 0; var9 < var8; ++var9) -- { -- this.dropBlockAsItem_do(par1World, par2, par3, par4, new ItemStack(Item.netherStalkSeeds)); -- } -+ n = 2 + world.rand.nextInt(3) + (fortune > 0 ? world.rand.nextInt(fortune + 1) : 0); -+ } -+ for (int m = 0; m < n; m++) -+ { -+ ret.add(new ItemStack(Item.netherStalkSeeds)); - } -+ return ret; - } - - /** diff --git a/patches/minecraft_server/net/minecraft/src/BlockPistonBase.java.patch b/patches/minecraft_server/net/minecraft/src/BlockPistonBase.java.patch deleted file mode 100644 index 80dda4795..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockPistonBase.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockPistonBase.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockPistonBase.java 0000-00-00 00:00:00.000000000 -0000 -@@ -358,7 +358,7 @@ - return false; - } - -- return !(Block.blocksList[par0] instanceof BlockContainer); -+ return !(Block.blocksList[par0] != null && Block.blocksList[par0].hasTileEntity(par1World.getBlockMetadata(par2, par3, par4))); - } - } - diff --git a/patches/minecraft_server/net/minecraft/src/BlockPressurePlate.java.patch b/patches/minecraft_server/net/minecraft/src/BlockPressurePlate.java.patch deleted file mode 100644 index 21e68e8a3..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockPressurePlate.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockPressurePlate.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockPressurePlate.java 0000-00-00 00:00:00.000000000 -0000 -@@ -61,7 +61,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2, par3 - 1, par4) || par1World.getBlockId(par2, par3 - 1, par4) == Block.fence.blockID; -+ return par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) || par1World.getBlockId(par2, par3 - 1, par4) == Block.fence.blockID; - } - - /** diff --git a/patches/minecraft_server/net/minecraft/src/BlockRail.java.patch b/patches/minecraft_server/net/minecraft/src/BlockRail.java.patch deleted file mode 100644 index b615ca8b7..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockRail.java.patch +++ /dev/null @@ -1,212 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockRail.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockRail.java 0000-00-00 00:00:00.000000000 -0000 -@@ -8,13 +8,26 @@ - private final boolean isPowered; - - /** -+ * Forge: Moved render type to a field and a setter. -+ * This allows for a mod to change the render type -+ * for vanilla rails, and any mod rails that extend -+ * this class. -+ */ -+ private int renderType = 9; -+ -+ public void setRenderType(int value) -+ { -+ renderType = value; -+ } -+ -+ /** - * Returns true if the block at the coordinates of world passed is a valid rail block (current is rail, powered or - * detector). - */ - public static final boolean isRailBlockAt(World par0World, int par1, int par2, int par3) - { - int var4 = par0World.getBlockId(par1, par2, par3); -- return var4 == Block.rail.blockID || var4 == Block.railPowered.blockID || var4 == Block.railDetector.blockID; -+ return Block.blocksList[var4] instanceof BlockRail; - } - - /** -@@ -22,7 +35,7 @@ - */ - public static final boolean isRailBlock(int par0) - { -- return par0 == Block.rail.blockID || par0 == Block.railPowered.blockID || par0 == Block.railDetector.blockID; -+ return Block.blocksList[par0] instanceof BlockRail; - } - - protected BlockRail(int par1, int par2, boolean par3) -@@ -118,7 +131,7 @@ - */ - public int getRenderType() - { -- return 9; -+ return renderType; - } - - /** -@@ -134,7 +147,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2, par3 - 1, par4); -+ return par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1); - } - - /** -@@ -171,27 +184,27 @@ - - boolean var8 = false; - -- if (!par1World.isBlockNormalCube(par2, par3 - 1, par4)) -+ if (!par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1)) - { - var8 = true; - } - -- if (var7 == 2 && !par1World.isBlockNormalCube(par2 + 1, par3, par4)) -+ if (var7 == 2 && !par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 1)) - { - var8 = true; - } - -- if (var7 == 3 && !par1World.isBlockNormalCube(par2 - 1, par3, par4)) -+ if (var7 == 3 && !par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 1)) - { - var8 = true; - } - -- if (var7 == 4 && !par1World.isBlockNormalCube(par2, par3, par4 - 1)) -+ if (var7 == 4 && !par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 1)) - { - var8 = true; - } - -- if (var7 == 5 && !par1World.isBlockNormalCube(par2, par3, par4 + 1)) -+ if (var7 == 5 && !par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 1)) - { - var8 = true; - } -@@ -391,10 +404,120 @@ - } - - /** -- * Return true if the blocks passed is a power related rail. -+ * This function is no longer called by Minecraft - */ -+ @Deprecated - static boolean isPoweredBlockRail(BlockRail par0BlockRail) - { - return par0BlockRail.isPowered; - } -+ -+ /** -+ * Return true if the rail can make corners. -+ * Used by placement logic. -+ * @param world The world. -+ * @param x The rail X coordinate. -+ * @param y The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return True if the rail can make corners. -+ */ -+ public boolean isFlexibleRail(World world, int y, int x, int z) -+ { -+ return !isPowered; -+ } -+ -+ /** -+ * Returns true if the rail can make up and down slopes. -+ * Used by placement logic. -+ * @param world The world. -+ * @param x The rail X coordinate. -+ * @param y The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return True if the rail can make slopes. -+ */ -+ public boolean canMakeSlopes(World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ /** -+ * Return the rails metadata (without the power bit if the rail uses one). -+ * Can be used to make the cart think the rail something other than it is, -+ * for example when making diamond junctions or switches. -+ * The cart parameter will often be null unless it it called from EntityMinecart. -+ * -+ * Valid rail metadata is defined as follows: -+ * 0x0: flat track going North-South -+ * 0x1: flat track going West-East -+ * 0x2: track ascending to the East -+ * 0x3: track ascending to the West -+ * 0x4: track ascending to the North -+ * 0x5: track ascending to the South -+ * 0x6: WestNorth corner (connecting East and South) -+ * 0x7: EastNorth corner (connecting West and South) -+ * 0x8: EastSouth corner (connecting West and North) -+ * 0x9: WestSouth corner (connecting East and North) -+ * -+ * All directions are Notch defined. -+ * In MC Beta 1.8.3 the Sun rises in the North. -+ * In MC 1.0.0 the Sun rises in the East. -+ * -+ * @param world The world. -+ * @param cart The cart asking for the metadata, null if it is not called by EntityMinecart. -+ * @param y The rail X coordinate. -+ * @param x The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return The metadata. -+ */ -+ public int getBasicRailMetadata(IBlockAccess world, EntityMinecart cart, int x, int y, int z) -+ { -+ int meta = world.getBlockMetadata(x, y, z); -+ if(isPowered) -+ { -+ meta = meta & 7; -+ } -+ return meta; -+ } -+ -+ /** -+ * Returns the max speed of the rail at the specified position. -+ * @param world The world. -+ * @param cart The cart on the rail, may be null. -+ * @param x The rail X coordinate. -+ * @param y The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return The max speed of the current rail. -+ */ -+ public float getRailMaxSpeed(World world, EntityMinecart cart, int y, int x, int z) -+ { -+ return 0.4f; -+ } -+ -+ /** -+ * This function is called by any minecart that passes over this rail. -+ * It is called once per update tick that the minecart is on the rail. -+ * @param world The world. -+ * @param cart The cart on the rail. -+ * @param y The rail X coordinate. -+ * @param x The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ */ -+ public void onMinecartPass(World world, EntityMinecart cart, int y, int x, int z) -+ { -+ } -+ -+ /** -+ * Return true if this rail uses the 4th bit as a power bit. -+ * Avoid using this function when getBasicRailMetadata() can be used instead. -+ * The only reason to use this function is if you wish to change the rails metadata. -+ * @param world The world. -+ * @param x The rail X coordinate. -+ * @param y The rail Y coordinate. -+ * @param z The rail Z coordinate. -+ * @return True if the 4th bit is a power bit. -+ */ -+ public boolean hasPowerBit(World world, int x, int y, int z) -+ { -+ return isPowered; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockRedstoneRepeater.java.patch b/patches/minecraft_server/net/minecraft/src/BlockRedstoneRepeater.java.patch deleted file mode 100644 index 2d0ba3885..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockRedstoneRepeater.java.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockRedstoneRepeater.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockRedstoneRepeater.java 0000-00-00 00:00:00.000000000 -0000 -@@ -33,7 +33,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return !par1World.isBlockNormalCube(par2, par3 - 1, par4) ? false : super.canPlaceBlockAt(par1World, par2, par3, par4); -+ return !par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) ? false : super.canPlaceBlockAt(par1World, par2, par3, par4); - } - - /** -@@ -41,7 +41,7 @@ - */ - public boolean canBlockStay(World par1World, int par2, int par3, int par4) - { -- return !par1World.isBlockNormalCube(par2, par3 - 1, par4) ? false : super.canBlockStay(par1World, par2, par3, par4); -+ return !par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) ? false : super.canBlockStay(par1World, par2, par3, par4); - } - - /** diff --git a/patches/minecraft_server/net/minecraft/src/BlockRedstoneWire.java.patch b/patches/minecraft_server/net/minecraft/src/BlockRedstoneWire.java.patch deleted file mode 100644 index 0aa260d75..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockRedstoneWire.java.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockRedstoneWire.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockRedstoneWire.java 0000-00-00 00:00:00.000000000 -0000 -@@ -5,6 +5,8 @@ - import java.util.Random; - import java.util.Set; - -+import net.minecraft.src.forge.IConnectRedstone; -+ - public class BlockRedstoneWire extends Block - { - /** -@@ -67,7 +69,7 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCube(par2, par3 - 1, par4) || par1World.getBlockId(par2, par3 - 1, par4) == Block.glowStone.blockID; -+ return par1World.isBlockSolidOnSide(par2, par3 - 1, par4, 1) || par1World.getBlockId(par2, par3 - 1, par4) == Block.glowStone.blockID; - } - - /** -@@ -502,6 +504,10 @@ - } - else if (var5 != Block.redstoneRepeaterIdle.blockID && var5 != Block.redstoneRepeaterActive.blockID) - { -+ if (Block.blocksList[var5] instanceof IConnectRedstone) -+ { -+ return ((IConnectRedstone)Block.blocksList[var5]).canConnectRedstone(par0IBlockAccess, par1, par2, par3, par4); -+ } - return Block.blocksList[var5].canProvidePower() && par4 != -1; - } - else diff --git a/patches/minecraft_server/net/minecraft/src/BlockSnow.java.patch b/patches/minecraft_server/net/minecraft/src/BlockSnow.java.patch deleted file mode 100644 index c5c7b7734..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockSnow.java.patch +++ /dev/null @@ -1,54 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockSnow.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockSnow.java 0000-00-00 00:00:00.000000000 -0000 -@@ -54,7 +54,8 @@ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { - int var5 = par1World.getBlockId(par2, par3 - 1, par4); -- return var5 != 0 && (var5 == Block.leaves.blockID || Block.blocksList[var5].isOpaqueCube()) ? par1World.getBlockMaterial(par2, par3 - 1, par4).blocksMovement() : false; -+ Block block = Block.blocksList[var5]; -+ return var5 != 0 && ((block != null && block.isLeaves(par1World, par2, par3 - 1, par4)) || Block.blocksList[var5].isOpaqueCube()) ? par1World.getBlockMaterial(par2, par3 - 1, par4).blocksMovement() : false; - } - - /** -@@ -73,7 +74,6 @@ - { - if (!this.canPlaceBlockAt(par1World, par2, par3, par4)) - { -- this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); - par1World.setBlockWithNotify(par2, par3, par4, 0); - return false; - } -@@ -89,15 +89,7 @@ - */ - public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) - { -- int var7 = Item.snowball.shiftedIndex; -- float var8 = 0.7F; -- double var9 = (double)(par1World.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D; -- double var11 = (double)(par1World.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D; -- double var13 = (double)(par1World.rand.nextFloat() * var8) + (double)(1.0F - var8) * 0.5D; -- EntityItem var15 = new EntityItem(par1World, (double)par3 + var9, (double)par4 + var11, (double)par5 + var13, new ItemStack(var7, 1, 0)); -- var15.delayBeforeCanPickup = 10; -- par1World.spawnEntityInWorld(var15); -- par1World.setBlockWithNotify(par3, par4, par5, 0); -+ dropBlockAsItem(par1World, par3, par4, par5, par6, 0); - par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); - } - -@@ -114,7 +106,7 @@ - */ - public int quantityDropped(Random par1Random) - { -- return 0; -+ return 1; - } - - /** -@@ -124,7 +116,6 @@ - { - if (par1World.getSavedLightValue(EnumSkyBlock.Block, par2, par3, par4) > 11) - { -- this.dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); - par1World.setBlockWithNotify(par2, par3, par4, 0); - } - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockTallGrass.java.patch b/patches/minecraft_server/net/minecraft/src/BlockTallGrass.java.patch deleted file mode 100644 index 94d465881..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockTallGrass.java.patch +++ /dev/null @@ -1,68 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockTallGrass.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockTallGrass.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,8 +1,12 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - --public class BlockTallGrass extends BlockFlower -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.IShearable; -+ -+public class BlockTallGrass extends BlockFlower implements IShearable - { - protected BlockTallGrass(int par1, int par2) - { -@@ -24,7 +28,7 @@ - */ - public int idDropped(int par1, Random par2Random, int par3) - { -- return par2Random.nextInt(8) == 0 ? Item.seeds.shiftedIndex : -1; -+ return -1; - } - - /** -@@ -41,14 +45,37 @@ - */ - public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) - { -- if (!par1World.isRemote && par2EntityPlayer.getCurrentEquippedItem() != null && par2EntityPlayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex) -+ super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -+ } -+ -+ @Override -+ public ArrayList getBlockDropped(World world, int x, int y, int z, int meta, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ if (world.rand.nextInt(8) != 0) - { -- par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); -- this.dropBlockAsItem_do(par1World, par3, par4, par5, new ItemStack(Block.tallGrass, 1, par6)); -+ return ret; - } -- else -+ -+ ItemStack item = ForgeHooks.getGrassSeed(world); -+ if (item != null) - { -- super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -+ ret.add(item); - } -+ return ret; -+ } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int x, int y, int z, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ ret.add(new ItemStack(this, 1, world.getBlockMetadata(x, y, z))); -+ return ret; - } - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockTorch.java.patch b/patches/minecraft_server/net/minecraft/src/BlockTorch.java.patch deleted file mode 100644 index 09f673edf..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockTorch.java.patch +++ /dev/null @@ -1,102 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockTorch.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockTorch.java 0000-00-00 00:00:00.000000000 -0000 -@@ -49,7 +49,7 @@ - */ - private boolean canPlaceTorchOn(World par1World, int par2, int par3, int par4) - { -- if (par1World.isBlockNormalCubeDefault(par2, par3, par4, true)) -+ if (par1World.isBlockSolidOnSide(par2, par3, par4, 1)) - { - return true; - } -@@ -83,7 +83,11 @@ - */ - public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) - { -- return par1World.isBlockNormalCubeDefault(par2 - 1, par3, par4, true) ? true : (par1World.isBlockNormalCubeDefault(par2 + 1, par3, par4, true) ? true : (par1World.isBlockNormalCubeDefault(par2, par3, par4 - 1, true) ? true : (par1World.isBlockNormalCubeDefault(par2, par3, par4 + 1, true) ? true : this.canPlaceTorchOn(par1World, par2, par3 - 1, par4)))); -+ return par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) || -+ par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) || -+ par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) || -+ this.canPlaceTorchOn(par1World, par2, par3 - 1, par4); - } - - /** -@@ -99,22 +103,22 @@ - var6 = 5; - } - -- if (par5 == 2 && par1World.isBlockNormalCubeDefault(par2, par3, par4 + 1, true)) -+ if (par5 == 2 && par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - var6 = 4; - } - -- if (par5 == 3 && par1World.isBlockNormalCubeDefault(par2, par3, par4 - 1, true)) -+ if (par5 == 3 && par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - var6 = 3; - } - -- if (par5 == 4 && par1World.isBlockNormalCubeDefault(par2 + 1, par3, par4, true)) -+ if (par5 == 4 && par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - var6 = 2; - } - -- if (par5 == 5 && par1World.isBlockNormalCubeDefault(par2 - 1, par3, par4, true)) -+ if (par5 == 5 && par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - var6 = 1; - } -@@ -140,19 +144,19 @@ - */ - public void onBlockAdded(World par1World, int par2, int par3, int par4) - { -- if (par1World.isBlockNormalCubeDefault(par2 - 1, par3, par4, true)) -+ if (par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5)) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 1); - } -- else if (par1World.isBlockNormalCubeDefault(par2 + 1, par3, par4, true)) -+ else if (par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4)) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 2); - } -- else if (par1World.isBlockNormalCubeDefault(par2, par3, par4 - 1, true)) -+ else if (par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3)) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 3); - } -- else if (par1World.isBlockNormalCubeDefault(par2, par3, par4 + 1, true)) -+ else if (par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2)) - { - par1World.setBlockMetadataWithNotify(par2, par3, par4, 4); - } -@@ -175,22 +179,22 @@ - int var6 = par1World.getBlockMetadata(par2, par3, par4); - boolean var7 = false; - -- if (!par1World.isBlockNormalCubeDefault(par2 - 1, par3, par4, true) && var6 == 1) -+ if (!par1World.isBlockSolidOnSide(par2 - 1, par3, par4, 5) && var6 == 1) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCubeDefault(par2 + 1, par3, par4, true) && var6 == 2) -+ if (!par1World.isBlockSolidOnSide(par2 + 1, par3, par4, 4) && var6 == 2) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCubeDefault(par2, par3, par4 - 1, true) && var6 == 3) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 - 1, 3) && var6 == 3) - { - var7 = true; - } - -- if (!par1World.isBlockNormalCubeDefault(par2, par3, par4 + 1, true) && var6 == 4) -+ if (!par1World.isBlockSolidOnSide(par2, par3, par4 + 1, 2) && var6 == 4) - { - var7 = true; - } diff --git a/patches/minecraft_server/net/minecraft/src/BlockTrapDoor.java.patch b/patches/minecraft_server/net/minecraft/src/BlockTrapDoor.java.patch deleted file mode 100644 index 0e4569384..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockTrapDoor.java.patch +++ /dev/null @@ -1,53 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockTrapDoor.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockTrapDoor.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,9 @@ - - public class BlockTrapDoor extends Block - { -+ /** Set this to allow trapdoors to remain free-floating */ -+ public static boolean disableValidation = false; -+ - protected BlockTrapDoor(int par1, Material par2Material) - { - super(par1, par2Material); -@@ -174,7 +177,7 @@ - --var7; - } - -- if (!isValidSupportBlock(par1World.getBlockId(var7, par3, var8))) -+ if (!(isValidSupportBlock(par1World.getBlockId(var7, par3, var8)) || par1World.isBlockSolidOnSide(var7, par3, var8, (var6 & 3) + 2))) - { - par1World.setBlockWithNotify(par2, par3, par4, 0); - this.dropBlockAsItem(par1World, par2, par3, par4, var6, 0); -@@ -235,6 +238,11 @@ - */ - public boolean canPlaceBlockOnSide(World par1World, int par2, int par3, int par4, int par5) - { -+ if (disableValidation) -+ { -+ return true; -+ } -+ - if (par5 == 0) - { - return false; -@@ -265,7 +273,7 @@ - --par2; - } - -- return isValidSupportBlock(par1World.getBlockId(par2, par3, par4)); -+ return isValidSupportBlock(par1World.getBlockId(par2, par3, par4)) || par1World.isBlockSolidOnSide(par2, par3, par4, par5); - } - } - -@@ -280,6 +288,10 @@ - */ - private static boolean isValidSupportBlock(int par0) - { -+ if (disableValidation) -+ { -+ return true; -+ } - if (par0 <= 0) - { - return false; diff --git a/patches/minecraft_server/net/minecraft/src/BlockVine.java.patch b/patches/minecraft_server/net/minecraft/src/BlockVine.java.patch deleted file mode 100644 index e12d0d5c2..000000000 --- a/patches/minecraft_server/net/minecraft/src/BlockVine.java.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/BlockVine.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/BlockVine.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,8 +1,11 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - --public class BlockVine extends Block -+import net.minecraft.src.forge.IShearable; -+ -+public class BlockVine extends Block implements IShearable - { - public BlockVine(int par1) - { -@@ -402,14 +405,26 @@ - */ - public void harvestBlock(World par1World, EntityPlayer par2EntityPlayer, int par3, int par4, int par5, int par6) - { -- if (!par1World.isRemote && par2EntityPlayer.getCurrentEquippedItem() != null && par2EntityPlayer.getCurrentEquippedItem().itemID == Item.shears.shiftedIndex) -- { -- par2EntityPlayer.addStat(StatList.mineBlockStatArray[this.blockID], 1); -- this.dropBlockAsItem_do(par1World, par3, par4, par5, new ItemStack(Block.vine, 1, 0)); -- } -- else -- { -- super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -- } -+ super.harvestBlock(par1World, par2EntityPlayer, par3, par4, par5, par6); -+ } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int x, int y, int z) -+ { -+ return true; -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int x, int y, int z, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ ret.add(new ItemStack(this, 1, 0)); -+ return ret; -+ } -+ -+ @Override -+ public boolean isLadder(World world, int x, int y, int z) -+ { -+ return true; - } - } diff --git a/patches/minecraft_server/net/minecraft/src/Chunk.java.patch b/patches/minecraft_server/net/minecraft/src/Chunk.java.patch deleted file mode 100644 index 95722581e..000000000 --- a/patches/minecraft_server/net/minecraft/src/Chunk.java.patch +++ /dev/null @@ -1,321 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/Chunk.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/Chunk.java 0000-00-00 00:00:00.000000000 -0000 -@@ -8,6 +8,8 @@ - import java.util.Map; - import java.util.Random; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class Chunk - { - /** -@@ -120,7 +122,9 @@ - { - for (int var8 = 0; var8 < var5; ++var8) - { -- byte var9 = par2ArrayOfByte[var6 << 11 | var7 << 7 | var8]; -+ /* FORGE: The following change, a cast from unsigned byte to int, -+ * fixes a vanilla bug when generating new chunks that contain a block ID > 127 */ -+ int var9 = par2ArrayOfByte[var6 << 11 | var7 << 7 | var8] & 0xFF; - - if (var9 != 0) - { -@@ -139,6 +143,48 @@ - } - - /** -+ * Metadata sensitive Chunk constructor for use in new ChunkProviders that -+ * use metadata sensitive blocks during generation. -+ * -+ * @param world The world this chunk belongs to -+ * @param ids A ByteArray containing all the BlockID's to set this chunk to -+ * @param metadata A ByteArray containing all the metadata to set this chunk to -+ * @param chunkX The chunk's X position -+ * @param chunkZ The Chunk's Z position -+ */ -+ public Chunk(World world, byte[] ids, byte[] metadata, int chunkX, int chunkZ) -+ { -+ this(world, chunkX, chunkZ); -+ int height = ids.length / 256; -+ -+ for (int x = 0; x < 16; ++x) -+ { -+ for (int z = 0; z < 16; ++z) -+ { -+ for (int y = 0; y < height; ++y) -+ { -+ int index = x << 11 | z << 7 | y; -+ int id = ids[index] & 0xFF; -+ int meta = metadata[index] & 0x0F; -+ -+ if (id != 0) -+ { -+ int chunkY = y >> 4; -+ -+ if (storageArrays[chunkY] == null) -+ { -+ storageArrays[chunkY] = new ExtendedBlockStorage(chunkY << 4); -+ } -+ -+ storageArrays[chunkY].setExtBlockID(x, y & 15, z, id); -+ storageArrays[chunkY].setExtBlockMetadata(x, y & 15, z, meta); -+ } -+ } -+ } -+ } -+ } -+ -+ /** - * Checks whether the chunk is at the X/Z location specified - */ - public boolean isAtLocation(int par1, int par2) -@@ -465,7 +511,7 @@ - */ - public int getBlockID(int par1, int par2, int par3) - { -- if (par2 >> 4 >= this.storageArrays.length) -+ if (par2 >> 4 >= this.storageArrays.length || par2 >> 4 < 0) - { - return 0; - } -@@ -481,7 +527,7 @@ - */ - public int getBlockMetadata(int par1, int par2, int par3) - { -- if (par2 >> 4 >= this.storageArrays.length) -+ if (par2 >> 4 >= this.storageArrays.length || par2 >> 4 < 0) - { - return 0; - } -@@ -521,6 +567,11 @@ - } - else - { -+ if (par2 >> 4 >= storageArrays.length || par2 >> 4 < 0) -+ { -+ return false; -+ } -+ - ExtendedBlockStorage var9 = this.storageArrays[par2 >> 4]; - boolean var10 = false; - -@@ -545,7 +596,7 @@ - { - Block.blocksList[var8].onBlockRemoval(this.worldObj, var11, par2, var12); - } -- else if (Block.blocksList[var8] instanceof BlockContainer && var8 != par4) -+ if (Block.blocksList[var8] != null && Block.blocksList[var8].hasTileEntity(getBlockMetadata(par1, par2, par3))) - { - this.worldObj.removeBlockTileEntity(var11, par2, var12); - } -@@ -589,32 +640,23 @@ - Block.blocksList[par4].onBlockAdded(this.worldObj, var11, par2, var12); - } - -- if (Block.blocksList[par4] instanceof BlockContainer) -+ if (Block.blocksList[par4] != null && Block.blocksList[par4].hasTileEntity(par5)) - { - var13 = this.getChunkBlockTileEntity(par1, par2, par3); - - if (var13 == null) - { -- var13 = ((BlockContainer)Block.blocksList[par4]).getBlockEntity(); -+ var13 = Block.blocksList[par4].getTileEntity(par5); - this.worldObj.setBlockTileEntity(var11, par2, var12, var13); - } - - if (var13 != null) - { - var13.updateContainingBlockInfo(); -+ var13.blockMetadata = par5; - } - } - } -- else if (var8 > 0 && Block.blocksList[var8] instanceof BlockContainer) -- { -- var13 = this.getChunkBlockTileEntity(par1, par2, par3); -- -- if (var13 != null) -- { -- var13.updateContainingBlockInfo(); -- } -- } -- - this.isModified = true; - return true; - } -@@ -626,7 +668,7 @@ - */ - public boolean setBlockMetadata(int par1, int par2, int par3, int par4) - { -- ExtendedBlockStorage var5 = this.storageArrays[par2 >> 4]; -+ ExtendedBlockStorage var5 = (par2 >> 4 >= storageArrays.length || par2 >> 4 < 0 ? null : storageArrays[par2 >> 4]); - - if (var5 == null) - { -@@ -646,7 +688,7 @@ - var5.setExtBlockMetadata(par1, par2 & 15, par3, par4); - int var7 = var5.getExtBlockID(par1, par2 & 15, par3); - -- if (var7 > 0 && Block.blocksList[var7] instanceof BlockContainer) -+ if (var7 > 0 && Block.blocksList[var7] != null && Block.blocksList[var7].hasTileEntity(var5.getExtBlockMetadata(par1, par2 & 15, par3))) - { - TileEntity var8 = this.getChunkBlockTileEntity(par1, par2, par3); - -@@ -667,7 +709,7 @@ - */ - public int getSavedLightValue(EnumSkyBlock par1EnumSkyBlock, int par2, int par3, int par4) - { -- ExtendedBlockStorage var5 = this.storageArrays[par3 >> 4]; -+ ExtendedBlockStorage var5 = (par3 >> 4 >= storageArrays.length || par3 >> 4 < 0 ? null : storageArrays[par3 >> 4]); - return var5 == null ? par1EnumSkyBlock.defaultLightValue : (par1EnumSkyBlock == EnumSkyBlock.Sky ? var5.getExtSkylightValue(par2, par3 & 15, par4) : (par1EnumSkyBlock == EnumSkyBlock.Block ? var5.getExtBlocklightValue(par2, par3 & 15, par4) : par1EnumSkyBlock.defaultLightValue)); - } - -@@ -677,6 +719,11 @@ - */ - public void setLightValue(EnumSkyBlock par1EnumSkyBlock, int par2, int par3, int par4, int par5) - { -+ if (par3 >> 4 >= storageArrays.length || par3 >> 4 < 0) -+ { -+ return; -+ } -+ - ExtendedBlockStorage var6 = this.storageArrays[par3 >> 4]; - - if (var6 == null) -@@ -710,7 +757,7 @@ - */ - public int getBlockLightValue(int par1, int par2, int par3, int par4) - { -- ExtendedBlockStorage var5 = this.storageArrays[par2 >> 4]; -+ ExtendedBlockStorage var5 = (par2 >> 4 >= storageArrays.length || par2 >> 4 < 0 ? null : storageArrays[par2 >> 4]); - - if (var5 == null) - { -@@ -812,34 +859,31 @@ - { - ChunkPosition var4 = new ChunkPosition(par1, par2, par3); - TileEntity var5 = (TileEntity)this.chunkTileEntityMap.get(var4); -+ -+ if (var5 != null && var5.isInvalid()) -+ { -+ chunkTileEntityMap.remove(var4); -+ var5 = null; -+ } - - if (var5 == null) - { - int var6 = this.getBlockID(par1, par2, par3); -- -- if (var6 <= 0 || !Block.blocksList[var6].hasTileEntity()) -+ int meta = getBlockMetadata(par1, par2, par3); -+ if (var6 <= 0 || Block.blocksList[var6] == null || !Block.blocksList[var6].hasTileEntity(meta)) - { - return null; - } - - if (var5 == null) - { -- var5 = ((BlockContainer)Block.blocksList[var6]).getBlockEntity(); -+ var5 = Block.blocksList[var6].getTileEntity(meta); - this.worldObj.setBlockTileEntity(this.xPosition * 16 + par1, par2, this.zPosition * 16 + par3, var5); - } - - var5 = (TileEntity)this.chunkTileEntityMap.get(var4); - } -- -- if (var5 != null && var5.isInvalid()) -- { -- this.chunkTileEntityMap.remove(var4); -- return null; -- } -- else -- { -- return var5; -- } -+ return var5; - } - - /** -@@ -854,7 +898,7 @@ - - if (this.isChunkLoaded) - { -- this.worldObj.loadedTileEntityList.add(par1TileEntity); -+ this.worldObj.addTileEntity(par1TileEntity); - } - } - -@@ -869,8 +913,14 @@ - par4TileEntity.yCoord = par2; - par4TileEntity.zCoord = this.zPosition * 16 + par3; - -- if (this.getBlockID(par1, par2, par3) != 0 && Block.blocksList[this.getBlockID(par1, par2, par3)] instanceof BlockContainer) -+ int id = getBlockID(par1, par2, par3); -+ if (id > 0 && Block.blocksList[id] != null && Block.blocksList[id].hasTileEntity(getBlockMetadata(par1, par2, par3))) - { -+ TileEntity old = (TileEntity)chunkTileEntityMap.get(var5); -+ if (old != null) -+ { -+ old.invalidate(); -+ } - par4TileEntity.validate(); - this.chunkTileEntityMap.put(var5, par4TileEntity); - } -@@ -906,6 +956,7 @@ - { - this.worldObj.addLoadedEntities(this.entityLists[var1]); - } -+ ForgeHooks.onChunkLoad(worldObj, this); - } - - /** -@@ -926,6 +977,7 @@ - { - this.worldObj.unloadEntities(this.entityLists[var3]); - } -+ ForgeHooks.onChunkUnload(worldObj, this); - } - - /** -@@ -942,8 +994,8 @@ - */ - public void getEntitiesWithinAABBForEntity(Entity par1Entity, AxisAlignedBB par2AxisAlignedBB, List par3List) - { -- int var4 = MathHelper.floor_double((par2AxisAlignedBB.minY - 2.0D) / 16.0D); -- int var5 = MathHelper.floor_double((par2AxisAlignedBB.maxY + 2.0D) / 16.0D); -+ int var4 = MathHelper.floor_double((par2AxisAlignedBB.minY - World.MAX_ENTITY_RADIUS) / 16.0D); -+ int var5 = MathHelper.floor_double((par2AxisAlignedBB.maxY + World.MAX_ENTITY_RADIUS) / 16.0D); - - if (var4 < 0) - { -@@ -990,8 +1042,8 @@ - */ - public void getEntitiesOfTypeWithinAAAB(Class par1Class, AxisAlignedBB par2AxisAlignedBB, List par3List) - { -- int var4 = MathHelper.floor_double((par2AxisAlignedBB.minY - 2.0D) / 16.0D); -- int var5 = MathHelper.floor_double((par2AxisAlignedBB.maxY + 2.0D) / 16.0D); -+ int var4 = MathHelper.floor_double((par2AxisAlignedBB.minY - World.MAX_ENTITY_RADIUS) / 16.0D); -+ int var5 = MathHelper.floor_double((par2AxisAlignedBB.maxY + World.MAX_ENTITY_RADIUS) / 16.0D); - - if (var4 < 0) - { -@@ -1290,4 +1342,18 @@ - } - } - } -+ -+ /** FORGE: Used to remove only invalid TileEntities */ -+ public void cleanChunkBlockTileEntity(int x, int y, int z) -+ { -+ ChunkPosition position = new ChunkPosition(x, y, z); -+ if (isChunkLoaded) -+ { -+ TileEntity entity = (TileEntity)chunkTileEntityMap.get(position); -+ if (entity != null && entity.isInvalid()) -+ { -+ chunkTileEntityMap.remove(position); -+ } -+ } -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/ChunkProvider.java.patch b/patches/minecraft_server/net/minecraft/src/ChunkProvider.java.patch deleted file mode 100644 index 543c6527b..000000000 --- a/patches/minecraft_server/net/minecraft/src/ChunkProvider.java.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ChunkProvider.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ChunkProvider.java 0000-00-00 00:00:00.000000000 -0000 -@@ -6,6 +6,8 @@ - import java.util.List; - import java.util.Set; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ChunkProvider implements IChunkProvider - { - /** A set of dropped chunks. Currently not used in single player. */ -@@ -51,6 +53,11 @@ - */ - public void dropChunk(int par1, int par2) - { -+ if(!ForgeHooks.canUnloadChunk(worldObj.getChunkFromChunkCoords(par1, par2))) -+ { -+ return; -+ } -+ - ChunkCoordinates var3 = this.worldObj.getSpawnPoint(); - int var4 = par1 * 16 + 8 - var3.posX; - int var5 = par2 * 16 + 8 - var3.posZ; diff --git a/patches/minecraft_server/net/minecraft/src/ChunkProviderServer.java.patch b/patches/minecraft_server/net/minecraft/src/ChunkProviderServer.java.patch deleted file mode 100644 index 957b67cf7..000000000 --- a/patches/minecraft_server/net/minecraft/src/ChunkProviderServer.java.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ChunkProviderServer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ChunkProviderServer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -9,6 +9,8 @@ - - import cpw.mods.fml.server.FMLServerHandler; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ChunkProviderServer implements IChunkProvider - { - private Set droppedChunksSet = new HashSet(); -@@ -51,6 +53,11 @@ - - public void dropChunk(int par1, int par2) - { -+ if(!ForgeHooks.canUnloadChunk(world.getChunkFromChunkCoords(par1, par2))) -+ { -+ return; -+ } -+ - if (this.world.worldProvider.canRespawnHere()) - { - ChunkCoordinates var3 = this.world.getSpawnPoint(); diff --git a/patches/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java.patch b/patches/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java.patch deleted file mode 100644 index 323e3d7f9..000000000 --- a/patches/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java.patch +++ /dev/null @@ -1,108 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ConsoleCommandHandler.java 0000-00-00 00:00:00.000000000 -0000 -@@ -6,6 +6,8 @@ - - import cpw.mods.fml.server.FMLServerHandler; - import net.minecraft.server.MinecraftServer; -+import net.minecraft.src.forge.DimensionManager; -+import net.minecraft.src.forge.ForgeHooks; - - public class ConsoleCommandHandler - { -@@ -57,9 +59,9 @@ - var8.savePlayerStates(); - } - -- for (var9 = 0; var9 < this.minecraftServer.worldMngr.length; ++var9) -+ for (World world : DimensionManager.getWorlds()) - { -- var10 = this.minecraftServer.worldMngr[var9]; -+ var10 = (WorldServer)world; - boolean var11 = var10.levelSaving; - var10.levelSaving = false; - var10.saveWorld(true, (IProgressUpdate)null); -@@ -72,20 +74,18 @@ - { - this.sendNoticeToOps(var7, "Disabling level saving.."); - -- for (var9 = 0; var9 < this.minecraftServer.worldMngr.length; ++var9) -+ for (World world : DimensionManager.getWorlds()) - { -- var10 = this.minecraftServer.worldMngr[var9]; -- var10.levelSaving = true; -+ ((WorldServer)world).levelSaving = true; - } - } - else if (var4.equalsIgnoreCase("save-on")) - { - this.sendNoticeToOps(var7, "Enabling level saving.."); - -- for (var9 = 0; var9 < this.minecraftServer.worldMngr.length; ++var9) -+ for (World world : DimensionManager.getWorlds()) - { -- var10 = this.minecraftServer.worldMngr[var9]; -- var10.levelSaving = false; -+ ((WorldServer)world).levelSaving = false; - } - } - else if (var4.equalsIgnoreCase("op")) -@@ -332,20 +332,18 @@ - - if ("add".equalsIgnoreCase(var19)) - { -- for (var21 = 0; var21 < this.minecraftServer.worldMngr.length; ++var21) -+ for (World world : DimensionManager.getWorlds()) - { -- var24 = this.minecraftServer.worldMngr[var21]; -- var24.advanceTime(var24.getWorldTime() + (long)var23); -+ world.advanceTime(world.getWorldTime() + (long)var23); - } - - this.sendNoticeToOps(var7, "Added " + var23 + " to time"); - } - else if ("set".equalsIgnoreCase(var19)) - { -- for (var21 = 0; var21 < this.minecraftServer.worldMngr.length; ++var21) -+ for (World world : DimensionManager.getWorlds()) - { -- var24 = this.minecraftServer.worldMngr[var21]; -- var24.advanceTime((long)var23); -+ world.advanceTime((long)var23); - } - - this.sendNoticeToOps(var7, "Set time to " + var23); -@@ -362,8 +360,12 @@ - } - else if (var4.equalsIgnoreCase("say") && var5.length() > 0) - { -- minecraftLogger.info("[" + var7 + "] " + var5); -- var8.sendPacketToAllPlayers(new Packet3Chat("\u00a7d[Server] " + var5)); -+ var5 = ForgeHooks.onServerCommandSay(var6, var6.getUsername(), var5); -+ if (var5 != null) -+ { -+ minecraftLogger.info("[" + var7 + "] " + var5); -+ var8.sendPacketToAllPlayers(new Packet3Chat("\u00a7d[Server] " + var5)); -+ } - } - else if (var4.equalsIgnoreCase("tell")) - { -@@ -387,7 +389,7 @@ - } - else if (var4.equalsIgnoreCase("toggledownfall")) - { -- this.minecraftServer.worldMngr[0].commandToggleDownfall(); -+ ((WorldServer)DimensionManager.getWorld(0)).commandToggleDownfall(); - var6.log("Toggling rain and snow, hold on..."); - } - else if (var4.equalsIgnoreCase("banlist")) -@@ -408,6 +410,10 @@ - { - - } -+ else if (ForgeHooks.onServerCommand(var6, var6.getUsername(), var2)) -+ { -+ //Nom Nom Nom, Do we need to log anything, Let the command handle it themselves. -+ } - else - { - minecraftLogger.info("Unknown console command. Type \"help\" for help."); diff --git a/patches/minecraft_server/net/minecraft/src/ContainerFurnace.java.patch b/patches/minecraft_server/net/minecraft/src/ContainerFurnace.java.patch deleted file mode 100644 index cf5c14f6b..000000000 --- a/patches/minecraft_server/net/minecraft/src/ContainerFurnace.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ContainerFurnace.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ContainerFurnace.java 0000-00-00 00:00:00.000000000 -0000 -@@ -98,7 +98,7 @@ - } - else if (par1 != 1 && par1 != 0) - { -- if (FurnaceRecipes.smelting().getSmeltingResult(var4.getItem().shiftedIndex) != null) -+ if (FurnaceRecipes.smelting().getSmeltingResult(var4) != null) - { - if (!this.mergeItemStack(var4, 0, 1, false)) - { diff --git a/patches/minecraft_server/net/minecraft/src/CraftingManager.java.patch b/patches/minecraft_server/net/minecraft/src/CraftingManager.java.patch deleted file mode 100644 index 5edfef84a..000000000 --- a/patches/minecraft_server/net/minecraft/src/CraftingManager.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/CraftingManager.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/CraftingManager.java 0000-00-00 00:00:00.000000000 -0000 -@@ -242,7 +242,7 @@ - } - } - -- if (var2 == 2 && var3.itemID == var4.itemID && var3.stackSize == 1 && var4.stackSize == 1 && Item.itemsList[var3.itemID].isDamageable()) -+ if (var2 == 2 && var3.itemID == var4.itemID && var3.stackSize == 1 && var4.stackSize == 1 && Item.itemsList[var3.itemID].isRepairable()) - { - Item var11 = Item.itemsList[var3.itemID]; - int var10 = var11.getMaxDamage() - var3.getItemDamageForDisplay(); diff --git a/patches/minecraft_server/net/minecraft/src/Enchantment.java.patch b/patches/minecraft_server/net/minecraft/src/Enchantment.java.patch deleted file mode 100644 index bcd0656e6..000000000 --- a/patches/minecraft_server/net/minecraft/src/Enchantment.java.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/Enchantment.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/Enchantment.java 0000-00-00 00:00:00.000000000 -0000 -@@ -174,4 +174,14 @@ - this.name = par1Str; - return this; - } -+ -+ /** -+ * Called to determine if this enchantment can be applied to a ItemStack -+ * @param item The ItemStack that the enchantment might be put on -+ * @return True if the item is valid, false otherwise -+ */ -+ public boolean canEnchantItem(ItemStack item) -+ { -+ return type.canEnchantItem(item.getItem()); -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/EnchantmentHelper.java.patch b/patches/minecraft_server/net/minecraft/src/EnchantmentHelper.java.patch deleted file mode 100644 index 221b46ba9..000000000 --- a/patches/minecraft_server/net/minecraft/src/EnchantmentHelper.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EnchantmentHelper.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EnchantmentHelper.java 0000-00-00 00:00:00.000000000 -0000 -@@ -357,7 +357,7 @@ - { - Enchantment var7 = var4[var6]; - -- if (var7 != null && var7.type.canEnchantItem(var2)) -+ if (var7 != null && var7.canEnchantItem(par1ItemStack)) - { - for (int var8 = var7.getMinLevel(); var8 <= var7.getMaxLevel(); ++var8) - { diff --git a/patches/minecraft_server/net/minecraft/src/Entity.java.patch b/patches/minecraft_server/net/minecraft/src/Entity.java.patch deleted file mode 100644 index 4a42c6d52..000000000 --- a/patches/minecraft_server/net/minecraft/src/Entity.java.patch +++ /dev/null @@ -1,89 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/Entity.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/Entity.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,6 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.List; - import java.util.Random; - -@@ -165,6 +166,11 @@ - public boolean ignoreFrustumCheck; - public boolean isAirBorne; - -+ /** Forge: Used to store custom data for each entity. */ -+ private NBTTagCompound customEntityData; -+ protected boolean captureDrops = false; -+ protected ArrayList capturedDrops = new ArrayList(); -+ - public Entity(World par1World) - { - this.entityId = nextEntityID++; -@@ -206,6 +212,29 @@ - - protected abstract void entityInit(); - -+ /** -+ * Returns a NBTTagCompound that can be used to store custom data for this entity. -+ * It will be written, and read from disc, so it persists over world saves. -+ * @return A NBTTagCompound -+ */ -+ public NBTTagCompound getEntityData() -+ { -+ if (customEntityData == null) -+ { -+ customEntityData = new NBTTagCompound(); -+ } -+ return customEntityData; -+ } -+ -+ /** -+ * Used in model rendering to determine if the entity riding this entity should be in the 'sitting' position. -+ * @return false to prevent an entity that is mounted to this entity from displaying the 'sitting' animation. -+ */ -+ public boolean shouldRiderSit() -+ { -+ return true; -+ } -+ - public DataWatcher getDataWatcher() - { - return this.dataWatcher; -@@ -1215,6 +1244,10 @@ - par1NBTTagCompound.setShort("Fire", (short)this.fire); - par1NBTTagCompound.setShort("Air", (short)this.getAir()); - par1NBTTagCompound.setBoolean("OnGround", this.onGround); -+ if (customEntityData != null) -+ { -+ par1NBTTagCompound.setCompoundTag("ForgeData", customEntityData); -+ } - this.writeEntityToNBT(par1NBTTagCompound); - } - -@@ -1256,6 +1289,10 @@ - this.onGround = par1NBTTagCompound.getBoolean("OnGround"); - this.setPosition(this.posX, this.posY, this.posZ); - this.setRotation(this.rotationYaw, this.rotationPitch); -+ if (par1NBTTagCompound.hasKey("ForgeData")) -+ { -+ customEntityData = par1NBTTagCompound.getCompoundTag("ForgeData"); -+ } - this.readEntityFromNBT(par1NBTTagCompound); - } - -@@ -1336,7 +1373,14 @@ - { - EntityItem var3 = new EntityItem(this.worldObj, this.posX, this.posY + (double)par2, this.posZ, par1ItemStack); - var3.delayBeforeCanPickup = 10; -- this.worldObj.spawnEntityInWorld(var3); -+ if (captureDrops) -+ { -+ capturedDrops.add(var3); -+ } -+ else -+ { -+ this.worldObj.spawnEntityInWorld(var3); -+ } - return var3; - } - diff --git a/patches/minecraft_server/net/minecraft/src/EntityEnderman.java.patch b/patches/minecraft_server/net/minecraft/src/EntityEnderman.java.patch deleted file mode 100644 index 3643cf33d..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityEnderman.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityEnderman.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityEnderman.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,7 +2,7 @@ - - public class EntityEnderman extends EntityMob - { -- private static boolean[] canCarryBlocks = new boolean[256]; -+ private static boolean[] canCarryBlocks = new boolean[Block.blocksList.length]; - - /** Is the enderman attacking another entity? */ - public boolean isAttacking = false; diff --git a/patches/minecraft_server/net/minecraft/src/EntityItem.java.patch b/patches/minecraft_server/net/minecraft/src/EntityItem.java.patch deleted file mode 100644 index a47e1317e..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityItem.java.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityItem.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityItem.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,8 @@ - - import cpw.mods.fml.server.FMLServerHandler; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class EntityItem extends Entity - { - /** The item stack of this EntityItem. */ -@@ -177,6 +179,20 @@ - if (!this.worldObj.isRemote) - { - int var2 = this.item.stackSize; -+ -+ if (delayBeforeCanPickup == 0 && !ForgeHooks.onItemPickup(par1EntityPlayer, this)) -+ { -+ FMLServerHandler.instance().notifyItemPickup(this,par1EntityPlayer); -+ this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((rand.nextFloat() - rand.nextFloat()) * 0.7F + 1.0F) * 2.0F); -+ par1EntityPlayer.onItemPickup(this, var2); -+ if (item.stackSize <= 0) -+ { -+ setDead(); -+ } -+ return; -+ } -+ -+ var2 = item.stackSize; - - if (this.delayBeforeCanPickup == 0 && par1EntityPlayer.inventory.addItemStackToInventory(this.item)) - { diff --git a/patches/minecraft_server/net/minecraft/src/EntityLiving.java.patch b/patches/minecraft_server/net/minecraft/src/EntityLiving.java.patch deleted file mode 100644 index 5019ccc89..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityLiving.java.patch +++ /dev/null @@ -1,148 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityLiving.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityLiving.java 0000-00-00 00:00:00.000000000 -0000 -@@ -6,6 +6,8 @@ - import java.util.List; - import java.util.Random; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public abstract class EntityLiving extends Entity - { - public int heartsHalvesLife = 20; -@@ -59,7 +61,7 @@ - * in each step in the damage calculations, this is set to the 'carryover' that would result if someone was damaged - * .25 hearts (for example), and added to the damage in the next step - */ -- protected int carryoverDamage; -+ public int carryoverDamage; - - /** Number of ticks since this EntityLiving last produced its sound */ - private int livingSoundTime; -@@ -300,6 +302,7 @@ - public void setAttackTarget(EntityLiving par1EntityLiving) - { - this.attackTarget = par1EntityLiving; -+ ForgeHooks.onEntityLivingSetAttackTarget(this, par1EntityLiving); - } - - public boolean func_48336_a(Class par1Class) -@@ -356,6 +359,7 @@ - { - this.entityLivingToAttack = par1EntityLiving; - this.revengeTimer = this.entityLivingToAttack != null ? 60 : 0; -+ ForgeHooks.onEntityLivingSetAttackTarget(this, par1EntityLiving); - } - - protected void entityInit() -@@ -616,6 +620,11 @@ - */ - public void onUpdate() - { -+ if (ForgeHooks.onEntityLivingUpdate(this)) -+ { -+ return; -+ } -+ - super.onUpdate(); - - if (this.arrowHitTempCounter > 0) -@@ -808,6 +817,11 @@ - */ - public boolean attackEntityFrom(DamageSource par1DamageSource, int par2) - { -+ if (ForgeHooks.onEntityLivingAttacked(this, par1DamageSource, par2)) -+ { -+ return false; -+ } -+ - if (this.worldObj.isRemote) - { - return false; -@@ -977,6 +991,12 @@ - */ - protected void damageEntity(DamageSource par1DamageSource, int par2) - { -+ par2 = ForgeHooks.onEntityLivingHurt(this, par1DamageSource, par2); -+ if (par2 == 0) -+ { -+ return; -+ } -+ - par2 = this.applyArmorCalculations(par1DamageSource, par2); - par2 = this.applyPotionDamageCalculations(par1DamageSource, par2); - this.health -= par2; -@@ -1040,6 +1060,11 @@ - */ - public void onDeath(DamageSource par1DamageSource) - { -+ if (ForgeHooks.onEntityLivingDeath(this, par1DamageSource)) -+ { -+ return; -+ } -+ - Entity var2 = par1DamageSource.getEntity(); - - if (this.scoreValue >= 0 && var2 != null) -@@ -1063,13 +1088,17 @@ - var3 = EnchantmentHelper.getLootingModifier(((EntityPlayer)var2).inventory); - } - -+ captureDrops = true; -+ capturedDrops.clear(); -+ int var4 = 0; -+ - if (!this.isChild()) - { - this.dropFewItems(this.recentlyHit > 0, var3); - - if (this.recentlyHit > 0) - { -- int var4 = this.rand.nextInt(200) - var3; -+ var4 = this.rand.nextInt(200) - var3; - - if (var4 < 5) - { -@@ -1077,6 +1106,13 @@ - } - } - } -+ -+ captureDrops = false; -+ ForgeHooks.onEntityLivingDrops(this, par1DamageSource, capturedDrops, var3, recentlyHit > 0, var4); -+ for (EntityItem item : capturedDrops) -+ { -+ worldObj.spawnEntityInWorld(item); -+ } - } - - this.worldObj.setEntityState(this, (byte)3); -@@ -1120,6 +1156,11 @@ - */ - protected void fall(float par1) - { -+ if (ForgeHooks.onEntityLivingFall(this, par1)) -+ { -+ return; -+ } -+ - super.fall(par1); - int var2 = (int)Math.ceil((double)(par1 - 3.0F)); - -@@ -1307,7 +1348,7 @@ - int var2 = MathHelper.floor_double(this.boundingBox.minY); - int var3 = MathHelper.floor_double(this.posZ); - int var4 = this.worldObj.getBlockId(var1, var2, var3); -- return var4 == Block.ladder.blockID || var4 == Block.vine.blockID; -+ return (Block.blocksList[var4] != null && Block.blocksList[var4].isLadder(worldObj, var1, var2, var3)); - } - - /** -@@ -1578,6 +1619,8 @@ - } - - this.isAirBorne = true; -+ -+ ForgeHooks.onEntityLivingJump(this); - } - - /** diff --git a/patches/minecraft_server/net/minecraft/src/EntityMinecart.java.patch b/patches/minecraft_server/net/minecraft/src/EntityMinecart.java.patch deleted file mode 100644 index c841a3a76..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityMinecart.java.patch +++ /dev/null @@ -1,957 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityMinecart.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityMinecart.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,27 +1,52 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.List; - -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.IMinecartCollisionHandler; -+import net.minecraft.src.forge.MinecraftForge; -+ - public class EntityMinecart extends Entity implements IInventory - { - /** Array of item stacks stored in minecart (for storage minecarts). */ -- private ItemStack[] cargoItems; -- private int fuel; -- private boolean field_469_aj; -+ protected ItemStack[] cargoItems; -+ protected int fuel; -+ protected boolean field_469_aj; - - /** The type of minecart, 2 for powered, 1 for storage. */ - public int minecartType; - 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}}}; -+ protected 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}}}; - - /** appears to be the progress of the turn */ -- private int turnProgress; -- private double minecartX; -- private double minecartY; -- private double minecartZ; -- private double minecartYaw; -- private double minecartPitch; -+ protected int turnProgress; -+ protected double minecartX; -+ protected double minecartY; -+ protected double minecartZ; -+ protected double minecartYaw; -+ protected double minecartPitch; -+ protected double velocityX; -+ protected double velocityY; -+ protected double velocityZ; -+ -+ /* Forge: Minecart Compatibility Layer Integration. */ -+ public static float defaultMaxSpeedRail = 0.4f; -+ public static float defaultMaxSpeedGround = 0.4f; -+ public static float defaultMaxSpeedAirLateral = 0.4f; -+ public static float defaultMaxSpeedAirVertical = -1f; -+ public static double defaultDragAir = 0.94999998807907104D; -+ protected boolean canUseRail = true; -+ protected boolean canBePushed = true; -+ private static IMinecartCollisionHandler collisionHandler = null; -+ -+ /* Instance versions of the above physics properties */ -+ protected float maxSpeedRail; -+ protected float maxSpeedGround; -+ protected float maxSpeedAirLateral; -+ protected float maxSpeedAirVertical; -+ protected double dragAir; - - public EntityMinecart(World par1World) - { -@@ -32,6 +57,18 @@ - this.preventEntitySpawning = true; - this.setSize(0.98F, 0.7F); - this.yOffset = this.height / 2.0F; -+ -+ maxSpeedRail = defaultMaxSpeedRail; -+ maxSpeedGround = defaultMaxSpeedGround; -+ maxSpeedAirLateral = defaultMaxSpeedAirLateral; -+ maxSpeedAirVertical = defaultMaxSpeedAirVertical; -+ dragAir = defaultDragAir; -+ } -+ -+ public EntityMinecart(World world, int type) -+ { -+ this(world); -+ minecartType = type; - } - - /** -@@ -57,6 +94,10 @@ - */ - public AxisAlignedBB getCollisionBox(Entity par1Entity) - { -+ if (getCollisionHandler() != null) -+ { -+ return getCollisionHandler().getCollisionBox(this, par1Entity); -+ } - return par1Entity.boundingBox; - } - -@@ -65,6 +106,10 @@ - */ - public AxisAlignedBB getBoundingBox() - { -+ if (getCollisionHandler() != null) -+ { -+ return getCollisionHandler().getBoundingBox(this); -+ } - return null; - } - -@@ -73,7 +118,7 @@ - */ - public boolean canBePushed() - { -- return true; -+ return canBePushed; - } - - public EntityMinecart(World par1World, double par2, double par4, double par6, int par8) -@@ -117,48 +162,7 @@ - } - - this.setDead(); -- 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.spawnEntityInWorld(var10); -- } -- } -- } -- -- this.dropItemWithOffset(Block.chest.blockID, 1, 0.0F); -- } -- else if (this.minecartType == 2) -- { -- this.dropItemWithOffset(Block.stoneOvenIdle.blockID, 1, 0.0F); -- } -+ dropCartAsItem(); - } - - return true; -@@ -241,7 +245,7 @@ - this.kill(); - } - -- if (this.isMinecartPowered() && this.rand.nextInt(4) == 0) -+ if (this.isMinecartPowered() && this.rand.nextInt(4) == 0 && minecartType == 2 && getClass() == EntityMinecart.class) - { - this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.8D, this.posZ, 0.0D, 0.0D, 0.0D); - } -@@ -296,49 +300,26 @@ - double var6 = 0.0078125D; - int var8 = this.worldObj.getBlockId(var1, var2, var3); - -- if (BlockRail.isRailBlock(var8)) -+ if (canUseRail() && BlockRail.isRailBlock(var8)) - { - Vec3D var9 = this.func_182_g(this.posX, this.posY, this.posZ); -- int var10 = this.worldObj.getBlockMetadata(var1, var2, var3); -+ int var10 = ((BlockRail)Block.blocksList[var8]).getBasicRailMetadata(worldObj, this, var1, var2, var3); - this.posY = (double)var2; - boolean var11 = false; - boolean var12 = false; - - if (var8 == Block.railPowered.blockID) - { -- var11 = (var10 & 8) != 0; -+ var11 = (worldObj.getBlockMetadata(var1, var2, var3) & 8) != 0; - var12 = !var11; - } - -- if (((BlockRail)Block.blocksList[var8]).isPowered()) -- { -- var10 &= 7; -- } -- - if (var10 >= 2 && var10 <= 5) - { - this.posY = (double)(var2 + 1); - } - -- if (var10 == 2) -- { -- this.motionX -= var6; -- } -- -- if (var10 == 3) -- { -- this.motionX += var6; -- } -- -- if (var10 == 4) -- { -- this.motionZ += var6; -- } -- -- if (var10 == 5) -- { -- this.motionZ -= var6; -- } -+ adjustSlopeVelocities(var10); - - int[][] var13 = field_468_ak[var10]; - double var14 = (double)(var13[1][0] - var13[0][0]); -@@ -357,7 +338,7 @@ - this.motionZ = var22 * var16 / var18; - double var24; - -- if (var12) -+ if (var12 && shouldDoRailFunctions()) - { - var24 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); - -@@ -407,36 +388,8 @@ - this.posX = var26 + var14 * var24; - this.posZ = var28 + var16 * var24; - this.setPosition(this.posX, this.posY + (double)this.yOffset, this.posZ); -- var34 = this.motionX; -- var36 = this.motionZ; -- -- if (this.riddenByEntity != null) -- { -- var34 *= 0.75D; -- var36 *= 0.75D; -- } -- -- if (var34 < -var4) -- { -- var34 = -var4; -- } -- -- if (var34 > var4) -- { -- var34 = var4; -- } -- -- if (var36 < -var4) -- { -- var36 = -var4; -- } -- -- if (var36 > var4) -- { -- var36 = var4; -- } -- -- this.moveEntity(var34, 0.0D, var36); -+ -+ moveMinecartOnRail(var1, var2, var3); - - if (var13[0][1] != 0 && MathHelper.floor_double(this.posX) - var1 == var13[0][0] && MathHelper.floor_double(this.posZ) - var3 == var13[0][2]) - { -@@ -447,41 +400,7 @@ - this.setPosition(this.posX, this.posY + (double)var13[1][1], this.posZ); - } - -- if (this.riddenByEntity != null) -- { -- this.motionX *= 0.996999979019165D; -- this.motionY *= 0.0D; -- this.motionZ *= 0.996999979019165D; -- } -- else -- { -- if (this.minecartType == 2) -- { -- var38 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ); -- -- if (var38 > 0.01D) -- { -- this.pushX /= var38; -- this.pushZ /= var38; -- double var40 = 0.04D; -- this.motionX *= 0.800000011920929D; -- this.motionY *= 0.0D; -- this.motionZ *= 0.800000011920929D; -- this.motionX += this.pushX * var40; -- this.motionZ += this.pushZ * var40; -- } -- else -- { -- this.motionX *= 0.8999999761581421D; -- this.motionY *= 0.0D; -- this.motionZ *= 0.8999999761581421D; -- } -- } -- -- this.motionX *= 0.9599999785423279D; -- this.motionY *= 0.0D; -- this.motionZ *= 0.9599999785423279D; -- } -+ applyDragAndPushForces(); - - Vec3D var52 = this.func_182_g(this.posX, this.posY, this.posZ); - -@@ -510,30 +429,15 @@ - } - - double var41; -- -- if (this.minecartType == 2) -+ -+ updatePushForces(); -+ -+ if(shouldDoRailFunctions()) - { -- var41 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ); -- -- if (var41 > 0.01D && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.001D) -- { -- this.pushX /= var41; -- this.pushZ /= var41; -- -- 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; -- } -- } -+ ((BlockRail)Block.blocksList[var8]).onMinecartPass(worldObj, this, var1, var2, var3); - } - -- if (var11) -+ if (var11 && shouldDoRailFunctions()) - { - var41 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ); - -@@ -569,41 +473,7 @@ - } - 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 *= 0.949999988079071D; -- this.motionY *= 0.949999988079071D; -- this.motionZ *= 0.949999988079071D; -- } -+ moveMinecartOffRail(var1, var2, var3); - } - - this.rotationPitch = 0.0F; -@@ -639,7 +509,18 @@ - } - - this.setRotation(this.rotationYaw, this.rotationPitch); -- List var15 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(0.20000000298023224D, 0.0D, 0.20000000298023224D)); -+ -+ AxisAlignedBB box = null; -+ if (getCollisionHandler() != null) -+ { -+ box = getCollisionHandler().getMinecartCollisionBox(this); -+ } -+ else -+ { -+ box = boundingBox.expand(0.2D, 0.0D, 0.2D); -+ } -+ -+ List var15 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, box); - - if (var15 != null && var15.size() > 0) - { -@@ -664,17 +545,8 @@ - this.riddenByEntity = null; - } - -- if (this.fuel > 0) -- { -- --this.fuel; -- } -- -- if (this.fuel <= 0) -- { -- this.pushX = this.pushZ = 0.0D; -- } -- -- this.setMinecartPowered(this.fuel > 0); -+ updateFuel(); -+ ForgeHooks.onMinecartUpdate(this, var1, var2, var3); - } - } - -@@ -693,14 +565,9 @@ - - if (BlockRail.isRailBlock(var10)) - { -- int var11 = this.worldObj.getBlockMetadata(var7, var8, var9); -+ int var11 = ((BlockRail)Block.blocksList[var10]).getBasicRailMetadata(worldObj, this, var7, var8, var9); - par3 = (double)var8; - -- if (((BlockRail)Block.blocksList[var10]).isPowered()) -- { -- var11 &= 7; -- } -- - if (var11 >= 2 && var11 <= 5) - { - par3 = (double)(var8 + 1); -@@ -765,13 +632,13 @@ - { - par1NBTTagCompound.setInteger("Type", this.minecartType); - -- if (this.minecartType == 2) -+ if (isPoweredCart()) - { - par1NBTTagCompound.setDouble("PushX", this.pushX); - par1NBTTagCompound.setDouble("PushZ", this.pushZ); -- par1NBTTagCompound.setShort("Fuel", (short)this.fuel); -+ par1NBTTagCompound.setInteger("Fuel", this.fuel); - } -- else if (this.minecartType == 1) -+ if (getSizeInventory() > 0) - { - NBTTagList var2 = new NBTTagList(); - -@@ -797,13 +664,20 @@ - { - this.minecartType = par1NBTTagCompound.getInteger("Type"); - -- if (this.minecartType == 2) -+ if (isPoweredCart()) - { - this.pushX = par1NBTTagCompound.getDouble("PushX"); - this.pushZ = par1NBTTagCompound.getDouble("PushZ"); -- this.fuel = par1NBTTagCompound.getShort("Fuel"); -+ try -+ { -+ this.fuel = par1NBTTagCompound.getInteger("Fuel"); -+ } -+ catch (ClassCastException e) -+ { -+ this.fuel = par1NBTTagCompound.getShort("Fuel"); -+ } - } -- else if (this.minecartType == 1) -+ if (getSizeInventory() > 0) - { - NBTTagList var2 = par1NBTTagCompound.getTagList("Items"); - this.cargoItems = new ItemStack[this.getSizeInventory()]; -@@ -826,11 +700,18 @@ - */ - public void applyEntityCollision(Entity par1Entity) - { -+ ForgeHooks.onMinecartEntityCollision(this, par1Entity); -+ if (getCollisionHandler() != null) -+ { -+ getCollisionHandler().onEntityCollision(this, par1Entity); -+ return; -+ } -+ - if (!this.worldObj.isRemote) - { - if (par1Entity != this.riddenByEntity) - { -- if (par1Entity instanceof EntityLiving && !(par1Entity instanceof EntityPlayer) && !(par1Entity instanceof EntityIronGolem) && this.minecartType == 0 && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.01D && this.riddenByEntity == null && par1Entity.ridingEntity == null) -+ if (par1Entity instanceof EntityLiving && !(par1Entity instanceof EntityPlayer) && !(par1Entity instanceof EntityIronGolem) && canBeRidden() && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.01D && this.riddenByEntity == null && par1Entity.ridingEntity == null) - { - par1Entity.mountEntity(this); - } -@@ -876,7 +757,7 @@ - double var18 = par1Entity.motionX + this.motionX; - double var20 = par1Entity.motionZ + this.motionZ; - -- if (((EntityMinecart)par1Entity).minecartType == 2 && this.minecartType != 2) -+ if (((EntityMinecart)par1Entity).isPoweredCart() && !isPoweredCart()) - { - this.motionX *= 0.20000000298023224D; - this.motionZ *= 0.20000000298023224D; -@@ -884,7 +765,7 @@ - par1Entity.motionX *= 0.949999988079071D; - par1Entity.motionZ *= 0.949999988079071D; - } -- else if (((EntityMinecart)par1Entity).minecartType != 2 && this.minecartType == 2) -+ else if (!((EntityMinecart)par1Entity).isPoweredCart() && isPoweredCart()) - { - par1Entity.motionX *= 0.20000000298023224D; - par1Entity.motionZ *= 0.20000000298023224D; -@@ -919,7 +800,7 @@ - */ - public int getSizeInventory() - { -- return 27; -+ return (minecartType == 1 && getClass() == EntityMinecart.class ? 27 : 0); - } - - /** -@@ -1022,7 +903,12 @@ - */ - public boolean interact(EntityPlayer par1EntityPlayer) - { -- if (this.minecartType == 0) -+ if (!ForgeHooks.onMinecartInteract(this, par1EntityPlayer)) -+ { -+ return true; -+ } -+ -+ if (canBeRidden()) - { - if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != par1EntityPlayer) - { -@@ -1034,14 +920,14 @@ - par1EntityPlayer.mountEntity(this); - } - } -- else if (this.minecartType == 1) -+ else if (getSizeInventory() > 0) - { - if (!this.worldObj.isRemote) - { - par1EntityPlayer.displayGUIChest(this); - } - } -- else if (this.minecartType == 2) -+ else if (this.minecartType == 2 && getClass() == EntityMinecart.class) - { - ItemStack var2 = par1EntityPlayer.inventory.getCurrentItem(); - -@@ -1073,7 +959,7 @@ - /** - * Is this minecart powered (Fuel > 0) - */ -- protected boolean isMinecartPowered() -+ public boolean isMinecartPowered() - { - return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0; - } -@@ -1126,4 +1012,373 @@ - { - return this.dataWatcher.getWatchableObjectInt(18); - } -+ -+ /** -+ * Drops the cart as a item. The exact item dropped is defined by getItemDropped(). -+ */ -+ public void dropCartAsItem() -+ { -+ for(ItemStack item : getItemsDropped()) -+ { -+ entityDropItem(item, 0); -+ } -+ } -+ -+ /** -+ * Override this to define which items your cart drops when broken. -+ * This does not include items contained in the inventory, -+ * that is handled elsewhere. -+ * @return A list of items dropped. -+ */ -+ public List getItemsDropped() -+ { -+ List items = new ArrayList(); -+ items.add(new ItemStack(Item.minecartEmpty)); -+ -+ switch(minecartType) -+ { -+ case 1: -+ items.add(new ItemStack(Block.chest)); -+ break; -+ case 2: -+ items.add(new ItemStack(Block.stoneOvenIdle)); -+ break; -+ } -+ return items; -+ } -+ -+ /** -+ * This function returns an ItemStack that represents this cart. -+ * This should be an ItemStack that can be used by the player to place the cart. -+ * This is the item that was registered with the cart via the registerMinecart function, -+ * but is not necessary the item the cart drops when destroyed. -+ * @return An ItemStack that can be used to place the cart. -+ */ -+ public ItemStack getCartItem() -+ { -+ return MinecraftForge.getItemForCart(this); -+ } -+ -+ /** -+ * Returns true if this cart is self propelled. -+ * @return True if powered. -+ */ -+ public boolean isPoweredCart() -+ { -+ return minecartType == 2 && getClass() == EntityMinecart.class; -+ } -+ -+ /** -+ * Returns true if this cart is a storage cart -+ * Some carts may have inventories but not be storage carts -+ * and some carts without inventories may be storage carts. -+ * @return True if this cart should be classified as a storage cart. -+ */ -+ public boolean isStorageCart() -+ { -+ return minecartType == 1 && getClass() == EntityMinecart.class; -+ } -+ -+ /** -+ * Returns true if this cart can be ridden by an Entity. -+ * @return True if this cart can be ridden. -+ */ -+ public boolean canBeRidden() -+ { -+ if(minecartType == 0 && getClass() == EntityMinecart.class) -+ { -+ return true; -+ } -+ return false; -+ } -+ -+ /** -+ * Returns true if this cart can currently use rails. -+ * This function is mainly used to gracefully detach a minecart from a rail. -+ * @return True if the minecart can use rails. -+ */ -+ public boolean canUseRail() -+ { -+ return canUseRail; -+ } -+ -+ /** -+ * Set whether the minecart can use rails. -+ * This function is mainly used to gracefully detach a minecart from a rail. -+ * @param use Whether the minecart can currently use rails. -+ */ -+ public void setCanUseRail(boolean use) -+ { -+ canUseRail = use; -+ } -+ -+ /** -+ * Return false if this cart should not call IRail.onMinecartPass() and should ignore Powered Rails. -+ * @return True if this cart should call IRail.onMinecartPass(). -+ */ -+ public boolean shouldDoRailFunctions() -+ { -+ return true; -+ } -+ -+ /** -+ * Simply returns the minecartType variable. -+ * @return minecartType -+ */ -+ public int getMinecartType() -+ { -+ return minecartType; -+ } -+ -+ /** -+ * Gets the current global Minecart Collision handler if none -+ * is registered, returns null -+ * @return The collision handler or null -+ */ -+ public static IMinecartCollisionHandler getCollisionHandler() -+ { -+ return collisionHandler; -+ } -+ -+ /** -+ * Sets the global Minecart Collision handler, overwrites any -+ * that is currently set. -+ * @param handler The new handler -+ */ -+ public static void setCollisionHandler(IMinecartCollisionHandler handler) -+ { -+ collisionHandler = handler; -+ } -+ -+ /** -+ * Carts should return their drag factor here -+ * @return The drag rate. -+ */ -+ protected double getDrag() -+ { -+ return riddenByEntity != null ? 0.99D : 0.96D; -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code applies drag and updates push forces. -+ */ -+ protected void applyDragAndPushForces() -+ { -+ if(isPoweredCart()) -+ { -+ double d27 = MathHelper.sqrt_double(pushX * pushX + pushZ * pushZ); -+ if(d27 > 0.01D) -+ { -+ pushX /= d27; -+ pushZ /= d27; -+ double d29 = 0.04; -+ motionX *= 0.8D; -+ motionY *= 0.0D; -+ motionZ *= 0.8D; -+ motionX += pushX * d29; -+ motionZ += pushZ * d29; -+ } else -+ { -+ motionX *= 0.9D; -+ motionY *= 0.0D; -+ motionZ *= 0.9D; -+ } -+ } -+ motionX *= getDrag(); -+ motionY *= 0.0D; -+ motionZ *= getDrag(); -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code updates push forces. -+ */ -+ protected void updatePushForces() -+ { -+ if(isPoweredCart()) -+ { -+ double push = MathHelper.sqrt_double(pushX * pushX + pushZ * pushZ); -+ if(push > 0.01D && motionX * motionX + motionZ * motionZ > 0.001D) -+ { -+ pushX /= push; -+ pushZ /= push; -+ if(pushX * motionX + pushZ * motionZ < 0.0D) -+ { -+ pushX = 0.0D; -+ pushZ = 0.0D; -+ } else -+ { -+ pushX = motionX; -+ pushZ = motionZ; -+ } -+ } -+ } -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code handles minecart movement and speed capping when on a rail. -+ */ -+ protected void moveMinecartOnRail(int i, int j, int k) -+ { -+ int id = worldObj.getBlockId(i, j, k); -+ if (!BlockRail.isRailBlock(id)) -+ { -+ return; -+ } -+ float railMaxSpeed = ((BlockRail)Block.blocksList[id]).getRailMaxSpeed(worldObj, this, i, j, k); -+ -+ double maxSpeed = Math.min(railMaxSpeed, getMaxSpeedRail()); -+ double mX = motionX; -+ double mZ = motionZ; -+ if(riddenByEntity != null) -+ { -+ mX *= 0.75D; -+ mZ *= 0.75D; -+ } -+ if(mX < -maxSpeed) mX = -maxSpeed; -+ if(mX > maxSpeed) mX = maxSpeed; -+ if(mZ < -maxSpeed) mZ = -maxSpeed; -+ if(mZ > maxSpeed) mZ = maxSpeed; -+ moveEntity(mX, 0.0D, mZ); -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code handles minecart movement and speed capping when not on a rail. -+ */ -+ protected void moveMinecartOffRail(int i, int j, int k) -+ { -+ double d2 = getMaxSpeedGround(); -+ if(!onGround) -+ { -+ d2 = getMaxSpeedAirLateral(); -+ } -+ if(motionX < -d2) motionX = -d2; -+ if(motionX > d2) motionX = d2; -+ if(motionZ < -d2) motionZ = -d2; -+ if(motionZ > d2) motionZ = d2; -+ double moveY = motionY; -+ if(getMaxSpeedAirVertical() > 0 && motionY > getMaxSpeedAirVertical()) -+ { -+ moveY = getMaxSpeedAirVertical(); -+ if(Math.abs(motionX) < 0.3f && Math.abs(motionZ) < 0.3f) -+ { -+ moveY = 0.15f; -+ motionY = moveY; -+ } -+ } -+ if(onGround) -+ { -+ motionX *= 0.5D; -+ motionY *= 0.5D; -+ motionZ *= 0.5D; -+ } -+ moveEntity(motionX, moveY, motionZ); -+ if(!onGround) -+ { -+ motionX *= getDragAir(); -+ motionY *= getDragAir(); -+ motionZ *= getDragAir(); -+ } -+ } -+ -+ /** -+ * Moved to allow overrides. -+ * This code applies fuel consumption. -+ */ -+ protected void updateFuel() -+ { -+ if (fuel > 0) fuel--; -+ if (fuel <= 0) pushX = pushZ = 0.0D; -+ setMinecartPowered(fuel > 0); -+ } -+ -+ /** -+ * Moved to allow overrides, This code handle slopes affecting velocity. -+ * @param metadata The blocks position metadata -+ */ -+ protected void adjustSlopeVelocities(int metadata) -+ { -+ double acceleration = 0.0078125D; -+ if (metadata == 2) -+ { -+ motionX -= acceleration; -+ } -+ else if (metadata == 3) -+ { -+ motionX += acceleration; -+ } -+ else if (metadata == 4) -+ { -+ motionZ += acceleration; -+ } -+ else if (metadata == 5) -+ { -+ motionZ -= acceleration; -+ } -+ } -+ -+ /** -+ * Getters/setters for physics variables -+ */ -+ -+ /** -+ * Returns the carts max speed. -+ * Carts going faster than 1.1 cause issues with chunk loading. -+ * Carts cant traverse slopes or corners at greater than 0.5 - 0.6. -+ * This value is compared with the rails max speed to determine -+ * the carts current max speed. A normal rails max speed is 0.4. -+ * @return Carts max speed. -+ */ -+ public float getMaxSpeedRail() -+ { -+ return maxSpeedRail; -+ } -+ -+ public void setMaxSpeedRail(float value) -+ { -+ maxSpeedRail = value; -+ } -+ -+ public float getMaxSpeedGround() -+ { -+ return maxSpeedGround; -+ } -+ -+ public void setMaxSpeedGround(float value) -+ { -+ maxSpeedGround = value; -+ } -+ -+ public float getMaxSpeedAirLateral() -+ { -+ return maxSpeedAirLateral; -+ } -+ -+ public void setMaxSpeedAirLateral(float value) -+ { -+ maxSpeedAirLateral = value; -+ } -+ -+ public float getMaxSpeedAirVertical() -+ { -+ return maxSpeedAirVertical; -+ } -+ -+ public void setMaxSpeedAirVertical(float value) -+ { -+ maxSpeedAirVertical = value; -+ } -+ -+ public double getDragAir() -+ { -+ return dragAir; -+ } -+ -+ public void setDragAir(double value) -+ { -+ dragAir = value; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/EntityMooshroom.java.patch b/patches/minecraft_server/net/minecraft/src/EntityMooshroom.java.patch deleted file mode 100644 index 62461055e..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityMooshroom.java.patch +++ /dev/null @@ -1,78 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityMooshroom.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityMooshroom.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,6 +1,10 @@ - package net.minecraft.src; - --public class EntityMooshroom extends EntityCow -+import java.util.ArrayList; -+ -+import net.minecraft.src.forge.IShearable; -+ -+public class EntityMooshroom extends EntityCow implements IShearable - { - public EntityMooshroom(World par1World) - { -@@ -30,32 +34,7 @@ - return true; - } - } -- -- if (var2 != null && var2.itemID == Item.shears.shiftedIndex && this.getGrowingAge() >= 0) -- { -- this.setDead(); -- this.worldObj.spawnParticle("largeexplode", this.posX, this.posY + (double)(this.height / 2.0F), this.posZ, 0.0D, 0.0D, 0.0D); -- -- if (!this.worldObj.isRemote) -- { -- EntityCow var3 = new EntityCow(this.worldObj); -- var3.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, this.rotationPitch); -- var3.setEntityHealth(this.getHealth()); -- var3.renderYawOffset = this.renderYawOffset; -- this.worldObj.spawnEntityInWorld(var3); -- -- for (int var4 = 0; var4 < 5; ++var4) -- { -- this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.posX, this.posY + (double)this.height, this.posZ, new ItemStack(Block.mushroomRed))); -- } -- } -- -- return true; -- } -- else -- { -- return super.interact(par1EntityPlayer); -- } -+ return super.interact(par1EntityPlayer); - } - - /** -@@ -65,4 +44,29 @@ - { - return new EntityMooshroom(this.worldObj); - } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int X, int Y, int Z) -+ { -+ return getGrowingAge() >= 0; -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int X, int Y, int Z, int fortune) -+ { -+ setDead(); -+ EntityCow entitycow = new EntityCow(worldObj); -+ entitycow.setLocationAndAngles(posX, posY, posZ, rotationYaw, rotationPitch); -+ entitycow.setEntityHealth(getHealth()); -+ entitycow.renderYawOffset = renderYawOffset; -+ worldObj.spawnEntityInWorld(entitycow); -+ worldObj.spawnParticle("largeexplode", posX, posY + (double)(height / 2.0F), posZ, 0.0D, 0.0D, 0.0D); -+ -+ ArrayList ret = new ArrayList(); -+ for (int x = 0; x < 5; x++) -+ { -+ ret.add(new ItemStack(Block.mushroomRed)); -+ } -+ return ret; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/EntityOcelot.java.patch b/patches/minecraft_server/net/minecraft/src/EntityOcelot.java.patch deleted file mode 100644 index 3e8517af1..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityOcelot.java.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityOcelot.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityOcelot.java 0000-00-00 00:00:00.000000000 -0000 -@@ -301,7 +301,8 @@ - - int var4 = this.worldObj.getBlockId(var1, var2 - 1, var3); - -- if (var4 == Block.grass.blockID || var4 == Block.leaves.blockID) -+ Block block = Block.blocksList[var4]; -+ if (var4 == Block.grass.blockID || (block != null && block.isLeaves(worldObj, var1, var2 - 1, var3))) - { - return true; - } diff --git a/patches/minecraft_server/net/minecraft/src/EntityPlayer.java.patch b/patches/minecraft_server/net/minecraft/src/EntityPlayer.java.patch deleted file mode 100644 index bb076c340..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityPlayer.java.patch +++ /dev/null @@ -1,252 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityPlayer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityPlayer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -7,6 +7,14 @@ - import cpw.mods.fml.common.FMLCommonHandler; - import cpw.mods.fml.common.TickType; - -+import net.minecraft.src.forge.ArmorProperties; -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.IGuiHandler; -+import net.minecraft.src.forge.ISpecialArmor; -+import net.minecraft.src.forge.MinecraftForge; -+import net.minecraft.src.forge.NetworkMod; -+import net.minecraft.src.forge.packets.PacketOpenGUI; -+ - public abstract class EntityPlayer extends EntityLiving - { - /** Inventory of the player */ -@@ -182,6 +190,7 @@ - } - else - { -+ itemInUse.getItem().onUsingItemTick(itemInUse, this, itemInUseCount); - if (this.itemInUseCount <= 25 && this.itemInUseCount % 4 == 0) - { - this.updateItemUse(var1, 5); -@@ -372,6 +381,10 @@ - */ - protected void closeScreen() - { -+ if (craftingInventory != null) //TODO: This is a bugfix for chests staying open in SMP -+ { -+ craftingInventory.onCraftGuiClosed(this); -+ } - this.craftingInventory = this.inventorySlots; - } - -@@ -555,7 +568,16 @@ - */ - public EntityItem dropOneItem() - { -- return this.dropPlayerItemWithRandomChoice(this.inventory.decrStackSize(this.inventory.currentItem, 1), false); -+ ItemStack stack = inventory.getCurrentItem(); -+ if (stack == null) -+ { -+ return null; -+ } -+ if (stack.getItem().onDroppedByPlayer(stack, this)) -+ { -+ return dropPlayerItemWithRandomChoice(inventory.decrStackSize(inventory.currentItem, 1), false); -+ } -+ return null; - } - - /** -@@ -621,10 +643,18 @@ - - /** - * Returns how strong the player is against the specified block at this moment -+ * Deprecated in favor of the metadata-sensitive version - */ -+ @Deprecated - public float getCurrentPlayerStrVsBlock(Block par1Block) - { -- float var2 = this.inventory.getStrVsBlock(par1Block); -+ return getCurrentPlayerStrVsBlock(par1Block, 0); -+ } -+ -+ public float getCurrentPlayerStrVsBlock(Block par1Block, int meta) -+ { -+ ItemStack stack = inventory.getCurrentItem(); -+ float var2 = (stack == null ? 1.0F : stack.getItem().getStrVsBlock(stack, par1Block, meta)); - float var3 = var2; - int var4 = EnchantmentHelper.getEfficiencyModifier(this.inventory); - -@@ -915,12 +945,22 @@ - */ - protected void damageEntity(DamageSource par1DamageSource, int par2) - { -+ par2 = ForgeHooks.onEntityLivingHurt(this, par1DamageSource, par2); -+ if (par2 == 0) -+ { -+ return; -+ } -+ - if (!par1DamageSource.isUnblockable() && this.isBlocking()) - { - par2 = 1 + par2 >> 1; - } - -- par2 = this.applyArmorCalculations(par1DamageSource, par2); -+ par2 = ArmorProperties.ApplyArmor(this, inventory.armorInventory, par1DamageSource, par2); -+ if (par2 <= 0) -+ { -+ return; -+ } - par2 = this.applyPotionDamageCalculations(par1DamageSource, par2); - this.addExhaustion(par1DamageSource.getHungerDamage()); - this.health -= par2; -@@ -951,6 +991,10 @@ - */ - public void useCurrentItemOnEntity(Entity par1Entity) - { -+ if (!ForgeHooks.onEntityInteract(this, par1Entity, false)) -+ { -+ return; -+ } - if (!par1Entity.interact(this)) - { - ItemStack var2 = this.getCurrentEquippedItem(); -@@ -981,7 +1025,9 @@ - */ - public void destroyCurrentEquippedItem() - { -+ ItemStack orig = inventory.getCurrentItem(); - this.inventory.setInventorySlotContents(this.inventory.currentItem, (ItemStack)null); -+ ForgeHooks.onDestroyCurrentItem(this, orig); - } - - /** -@@ -1010,6 +1056,16 @@ - */ - public void attackTargetEntityWithCurrentItem(Entity par1Entity) - { -+ if (!ForgeHooks.onEntityInteract(this, par1Entity, true)) -+ { -+ return; -+ } -+ ItemStack stack = getCurrentEquippedItem(); -+ if (stack != null && stack.getItem().onLeftClickEntity(stack, this, par1Entity)) -+ { -+ return; -+ } -+ - if (par1Entity.canAttackWithItem()) - { - int var2 = this.inventory.getDamageVsEntity(par1Entity); -@@ -1148,6 +1204,12 @@ - */ - public EnumStatus sleepInBedAt(int par1, int par2, int par3) - { -+ EnumStatus customSleep = ForgeHooks.sleepInBedAt(this, par1, par2, par3); -+ if (customSleep != null) -+ { -+ return customSleep; -+ } -+ - if (!this.worldObj.isRemote) - { - if (this.isPlayerSleeping() || !this.isEntityAlive()) -@@ -1187,6 +1249,11 @@ - { - int var9 = this.worldObj.getBlockMetadata(par1, par2, par3); - int var5 = BlockBed.getDirection(var9); -+ Block block = Block.blocksList[worldObj.getBlockId(par1, par2, par3)]; -+ if (block != null) -+ { -+ var5 = block.getBedDirection(worldObj, par1, par2, par3); -+ } - float var10 = 0.5F; - float var7 = 0.5F; - -@@ -1256,11 +1323,12 @@ - this.resetHeight(); - ChunkCoordinates var4 = this.playerLocation; - ChunkCoordinates var5 = this.playerLocation; -+ Block block = (var4 == null ? null : Block.blocksList[worldObj.getBlockId(var4.posX, var4.posY, var4.posZ)]); - -- if (var4 != null && this.worldObj.getBlockId(var4.posX, var4.posY, var4.posZ) == Block.bed.blockID) -+ if (var4 != null && block != null && block.isBed(worldObj, var4.posX, var4.posY, var4.posZ, this)) - { -- BlockBed.setBedOccupied(this.worldObj, var4.posX, var4.posY, var4.posZ, false); -- var5 = BlockBed.getNearestEmptyChunkCoordinates(this.worldObj, var4.posX, var4.posY, var4.posZ, 0); -+ block.setBedOccupied(this.worldObj, var4.posX, var4.posY, var4.posZ, this, false); -+ var5 = block.getBedSpawnPosition(worldObj, var4.posX, var4.posY, var4.posZ, this); - - if (var5 == null) - { -@@ -1297,7 +1365,9 @@ - */ - private boolean isInBed() - { -- return this.worldObj.getBlockId(this.playerLocation.posX, this.playerLocation.posY, this.playerLocation.posZ) == Block.bed.blockID; -+ ChunkCoordinates c = playerLocation; -+ int blockID = worldObj.getBlockId(c.posX, c.posY, c.posZ); -+ return Block.blocksList[blockID] != null && Block.blocksList[blockID].isBed(worldObj, c.posX, c.posY, c.posZ, this); - } - - /** -@@ -1312,13 +1382,15 @@ - var2.loadChunk(par1ChunkCoordinates.posX - 3 >> 4, par1ChunkCoordinates.posZ + 3 >> 4); - var2.loadChunk(par1ChunkCoordinates.posX + 3 >> 4, par1ChunkCoordinates.posZ + 3 >> 4); - -- if (par0World.getBlockId(par1ChunkCoordinates.posX, par1ChunkCoordinates.posY, par1ChunkCoordinates.posZ) != Block.bed.blockID) -+ ChunkCoordinates c = par1ChunkCoordinates; -+ Block block = Block.blocksList[par0World.getBlockId(c.posX, c.posY, c.posZ)]; -+ if (block == null || !block.isBed(par0World, c.posX, c.posY, c.posZ, null)) - { - return null; - } - else - { -- ChunkCoordinates var3 = BlockBed.getNearestEmptyChunkCoordinates(par0World, par1ChunkCoordinates.posX, par1ChunkCoordinates.posY, par1ChunkCoordinates.posZ, 0); -+ ChunkCoordinates var3 = block.getBedSpawnPosition(par0World, c.posX, c.posY, c.posZ, null); - return var3; - } - } -@@ -1725,4 +1797,45 @@ - } - - public void func_50022_L() {} -+ -+ /** -+ * Opens a Gui for the player. -+ * -+ * @param mod The mod associated with the gui -+ * @param ID The ID number for the Gui -+ * @param world The World -+ * @param X X Position -+ * @param Y Y Position -+ * @param Z Z Position -+ */ -+ public void openGui(BaseMod mod, int ID, World world, int x, int y, int z) -+ { -+ if (!(this instanceof EntityPlayerMP)) -+ { -+ return; -+ } -+ -+ EntityPlayerMP player = (EntityPlayerMP)this; -+ -+ if (!(mod instanceof NetworkMod)) -+ { -+ return; -+ } -+ -+ IGuiHandler handler = MinecraftForge.getGuiHandler(mod); -+ if (handler != null) -+ { -+ Container container = (Container)handler.getGuiElement(ID, player, world, x, y, z); -+ if (container != null) -+ { -+ player.realGetNextWidowId(); -+ player.closeCraftingGui(); -+ PacketOpenGUI pkt = new PacketOpenGUI(player.getCurrentWindowIdField(), MinecraftForge.getModID((NetworkMod)mod), ID, x, y, z); -+ player.playerNetServerHandler.sendPacket(pkt.getPacket()); -+ craftingInventory = container; -+ craftingInventory.windowId = player.getCurrentWindowIdField(); -+ craftingInventory.onCraftGuiOpened(player); -+ } -+ } -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/EntityPlayerMP.java.patch b/patches/minecraft_server/net/minecraft/src/EntityPlayerMP.java.patch deleted file mode 100644 index 3ee8bc54f..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityPlayerMP.java.patch +++ /dev/null @@ -1,69 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityPlayerMP.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityPlayerMP.java 0000-00-00 00:00:00.000000000 -0000 -@@ -551,6 +551,7 @@ - public void displayWorkbenchGUI(int par1, int par2, int par3) - { - this.getNextWindowId(); -+ closeCraftingGui(); //NOTE: This is a bug fix for chests staying open in SMP - this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 1, "Crafting", 9)); - this.craftingInventory = new ContainerWorkbench(this.inventory, this.worldObj, par1, par2, par3); - this.craftingInventory.windowId = this.currentWindowId; -@@ -560,6 +561,7 @@ - public void displayGUIEnchantment(int par1, int par2, int par3) - { - this.getNextWindowId(); -+ closeCraftingGui(); //NOTE: This is a bug fix for chests staying open in SMP - this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 4, "Enchanting", 9)); - this.craftingInventory = new ContainerEnchantment(this.inventory, this.worldObj, par1, par2, par3); - this.craftingInventory.windowId = this.currentWindowId; -@@ -572,6 +574,7 @@ - public void displayGUIChest(IInventory par1IInventory) - { - this.getNextWindowId(); -+ closeCraftingGui(); //NOTE: This is a bug fix for chests staying open in SMP - this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 0, par1IInventory.getInvName(), par1IInventory.getSizeInventory())); - this.craftingInventory = new ContainerChest(this.inventory, par1IInventory); - this.craftingInventory.windowId = this.currentWindowId; -@@ -584,6 +587,7 @@ - public void displayGUIFurnace(TileEntityFurnace par1TileEntityFurnace) - { - this.getNextWindowId(); -+ closeCraftingGui(); //NOTE: This is a bug fix for chests staying open in SMP - this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 2, par1TileEntityFurnace.getInvName(), par1TileEntityFurnace.getSizeInventory())); - this.craftingInventory = new ContainerFurnace(this.inventory, par1TileEntityFurnace); - this.craftingInventory.windowId = this.currentWindowId; -@@ -596,6 +600,7 @@ - public void displayGUIDispenser(TileEntityDispenser par1TileEntityDispenser) - { - this.getNextWindowId(); -+ closeCraftingGui(); //NOTE: This is a bug fix for chests staying open in SMP - this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 3, par1TileEntityDispenser.getInvName(), par1TileEntityDispenser.getSizeInventory())); - this.craftingInventory = new ContainerDispenser(this.inventory, par1TileEntityDispenser); - this.craftingInventory.windowId = this.currentWindowId; -@@ -608,6 +613,7 @@ - public void displayGUIBrewingStand(TileEntityBrewingStand par1TileEntityBrewingStand) - { - this.getNextWindowId(); -+ closeCraftingGui(); //NOTE: This is a bug fix for chests staying open in SMP - this.playerNetServerHandler.sendPacket(new Packet100OpenWindow(this.currentWindowId, 5, par1TileEntityBrewingStand.getInvName(), par1TileEntityBrewingStand.getSizeInventory())); - this.craftingInventory = new ContainerBrewingStand(this.inventory, par1TileEntityBrewingStand); - this.craftingInventory.windowId = this.currentWindowId; -@@ -805,4 +811,18 @@ - this.playerNetServerHandler.sendPacket(new Packet202PlayerAbilities(this.capabilities)); - } - } -+ -+ /* These functions are added to have compatibility with PlayerAPI. -+ * If Divisor does not implement these functions, it is his fault, -+ * these are specifically the functions he told me to use and would be guaranteed to be in PAPI. -+ */ -+ public final void realGetNextWidowId() -+ { -+ getNextWindowId(); -+ } -+ -+ public final int getCurrentWindowIdField() -+ { -+ return currentWindowId; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/EntitySheep.java.patch b/patches/minecraft_server/net/minecraft/src/EntitySheep.java.patch deleted file mode 100644 index 9ebe44a8d..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntitySheep.java.patch +++ /dev/null @@ -1,67 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntitySheep.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntitySheep.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,8 +1,11 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - --public class EntitySheep extends EntityAnimal -+import net.minecraft.src.forge.IShearable; -+ -+public class EntitySheep extends EntityAnimal implements IShearable - { - /** - * Holds the RGB table of the sheep colors - in OpenGL glColor3f values - used to render the sheep colored fleece. -@@ -99,27 +102,6 @@ - */ - public boolean interact(EntityPlayer par1EntityPlayer) - { -- ItemStack var2 = par1EntityPlayer.inventory.getCurrentItem(); -- -- if (var2 != null && var2.itemID == Item.shears.shiftedIndex && !this.getSheared() && !this.isChild()) -- { -- if (!this.worldObj.isRemote) -- { -- this.setSheared(true); -- int var3 = 1 + 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, par1EntityPlayer); -- } -- - return super.interact(par1EntityPlayer); - } - -@@ -252,4 +234,23 @@ - this.setGrowingAge(var1); - } - } -+ -+ @Override -+ public boolean isShearable(ItemStack item, World world, int X, int Y, int Z) -+ { -+ return !getSheared() && !isChild(); -+ } -+ -+ @Override -+ public ArrayList onSheared(ItemStack item, World world, int X, int Y, int Z, int fortune) -+ { -+ ArrayList ret = new ArrayList(); -+ setSheared(true); -+ int i = 1 + rand.nextInt(3); -+ for (int j = 0; j < i; j++) -+ { -+ ret.add(new ItemStack(Block.cloth.blockID, 1, getFleeceColor())); -+ } -+ return ret; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/EntityTracker.java.patch b/patches/minecraft_server/net/minecraft/src/EntityTracker.java.patch deleted file mode 100644 index 021b43b15..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityTracker.java.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityTracker.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityTracker.java 0000-00-00 00:00:00.000000000 -0000 -@@ -5,6 +5,7 @@ - import java.util.Iterator; - import java.util.Set; - import net.minecraft.server.MinecraftServer; -+import net.minecraft.src.forge.ForgeHooksServer; - - public class EntityTracker - { -@@ -30,6 +31,10 @@ - - public void trackEntity(Entity par1Entity) - { -+ if (ForgeHooksServer.OnTrackEntity(this, par1Entity)) -+ { -+ return; -+ } - if (par1Entity instanceof EntityPlayerMP) - { - this.trackEntity(par1Entity, 512, 2); diff --git a/patches/minecraft_server/net/minecraft/src/EntityTrackerEntry.java.patch b/patches/minecraft_server/net/minecraft/src/EntityTrackerEntry.java.patch deleted file mode 100644 index 73e95709a..000000000 --- a/patches/minecraft_server/net/minecraft/src/EntityTrackerEntry.java.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/EntityTrackerEntry.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/EntityTrackerEntry.java 0000-00-00 00:00:00.000000000 -0000 -@@ -5,6 +5,9 @@ - import java.util.List; - import java.util.Set; - -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.packets.PacketEntityTrack; -+ - public class EntityTrackerEntry - { - /** The entity that this EntityTrackerEntry tracks. */ -@@ -226,6 +229,15 @@ - this.trackedPlayers.add(par1EntityPlayerMP); - par1EntityPlayerMP.playerNetServerHandler.sendPacket(this.getSpawnPacket()); - -+ int posX = MathHelper.floor_double(this.trackedEntity.posX * 32.0D); -+ int posY = MathHelper.floor_double(this.trackedEntity.posY * 32.0D); -+ int posZ = MathHelper.floor_double(this.trackedEntity.posZ * 32.0D); -+ if (posX != this.encodedPosX || posY != this.encodedPosY || posZ != this.encodedPosZ) -+ { -+ PacketEntityTrack pkt = new PacketEntityTrack(this.trackedEntity.entityId, this.encodedPosX, this.encodedPosY, this.encodedPosZ); -+ par1EntityPlayerMP.playerNetServerHandler.sendPacket(pkt.getPacket()); -+ } -+ - if (this.shouldSendMotionUpdates) - { - par1EntityPlayerMP.playerNetServerHandler.sendPacket(new Packet28EntityVelocity(this.trackedEntity.entityId, this.trackedEntity.motionX, this.trackedEntity.motionY, this.trackedEntity.motionZ)); -@@ -286,6 +298,11 @@ - { - System.out.println("Fetching addPacket for removed entity"); - } -+ Packet pkt = ForgeHooks.getEntitySpawnPacket(trackedEntity); -+ if (pkt != null) -+ { -+ return pkt; -+ } - - if (this.trackedEntity instanceof EntityItem) - { diff --git a/patches/minecraft_server/net/minecraft/src/Explosion.java.patch b/patches/minecraft_server/net/minecraft/src/Explosion.java.patch deleted file mode 100644 index a0b7b8ceb..000000000 --- a/patches/minecraft_server/net/minecraft/src/Explosion.java.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/Explosion.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/Explosion.java 0000-00-00 00:00:00.000000000 -0000 -@@ -6,6 +6,8 @@ - import java.util.Random; - import java.util.Set; - -+import net.minecraft.src.forge.ISpecialResistance; -+ - public class Explosion - { - /** whether or not the explosion sets fire to blocks around it */ -@@ -72,7 +74,15 @@ - - if (var25 > 0) - { -- var14 -= (Block.blocksList[var25].getExplosionResistance(this.exploder) + 0.3F) * var21; -+ if (Block.blocksList[var25] instanceof ISpecialResistance) -+ { -+ ISpecialResistance isr = (ISpecialResistance)Block.blocksList[var25]; -+ var14 -= (isr.getSpecialExplosionResistance(worldObj, var22, var23, var24, explosionX, explosionY, explosionZ, exploder) + 0.3F) * var21; -+ } -+ else -+ { -+ var14 -= (Block.blocksList[var25].getExplosionResistance(this.exploder) + 0.3F) * var21; -+ } - } - - if (var14 > 0.0F) diff --git a/patches/minecraft_server/net/minecraft/src/FurnaceRecipes.java.patch b/patches/minecraft_server/net/minecraft/src/FurnaceRecipes.java.patch deleted file mode 100644 index cef8bf01f..000000000 --- a/patches/minecraft_server/net/minecraft/src/FurnaceRecipes.java.patch +++ /dev/null @@ -1,62 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/FurnaceRecipes.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/FurnaceRecipes.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,6 @@ - package net.minecraft.src; - -+import java.util.Arrays; - import java.util.HashMap; - import java.util.Map; - -@@ -9,6 +10,7 @@ - - /** The list of smelting results. */ - private Map smeltingList = new HashMap(); -+ private Map metaSmeltingList = new HashMap(); - - /** - * Used to call methods addSmelting and getSmeltingResult. -@@ -47,7 +49,9 @@ - - /** - * Returns the smelting result of an item. -+ * Deprecated in favor of a metadata sensitive version - */ -+ @Deprecated - public ItemStack getSmeltingResult(int par1) - { - return (ItemStack)this.smeltingList.get(Integer.valueOf(par1)); -@@ -57,4 +61,34 @@ - { - return this.smeltingList; - } -+ -+ /** -+ * Add a metadata-sensitive furnace recipe -+ * @param itemID The Item ID -+ * @param metadata The Item Metadata -+ * @param itemstack The ItemStack for the result -+ */ -+ public void addSmelting(int itemID, int metadata, ItemStack itemstack) -+ { -+ metaSmeltingList.put(Arrays.asList(itemID, metadata), itemstack); -+ } -+ -+ /** -+ * Used to get the resulting ItemStack form a source ItemStack -+ * @param item The Source ItemStack -+ * @return The result ItemStack -+ */ -+ public ItemStack getSmeltingResult(ItemStack item) -+ { -+ if (item == null) -+ { -+ return null; -+ } -+ ItemStack ret = (ItemStack)metaSmeltingList.get(Arrays.asList(item.itemID, item.getItemDamage())); -+ if (ret != null) -+ { -+ return ret; -+ } -+ return (ItemStack)smeltingList.get(Integer.valueOf(item.itemID)); -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/GuiStatsComponent.java.patch b/patches/minecraft_server/net/minecraft/src/GuiStatsComponent.java.patch deleted file mode 100644 index 5ccd99f11..000000000 --- a/patches/minecraft_server/net/minecraft/src/GuiStatsComponent.java.patch +++ /dev/null @@ -1,58 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/GuiStatsComponent.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/GuiStatsComponent.java 0000-00-00 00:00:00.000000000 -0000 -@@ -7,6 +7,7 @@ - import javax.swing.JComponent; - import javax.swing.Timer; - import net.minecraft.server.MinecraftServer; -+import net.minecraft.src.forge.DimensionManager; - - public class GuiStatsComponent extends JComponent - { -@@ -41,22 +42,30 @@ - { - long var1 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); - System.gc(); -+ -+ if (displayStrings.length < DimensionManager.getIDs().length + 3) -+ { -+ displayStrings = new String[DimensionManager.getIDs().length + 3]; -+ } -+ for(int x = 0; x < displayStrings.length; x++) -+ { -+ displayStrings[x] = ""; -+ } -+ - 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.displayStrings[2] = "Avg tick: " + field_40573_a.format(this.func_48551_a(this.field_40572_e.field_40027_f) * 1.0E-6D) + " ms"; - this.displayStrings[3] = "Avg sent: " + (int)this.func_48551_a(this.field_40572_e.field_48080_u) + ", Avg size: " + (int)this.func_48551_a(this.field_40572_e.field_48079_v); - this.displayStrings[4] = "Avg rec: " + (int)this.func_48551_a(this.field_40572_e.field_48078_w) + ", Avg size: " + (int)this.func_48551_a(this.field_40572_e.field_48082_x); - -- if (this.field_40572_e.worldMngr != null) -+ int x = 0; -+ for (Integer id : DimensionManager.getIDs()) - { -- for (int var3 = 0; var3 < this.field_40572_e.worldMngr.length; ++var3) -+ displayStrings[2 + ++x] = "Lvl " + id + " tick: " + field_40573_a.format(func_48551_a(field_40572_e.worldTickTimes.get(id)) * 10E-6D) + " ms"; -+ WorldServer world = (WorldServer)DimensionManager.getWorld(id); -+ if (world != null && world.chunkProviderServer != null) - { -- this.displayStrings[5 + var3] = "Lvl " + var3 + " tick: " + field_40573_a.format(this.func_48551_a(this.field_40572_e.field_40028_g[var3]) * 1.0E-6D) + " ms"; -- -- if (this.field_40572_e.worldMngr[var3] != null && this.field_40572_e.worldMngr[var3].chunkProviderServer != null) -- { -- this.displayStrings[5 + var3] = this.displayStrings[5 + var3] + ", " + this.field_40572_e.worldMngr[var3].chunkProviderServer.func_46040_d(); -- } -+ displayStrings[2 + x] += ", " + world.chunkProviderServer.func_46040_d(); - } - } - -@@ -67,7 +76,7 @@ - private double func_48551_a(long[] par1ArrayOfLong) - { - long var2 = 0L; -- -+ if (par1ArrayOfLong == null) return 0; - for (int var4 = 0; var4 < par1ArrayOfLong.length; ++var4) - { - var2 += par1ArrayOfLong[var4]; diff --git a/patches/minecraft_server/net/minecraft/src/Item.java.patch b/patches/minecraft_server/net/minecraft/src/Item.java.patch deleted file mode 100644 index 3fe585ce5..000000000 --- a/patches/minecraft_server/net/minecraft/src/Item.java.patch +++ /dev/null @@ -1,236 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/Item.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/Item.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,8 +1,11 @@ - package net.minecraft.src; - -+import java.util.ArrayList; - import java.util.Random; - --public class Item -+import net.minecraft.src.forge.ITextureProvider; -+ -+public class Item implements ITextureProvider - { - /** The RNG used by the Item subclasses. */ - protected static Random itemRand = new Random(); -@@ -191,6 +194,9 @@ - - /** full name of item from language file */ - private String itemName; -+ -+ /** FORGE: To disable repair recipes. */ -+ protected boolean canRepair = true; - - protected Item(int par1) - { -@@ -198,7 +204,7 @@ - - if (itemsList[256 + par1] != null) - { -- System.out.println("CONFLICT @ " + par1); -+ System.out.println("CONFLICT @ " + par1 + " item slot already occupied by " + itemsList[256 + par1] + " while adding " + this); - } - - itemsList[256 + par1] = this; -@@ -492,6 +498,10 @@ - float var18 = var15 * var16; - float var20 = var14 * var16; - double var21 = 5.0D; -+ if (par2EntityPlayer instanceof EntityPlayerMP) -+ { -+ var21 = ((EntityPlayerMP)par2EntityPlayer).itemInWorldManager.getBlockReachDistance(); -+ } - Vec3D var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21); - MovingObjectPosition var24 = par1World.rayTraceBlocks_do_do(var13, var23, par3, !par3); - return var24; -@@ -509,4 +519,190 @@ - { - StatList.initStats(); - } -+ -+ /* =========================================================== FORGE START ===============================================================*/ -+ public boolean isDefaultTexture = true; -+ private String currentTexture = "/gui/items.png"; -+ /** -+ * Called when a new CreativeContainer is opened, populate the list -+ * with all of the items for this item you want a player in creative mode -+ * to have access to. -+ * -+ * @param itemList The list of items currently in the creative inventory -+ */ -+ public void addCreativeItems(ArrayList itemList) -+ { -+ if (this.shiftedIndex != Item.potion.shiftedIndex && this.shiftedIndex != Item.monsterPlacer.shiftedIndex) -+ { -+ itemList.add(new ItemStack(this, 1)); -+ } -+ } -+ -+ /** -+ * Called when a player drops the item into the world, -+ * returning false from this will prevent the item from -+ * being removed from the players inventory and spawning -+ * in the world -+ * -+ * @param player The player that dropped the item -+ * @param item The item stack, before the item is removed. -+ */ -+ public boolean onDroppedByPlayer(ItemStack item, EntityPlayer player) -+ { -+ return true; -+ } -+ -+ /** -+ * This is called when the item is used, before the block is activated. -+ * @param stack The Item Stack -+ * @param player The Player that used the item -+ * @param world The Current World -+ * @param X Target X Position -+ * @param Y Target Y Position -+ * @param Z Target Z Position -+ * @param side The side of the target hit -+ * @return Return true to prevent any further processing. -+ */ -+ public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int X, int Y, int Z, int side) -+ { -+ return false; -+ } -+ -+ /** -+ * Metadata-sensitive version of getStrVsBlock -+ * @param itemstack The Item Stack -+ * @param block The block the item is trying to break -+ * @param metadata The items current metadata -+ * @return The damage strength -+ */ -+ public float getStrVsBlock(ItemStack itemstack, Block block, int metadata) -+ { -+ return getStrVsBlock(itemstack, block); -+ } -+ -+ /** -+ * Called by CraftingManager to determine if an item is reparable. -+ * @return True if reparable -+ */ -+ public boolean isRepairable() -+ { -+ return canRepair && isDamageable(); -+ } -+ -+ /** -+ * Call to disable repair recipes. -+ * @return The current Item instance -+ */ -+ public Item setNoRepair() -+ { -+ canRepair = false; -+ return this; -+ } -+ -+ /** -+ * Called before a block is broken. Return true to prevent default block harvesting. -+ * -+ * Note: In SMP, this is called on both client and server sides! -+ * -+ * @param itemstack The current ItemStack -+ * @param X The X Position -+ * @param Y The X Position -+ * @param Z The X Position -+ * @param player The Player that is wielding the item -+ * @return True to prevent harvesting, false to continue as normal -+ */ -+ public boolean onBlockStartBreak(ItemStack itemstack, int X, int Y, int Z, EntityPlayer player) -+ { -+ return false; -+ } -+ -+ /** -+ * Called each tick while using an item. -+ * @param stack The Item being used -+ * @param player The Player using the item -+ * @param count The amount of time in tick the item has been used for continuously -+ */ -+ public void onUsingItemTick(ItemStack stack, EntityPlayer player, int count) -+ { -+ } -+ -+ /** -+ * Called when the player Left Clicks (attacks) an entity. -+ * Processed before damage is done, if return value is true further processing is canceled -+ * and the entity is not attacked. -+ * -+ * @param stack The Item being used -+ * @param player The player that is attacking -+ * @param entity The entity being attacked -+ * @return True to cancel the rest of the interaction. -+ */ -+ public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) -+ { -+ return false; -+ } -+ -+ /** -+ * Player, Render pass, and item usage sensitive version of getIconIndex. -+ * -+ * @param stack The item stack to get the icon for. (Usually this, and usingItem will be the same if usingItem is not null) -+ * @param renderPass The pass to get the icon for, 0 is default. -+ * @param player The player holding the item -+ * @param usingItem The item the player is actively using. Can be null if not using anything. -+ * @param useRemaining The ticks remaining for the active item. -+ * @return The icon index -+ */ -+ public int getIconIndex(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) -+ { -+ /* -+ * Here is an example usage for Vanilla bows. -+ if (usingItem != null && usingItem.getItem().shiftedIndex == Item.bow.shiftedIndex) -+ { -+ int k = usingItem.getMaxItemUseDuration() - useRemaining; -+ if (k >= 18) return 133; -+ if (k > 13) return 117; -+ if (k > 0) return 101; -+ } -+ */ -+ return 0; -+ } -+ -+ /** -+ * Returns the number of render passes/layers this item has. -+ * Usually equates to ItemRenderer.renderItem being called for this many passes. -+ * Does not get called unless func_46058_c() is true; -+ * -+ * Not called on the server -+ * -+ * @param metadata The item's metadata -+ * @return The number of passes to run. -+ */ -+ public int getRenderPasses(int metadata) -+ { -+ return 1; //return func_46058_c() ? 2 : 1; -+ } -+ -+ /** -+ * Grabs the current texture file used for this block -+ */ -+ @Override -+ public String getTextureFile() -+ { -+ if (this instanceof ItemBlock) -+ { -+ return Block.blocksList[((ItemBlock)this).getBlockID()].getTextureFile(); -+ } -+ return currentTexture; -+ } -+ -+ /** -+ * Sets the current texture file for this item, used when rendering. -+ * Default is "/gui/items.png" -+ * -+ * @param texture The texture file -+ */ -+ public void setTextureFile(String texture) -+ { -+ currentTexture = texture; -+ isDefaultTexture = false; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/ItemBlock.java.patch b/patches/minecraft_server/net/minecraft/src/ItemBlock.java.patch deleted file mode 100644 index 0f89de5a6..000000000 --- a/patches/minecraft_server/net/minecraft/src/ItemBlock.java.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ItemBlock.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemBlock.java 0000-00-00 00:00:00.000000000 -0000 -@@ -32,7 +32,8 @@ - { - par7 = 1; - } -- else if (var8 != Block.vine.blockID && var8 != Block.tallGrass.blockID && var8 != Block.deadBush.blockID) -+ else if (var8 != Block.vine.blockID && var8 != Block.tallGrass.blockID && var8 != Block.deadBush.blockID -+ && (Block.blocksList[var8] != null && !Block.blocksList[var8].isBlockReplaceable(par3World, par4, par5, par6))) - { - if (par7 == 0) - { diff --git a/patches/minecraft_server/net/minecraft/src/ItemBow.java.patch b/patches/minecraft_server/net/minecraft/src/ItemBow.java.patch deleted file mode 100644 index 5b4b4b511..000000000 --- a/patches/minecraft_server/net/minecraft/src/ItemBow.java.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ItemBow.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemBow.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ItemBow extends Item - { - public ItemBow(int par1) -@@ -14,6 +16,11 @@ - */ - public void onPlayerStoppedUsing(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer, int par4) - { -+ if (ForgeHooks.onArrowLoose(par1ItemStack, par2World, par3EntityPlayer, getMaxItemUseDuration(par1ItemStack) - par4)) -+ { -+ return; -+ } -+ - boolean var5 = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0; - - if (var5 || par3EntityPlayer.inventory.hasItem(Item.arrow.shiftedIndex)) -@@ -103,6 +110,12 @@ - */ - public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) - { -+ ItemStack stack = ForgeHooks.onArrowNock(par1ItemStack, par2World, par3EntityPlayer); -+ if (stack != null) -+ { -+ return stack; -+ } -+ - if (par3EntityPlayer.capabilities.isCreativeMode || par3EntityPlayer.inventory.hasItem(Item.arrow.shiftedIndex)) - { - par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack)); diff --git a/patches/minecraft_server/net/minecraft/src/ItemBucket.java.patch b/patches/minecraft_server/net/minecraft/src/ItemBucket.java.patch deleted file mode 100644 index d36a94503..000000000 --- a/patches/minecraft_server/net/minecraft/src/ItemBucket.java.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ItemBucket.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemBucket.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.MinecraftForge; -+ - public class ItemBucket extends Item - { - /** field for checking if the bucket has been filled. */ -@@ -43,10 +45,16 @@ - - if (this.isFull == 0) - { -- if (!par3EntityPlayer.canPlayerEdit(var13, var14, var15)) -+ if (par3EntityPlayer != null && !par3EntityPlayer.canPlayerEdit(var13, var14, var15)) - { - return par1ItemStack; - } -+ -+ ItemStack stack = MinecraftForge.fillCustomBucket(par2World, var13, var14, var15); -+ if (stack != null) -+ { -+ return stack; -+ } - - if (par2World.getBlockMaterial(var13, var14, var15) == Material.water && par2World.getBlockMetadata(var13, var14, var15) == 0) - { diff --git a/patches/minecraft_server/net/minecraft/src/ItemDye.java.patch b/patches/minecraft_server/net/minecraft/src/ItemDye.java.patch deleted file mode 100644 index 93969d736..000000000 --- a/patches/minecraft_server/net/minecraft/src/ItemDye.java.patch +++ /dev/null @@ -1,56 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ItemDye.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemDye.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ItemDye extends Item - { - /** List of dye color names */ -@@ -25,7 +27,7 @@ - */ - public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7) - { -- if (!par2EntityPlayer.canPlayerEdit(par4, par5, par6)) -+ if (par2EntityPlayer != null && !par2EntityPlayer.canPlayerEdit(par4, par5, par6)) - { - return false; - } -@@ -34,7 +36,14 @@ - if (par1ItemStack.getItemDamage() == 15) - { - int var8 = par3World.getBlockId(par4, par5, par6); -- -+ if (ForgeHooks.onUseBonemeal(par3World, var8, par4, par5, par6)) -+ { -+ if (!par3World.isRemote) -+ { -+ par1ItemStack.stackSize--; -+ } -+ return true; -+ } - if (var8 == Block.sapling.blockID) - { - if (!par3World.isRemote) -@@ -107,15 +116,15 @@ - { - if (itemRand.nextInt(10) != 0) - { -+ if (mod_MinecraftForge.DISABLE_DARK_ROOMS && !Block.tallGrass.canBlockStay(par3World, var10, var11, var12)) -+ { -+ continue; -+ } - par3World.setBlockAndMetadataWithNotify(var10, var11, var12, Block.tallGrass.blockID, 1); - } -- else if (itemRand.nextInt(3) != 0) -- { -- par3World.setBlockWithNotify(var10, var11, var12, Block.plantYellow.blockID); -- } - else - { -- par3World.setBlockWithNotify(var10, var11, var12, Block.plantRed.blockID); -+ ForgeHooks.plantGrassPlant(par3World, var10, var11, var12); - } - } - } diff --git a/patches/minecraft_server/net/minecraft/src/ItemHoe.java.patch b/patches/minecraft_server/net/minecraft/src/ItemHoe.java.patch deleted file mode 100644 index 880d0ad41..000000000 --- a/patches/minecraft_server/net/minecraft/src/ItemHoe.java.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ItemHoe.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemHoe.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ItemHoe extends Item - { - public ItemHoe(int par1, EnumToolMaterial par2EnumToolMaterial) -@@ -21,6 +23,11 @@ - } - else - { -+ if(ForgeHooks.onUseHoe(par1ItemStack, par2EntityPlayer, par3World, par4, par5, par6)) -+ { -+ par1ItemStack.damageItem(1, par2EntityPlayer); -+ return true; -+ } - int var8 = par3World.getBlockId(par4, par5, par6); - int var9 = par3World.getBlockId(par4, par5 + 1, par6); - diff --git a/patches/minecraft_server/net/minecraft/src/ItemInWorldManager.java.patch b/patches/minecraft_server/net/minecraft/src/ItemInWorldManager.java.patch deleted file mode 100644 index 11e535ed4..000000000 --- a/patches/minecraft_server/net/minecraft/src/ItemInWorldManager.java.patch +++ /dev/null @@ -1,122 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ItemInWorldManager.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemInWorldManager.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,7 +1,11 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ItemInWorldManager - { -+ /** Forge reach distance hook */ -+ private double blockReachDistance = 5.0d; - /** The world object that this object is connected to. */ - public World thisWorld; - -@@ -83,7 +87,7 @@ - if (var2 != 0) - { - Block var3 = Block.blocksList[var2]; -- float var4 = var3.blockStrength(this.thisPlayer) * (float)(var1 + 1); -+ float var4 = var3.blockStrength(thisWorld, this.thisPlayer, field_22049_l, field_22048_m, field_22047_n) * (float)(var1 + 1); - - if (var4 >= 1.0F) - { -@@ -118,7 +122,7 @@ - Block.blocksList[var5].onBlockClicked(this.thisWorld, par1, par2, par3, this.thisPlayer); - } - -- if (var5 > 0 && Block.blocksList[var5].blockStrength(this.thisPlayer) >= 1.0F) -+ if (var5 > 0 && Block.blocksList[var5].blockStrength(thisWorld, this.thisPlayer, par1, par2, par3) >= 1.0F) - { - this.blockHarvessted(par1, par2, par3); - } -@@ -141,7 +145,7 @@ - if (var5 != 0) - { - Block var6 = Block.blocksList[var5]; -- float var7 = var6.blockStrength(this.thisPlayer) * (float)(var4 + 1); -+ float var7 = var6.blockStrength(thisWorld, this.thisPlayer, par1, par2, par3) * (float)(var4 + 1); - - if (var7 >= 0.7F) - { -@@ -168,7 +172,7 @@ - { - Block var4 = Block.blocksList[this.thisWorld.getBlockId(par1, par2, par3)]; - int var5 = this.thisWorld.getBlockMetadata(par1, par2, par3); -- boolean var6 = this.thisWorld.setBlockWithNotify(par1, par2, par3, 0); -+ boolean var6 = (var4 != null && var4.removeBlockByPlayer(thisWorld, thisPlayer, par1, par2, par3)); - - if (var4 != null && var6) - { -@@ -180,6 +184,11 @@ - - public boolean blockHarvessted(int par1, int par2, int par3) - { -+ ItemStack stack = thisPlayer.getCurrentEquippedItem(); -+ if (stack != null && stack.getItem().onBlockStartBreak(stack, par1, par2, par3, thisPlayer)) -+ { -+ return false; -+ } - int var4 = this.thisWorld.getBlockId(par1, par2, par3); - int var5 = this.thisWorld.getBlockMetadata(par1, par2, par3); - this.thisWorld.playAuxSFXAtEntity(this.thisPlayer, 2001, par1, par2, par3, var4 + (this.thisWorld.getBlockMetadata(par1, par2, par3) << 12)); -@@ -192,7 +201,7 @@ - else - { - ItemStack var7 = this.thisPlayer.getCurrentEquippedItem(); -- boolean var8 = this.thisPlayer.canHarvestBlock(Block.blocksList[var4]); -+ boolean var8 = Block.blocksList[var4].canHarvestBlock(thisPlayer, var5); - - if (var7 != null) - { -@@ -202,6 +211,7 @@ - { - var7.onItemDestroyedByUse(this.thisPlayer); - this.thisPlayer.destroyCurrentEquippedItem(); -+ ForgeHooks.onDestroyCurrentItem(thisPlayer, var7); - } - } - -@@ -248,6 +258,11 @@ - */ - public boolean activeBlockOrUseItem(EntityPlayer par1EntityPlayer, World par2World, ItemStack par3ItemStack, int par4, int par5, int par6, int par7) - { -+ if (par3ItemStack != null && par3ItemStack.getItem().onItemUseFirst(par3ItemStack, par1EntityPlayer, par2World, par4, par5, par6, par7)) -+ { -+ return true; -+ } -+ - int var8 = par2World.getBlockId(par4, par5, par6); - - if (var8 > 0 && Block.blocksList[var8].blockActivated(par2World, par4, par5, par6, par1EntityPlayer)) -@@ -269,7 +284,15 @@ - } - else - { -- return par3ItemStack.useItem(par1EntityPlayer, par2World, par4, par5, par6, par7); -+ if (!par3ItemStack.useItem(par1EntityPlayer, par2World, par4, par5, par6, par7)) -+ { -+ return false; -+ } -+ if (par3ItemStack.stackSize == 0) -+ { -+ ForgeHooks.onDestroyCurrentItem(par1EntityPlayer, par3ItemStack); -+ } -+ return true; - } - } - -@@ -280,4 +303,13 @@ - { - this.thisWorld = par1WorldServer; - } -+ -+ public double getBlockReachDistance() -+ { -+ return blockReachDistance; -+ } -+ public void setBlockReachDistance(double distance) -+ { -+ blockReachDistance = distance; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/ItemMap.java.patch b/patches/minecraft_server/net/minecraft/src/ItemMap.java.patch deleted file mode 100644 index cbed0c91c..000000000 --- a/patches/minecraft_server/net/minecraft/src/ItemMap.java.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ItemMap.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemMap.java 0000-00-00 00:00:00.000000000 -0000 -@@ -68,7 +68,7 @@ - byte var23 = 0; - byte var24 = 0; - byte var25 = 0; -- int[] var26 = new int[256]; -+ int[] var26 = new int[Block.blocksList.length]; - Chunk var27 = par1World.getChunkFromBlockCoords(var21, var22); - int var28 = var21 & 15; - int var29 = var22 & 15; -@@ -158,7 +158,7 @@ - var33 = 0; - var34 = 0; - -- for (var35 = 0; var35 < 256; ++var35) -+ for (var35 = 0; var35 < Block.blocksList.length; ++var35) - { - if (var26[var35] > var33) - { diff --git a/patches/minecraft_server/net/minecraft/src/ItemShears.java.patch b/patches/minecraft_server/net/minecraft/src/ItemShears.java.patch deleted file mode 100644 index a7bf11a1c..000000000 --- a/patches/minecraft_server/net/minecraft/src/ItemShears.java.patch +++ /dev/null @@ -1,90 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ItemShears.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemShears.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,9 @@ - package net.minecraft.src; - -+import java.util.ArrayList; -+ -+import net.minecraft.src.forge.IShearable; -+ - public class ItemShears extends Item - { - public ItemShears(int par1) -@@ -11,13 +15,12 @@ - - public boolean onBlockDestroyed(ItemStack par1ItemStack, int par2, int par3, int par4, int par5, EntityLiving par6EntityLiving) - { -- if (par2 != Block.leaves.blockID && par2 != Block.web.blockID && par2 != Block.tallGrass.blockID && par2 != Block.vine.blockID) -+ if (par2 != Block.leaves.blockID && par2 != Block.web.blockID && par2 != Block.tallGrass.blockID && par2 != Block.vine.blockID && !(Block.blocksList[par2] instanceof IShearable)) - { - return super.onBlockDestroyed(par1ItemStack, par2, par3, par4, par5, par6EntityLiving); - } - else - { -- par1ItemStack.damageItem(1, par6EntityLiving); - return true; - } - } -@@ -38,4 +41,62 @@ - { - return par2Block.blockID != Block.web.blockID && par2Block.blockID != Block.leaves.blockID ? (par2Block.blockID == Block.cloth.blockID ? 5.0F : super.getStrVsBlock(par1ItemStack, par2Block)) : 15.0F; - } -+ -+ @Override -+ public void useItemOnEntity(ItemStack itemstack, EntityLiving entity) -+ { -+ if (entity.worldObj.isRemote) -+ { -+ return; -+ } -+ if (entity instanceof IShearable) -+ { -+ IShearable target = (IShearable)entity; -+ if (target.isShearable(itemstack, entity.worldObj, (int)entity.posX, (int)entity.posY, (int)entity.posZ)) -+ { -+ ArrayList drops = target.onSheared(itemstack, entity.worldObj, (int)entity.posX, (int)entity.posY, (int)entity.posZ, -+ EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, itemstack)); -+ for(ItemStack stack : drops) -+ { -+ EntityItem ent = entity.entityDropItem(stack, 1.0F); -+ ent.motionY += entity.rand.nextFloat() * 0.05F; -+ ent.motionX += (entity.rand.nextFloat() - entity.rand.nextFloat()) * 0.1F; -+ ent.motionZ += (entity.rand.nextFloat() - entity.rand.nextFloat()) * 0.1F; -+ } -+ itemstack.damageItem(1, entity); -+ } -+ } -+ } -+ -+ @Override -+ public boolean onBlockStartBreak(ItemStack itemstack, int X, int Y, int Z, EntityPlayer player) -+ { -+ if (player.worldObj.isRemote) -+ { -+ return false; -+ } -+ int id = player.worldObj.getBlockId(X, Y, Z); -+ if (Block.blocksList[id] != null && Block.blocksList[id] instanceof IShearable) -+ { -+ IShearable target = (IShearable)Block.blocksList[id]; -+ if (target.isShearable(itemstack, player.worldObj, X, Y, Z)) -+ { -+ ArrayList drops = target.onSheared(itemstack, player.worldObj, X, Y, Z, -+ EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, itemstack)); -+ for(ItemStack stack : drops) -+ { -+ float f = 0.7F; -+ double d = (double)(player.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; -+ double d1 = (double)(player.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; -+ double d2 = (double)(player.rand.nextFloat() * f) + (double)(1.0F - f) * 0.5D; -+ EntityItem entityitem = new EntityItem(player.worldObj, (double)X + d, (double)Y + d1, (double)Z + d2, stack); -+ entityitem.delayBeforeCanPickup = 10; -+ player.worldObj.spawnEntityInWorld(entityitem); -+ } -+ itemstack.damageItem(1, player); -+ player.addStat(StatList.mineBlockStatArray[id], 1); -+ } -+ } -+ return false; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/ItemTool.java.patch b/patches/minecraft_server/net/minecraft/src/ItemTool.java.patch deleted file mode 100644 index 407c602ee..000000000 --- a/patches/minecraft_server/net/minecraft/src/ItemTool.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ItemTool.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ItemTool.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,13 +1,15 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class ItemTool extends Item - { - /** Array of blocks the tool has extra effect against. */ - private Block[] blocksEffectiveAgainst; -- protected float efficiencyOnProperMaterial = 4.0F; -+ public float efficiencyOnProperMaterial = 4.0F; - - /** Damage versus entities. */ -- private int damageVsEntity; -+ public int damageVsEntity; - - /** The material this tool is made from. */ - protected EnumToolMaterial toolMaterial; -@@ -71,4 +73,15 @@ - { - return this.toolMaterial.getEnchantability(); - } -+ -+ /** FORGE: Overridden to allow custom tool effectiveness */ -+ @Override -+ public float getStrVsBlock(ItemStack stack, Block block, int meta) -+ { -+ if (ForgeHooks.isToolEffective(stack, block, meta)) -+ { -+ return efficiencyOnProperMaterial; -+ } -+ return getStrVsBlock(stack, block); -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/MovingObjectPosition.java.patch b/patches/minecraft_server/net/minecraft/src/MovingObjectPosition.java.patch deleted file mode 100644 index 28d55df65..000000000 --- a/patches/minecraft_server/net/minecraft/src/MovingObjectPosition.java.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/MovingObjectPosition.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/MovingObjectPosition.java 0000-00-00 00:00:00.000000000 -0000 -@@ -26,6 +26,9 @@ - /** The hit entity */ - public Entity entityHit; - -+ /** Used to determine what sub-segment is hit */ -+ public int subHit = -1; -+ - public MovingObjectPosition(int par1, int par2, int par3, int par4, Vec3D par5Vec3D) - { - this.typeOfHit = EnumMovingObjectType.TILE; diff --git a/patches/minecraft_server/net/minecraft/src/NetLoginHandler.java.patch b/patches/minecraft_server/net/minecraft/src/NetLoginHandler.java.patch deleted file mode 100644 index e3db06465..000000000 --- a/patches/minecraft_server/net/minecraft/src/NetLoginHandler.java.patch +++ /dev/null @@ -1,50 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/NetLoginHandler.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/NetLoginHandler.java 0000-00-00 00:00:00.000000000 -0000 -@@ -8,6 +8,9 @@ - - import cpw.mods.fml.server.FMLServerHandler; - import net.minecraft.server.MinecraftServer; -+import net.minecraft.src.forge.*; -+import net.minecraft.src.forge.packets.*; -+import java.io.UnsupportedEncodingException; - - public class NetLoginHandler extends NetHandler - { -@@ -48,6 +51,7 @@ - this.mcServer = par1MinecraftServer; - this.netManager = new NetworkManager(par2Socket, par3Str, this); - this.netManager.chunkDataSendCounter = 0; -+ ForgeHooks.onConnect(netManager); - } - - /** -@@ -148,6 +152,7 @@ - ChunkCoordinates var4 = var3.getSpawnPoint(); - var2.itemInWorldManager.func_35695_b(var3.getWorldInfo().getGameType()); - NetServerHandler var5 = new NetServerHandler(this.mcServer, this.netManager, var2); -+ /* - var5.sendPacket(new Packet1Login("", var2.entityId, var3.getWorldInfo().getTerrainType(), var2.itemInWorldManager.getGameType(), var3.worldProvider.worldType, (byte)var3.difficultySetting, (byte)var3.getHeight(), (byte)this.mcServer.configManager.getMaxPlayers())); - var5.sendPacket(new Packet6SpawnPosition(var4.posX, var4.posY, var4.posZ)); - var5.sendPacket(new Packet202PlayerAbilities(var2.capabilities)); -@@ -155,7 +160,9 @@ - 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())); - Iterator var6 = var2.getActivePotionEffects().iterator(); - -@@ -166,9 +173,10 @@ - } - - var2.func_20057_k(); -+ */ -+ ForgeHooksServer.handleLoginPacket(par1Packet1Login, var5, netManager); - - FMLServerHandler.instance().handleLogin(par1Packet1Login, netManager); -- FMLServerHandler.instance().announceLogin(var2); - } - - this.finishedProcessing = true; diff --git a/patches/minecraft_server/net/minecraft/src/NetServerHandler.java.patch b/patches/minecraft_server/net/minecraft/src/NetServerHandler.java.patch deleted file mode 100644 index 5f36a19ef..000000000 --- a/patches/minecraft_server/net/minecraft/src/NetServerHandler.java.patch +++ /dev/null @@ -1,190 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/NetServerHandler.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/NetServerHandler.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,10 +2,14 @@ - - import java.util.ArrayList; - import java.util.Random; -+import java.util.logging.Level; - import java.util.logging.Logger; - - import cpw.mods.fml.server.FMLServerHandler; - import net.minecraft.server.MinecraftServer; -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.MessageManager; -+import java.io.UnsupportedEncodingException; - - public class NetServerHandler extends NetHandler implements ICommandListener - { -@@ -19,7 +23,7 @@ - public boolean connectionClosed = false; - - /** Reference to the MinecraftServer object. */ -- private MinecraftServer mcServer; -+ public MinecraftServer mcServer; - - /** Reference to the EntityPlayerMP object. */ - private EntityPlayerMP playerEntity; -@@ -374,8 +378,11 @@ - double var10 = this.playerEntity.posY - ((double)var6 + 0.5D) + 1.5D; - double var12 = this.playerEntity.posZ - ((double)var7 + 0.5D); - double var14 = var8 * var8 + var10 * var10 + var12 * var12; -+ -+ double dist = playerEntity.itemInWorldManager.getBlockReachDistance() + 1; -+ dist *= dist; - -- if (var14 > 36.0D) -+ if (var14 > dist) - { - return; - } -@@ -397,7 +404,7 @@ - - if (par1Packet14BlockDig.status == 0) - { -- if (var20 <= 16 && !var3) -+ if (var20 <= mcServer.spawnProtectionSize && !var3) - { - this.playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(var5, var6, var7, var2)); - } -@@ -467,8 +474,9 @@ - { - var12 = var11; - } -- -- if (this.hasMoved && this.playerEntity.getDistanceSq((double)var5 + 0.5D, (double)var6 + 0.5D, (double)var7 + 0.5D) < 64.0D && (var12 > 16 || var9)) -+ double dist = playerEntity.itemInWorldManager.getBlockReachDistance() + 1; -+ dist *= dist; -+ if (this.hasMoved && this.playerEntity.getDistanceSq((double)var5 + 0.5D, (double)var6 + 0.5D, (double)var7 + 0.5D) < dist && (var12 > mcServer.spawnProtectionSize || var9)) - { - this.playerEntity.itemInWorldManager.activeBlockOrUseItem(this.playerEntity, var2, var3, var5, var6, var7, var8); - } -@@ -602,9 +610,13 @@ - } - else - { -- var2 = "<" + this.playerEntity.username + "> " + var2; -- logger.info(var2); -- this.mcServer.configManager.sendPacketToAllPlayers(new Packet3Chat(var2)); -+ var2 = ForgeHooks.onServerChat(playerEntity, var2); -+ if (var2 != null) -+ { -+ var2 = "<" + this.playerEntity.username + "> " + var2; -+ logger.info(var2); -+ this.mcServer.configManager.sendPacketToAllPlayers(new Packet3Chat(var2)); -+ } - } - - this.field_45001_m += 20; -@@ -648,6 +660,10 @@ - } - } - } -+ else if (ForgeHooks.onChatCommand(this.playerEntity, this.mcServer.configManager.isOp(playerEntity.username), par1Str.substring(1))) -+ { -+ logger.info("Forge: " + playerEntity.username + " issues command: " + par1Str.substring(1)); -+ } - else - { - String var3; -@@ -765,9 +781,10 @@ - */ - public void handleRespawn(Packet9Respawn par1Packet9Respawn) - { -+ int dim = (this.mcServer.getWorldManager(this.playerEntity.dimension).worldProvider.canRespawnHere() ? this.playerEntity.dimension : 0); - if (this.playerEntity.gameOver) - { -- this.playerEntity = this.mcServer.configManager.recreatePlayerEntity(this.playerEntity, 0, true); -+ this.playerEntity = this.mcServer.configManager.recreatePlayerEntity(this.playerEntity, dim, true); - } - else - { -@@ -776,7 +793,7 @@ - return; - } - -- this.playerEntity = this.mcServer.configManager.recreatePlayerEntity(this.playerEntity, 0, false); -+ this.playerEntity = this.mcServer.configManager.recreatePlayerEntity(this.playerEntity, dim, false); - } - } - -@@ -969,9 +986,78 @@ - { - this.playerEntity.capabilities.isFlying = par1Packet202PlayerAbilities.isFlying && this.playerEntity.capabilities.allowFlying; - } -+ -+ public EntityPlayerMP getPlayerEntity() -+ { -+ return playerEntity; -+ } -+ -+ @Override -+ public void handleCustomPayload(Packet250CustomPayload pkt) -+ { -+ FMLServerHandler.instance().handlePacket250(pkt, playerEntity); -+ MessageManager inst = MessageManager.getInstance(); -+ if (pkt.channel.equals("REGISTER")) -+ { -+ try -+ { -+ String channels = new String(pkt.data, "UTF8"); -+ for (String channel : channels.split("\0")) -+ { -+ inst.addActiveChannel(netManager, channel); -+ } -+ } -+ catch (UnsupportedEncodingException ex) -+ { -+ ModLoader.throwException("NetServerHandler.handleCustomPayload", ex); -+ } -+ } -+ else if (pkt.channel.equals("UNREGISTER")) -+ { -+ try -+ { -+ String channels = new String(pkt.data, "UTF8"); -+ for (String channel : channels.split("\0")) -+ { -+ inst.removeActiveChannel(netManager, channel); -+ } -+ } -+ catch (UnsupportedEncodingException ex) -+ { -+ ModLoader.throwException("NetServerHandler.handleCustomPayload", ex); -+ } -+ } -+ else -+ { -+ inst.dispatchIncomingMessage(netManager, pkt.channel, pkt.data); -+ } -+ } -+ -+ @Override -+ public void handleMapData(Packet131MapData par1Packet131MapData) -+ { -+ ForgeHooks.onItemDataPacket(netManager, par1Packet131MapData); -+ } - - @Override -- public void handleCustomPayload(Packet250CustomPayload par1Packet250CustomPayload) { -- FMLServerHandler.instance().handlePacket250(par1Packet250CustomPayload, playerEntity); -+ public void handleTileEntityData(Packet132TileEntityData pkt) -+ { -+ World world = this.getPlayerEntity().worldObj; -+ if (world.blockExists(pkt.xPosition, pkt.yPosition, pkt.zPosition)) -+ { -+ TileEntity te = world.getBlockTileEntity(pkt.xPosition, pkt.yPosition, pkt.zPosition); -+ if (te != null) -+ { -+ te.onDataPacket(netManager, pkt); -+ } -+ else -+ { -+ ModLoader.getLogger().log(Level.WARNING, String.format( -+ "Received a TileEntityData packet for a location that did not have a TileEntity: (%d, %d, %d) %d: %d, %d, %d", -+ pkt.xPosition, pkt.yPosition, pkt.zPosition, -+ pkt.actionType, -+ pkt.customParam1, pkt.customParam2, pkt.customParam3)); -+ } -+ } - } - } diff --git a/patches/minecraft_server/net/minecraft/src/NetworkManager.java.patch b/patches/minecraft_server/net/minecraft/src/NetworkManager.java.patch deleted file mode 100644 index aee13ade2..000000000 --- a/patches/minecraft_server/net/minecraft/src/NetworkManager.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/NetworkManager.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/NetworkManager.java 0000-00-00 00:00:00.000000000 -0000 -@@ -11,6 +11,9 @@ - import java.util.Collections; - import java.util.List; - -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.MessageManager; -+ - public class NetworkManager - { - /** Synchronization object used for read and write threads. */ -@@ -315,6 +318,8 @@ - { - ; - } -+ ForgeHooks.onDisconnect(this, par1Str, par2ArrayOfObj); -+ MessageManager.getInstance().removeConnection(this); - } - } - -@@ -462,4 +467,14 @@ - { - return par0NetworkManager.writeThread; - } -+ -+ /** -+ * Retrieves the current associated network handler. -+ * Added so modders don't have to use reflection. -+ * @return The current registered Network Handler -+ */ -+ public NetHandler getNetHandler() -+ { -+ return netHandler; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/Packet53BlockChange.java.patch b/patches/minecraft_server/net/minecraft/src/Packet53BlockChange.java.patch deleted file mode 100644 index 7c4b78544..000000000 --- a/patches/minecraft_server/net/minecraft/src/Packet53BlockChange.java.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/Packet53BlockChange.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/Packet53BlockChange.java 0000-00-00 00:00:00.000000000 -0000 -@@ -44,7 +44,7 @@ - this.xPosition = par1DataInputStream.readInt(); - this.yPosition = par1DataInputStream.read(); - this.zPosition = par1DataInputStream.readInt(); -- this.type = par1DataInputStream.read(); -+ this.type = par1DataInputStream.readInt(); //4096 - this.metadata = par1DataInputStream.read(); - } - -@@ -56,7 +56,7 @@ - par1DataOutputStream.writeInt(this.xPosition); - par1DataOutputStream.write(this.yPosition); - par1DataOutputStream.writeInt(this.zPosition); -- par1DataOutputStream.write(this.type); -+ par1DataOutputStream.writeInt(this.type); //4096 - par1DataOutputStream.write(this.metadata); - } - -@@ -73,6 +73,6 @@ - */ - public int getPacketSize() - { -- return 11; -+ return 14; - } - } diff --git a/patches/minecraft_server/net/minecraft/src/RailLogic.java.patch b/patches/minecraft_server/net/minecraft/src/RailLogic.java.patch deleted file mode 100644 index 228110800..000000000 --- a/patches/minecraft_server/net/minecraft/src/RailLogic.java.patch +++ /dev/null @@ -1,86 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/RailLogic.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/RailLogic.java 0000-00-00 00:00:00.000000000 -0000 -@@ -3,7 +3,7 @@ - import java.util.ArrayList; - import java.util.List; - --class RailLogic -+public class RailLogic - { - /** Reference to the World object. */ - private World worldObj; -@@ -18,6 +18,7 @@ - private List connectedTracks; - - final BlockRail rail; -+ private final boolean canMakeSlopes; - - public RailLogic(BlockRail par1BlockRail, World par2World, int par3, int par4, int par5) - { -@@ -28,17 +29,11 @@ - this.trackY = par4; - this.trackZ = par5; - int var6 = par2World.getBlockId(par3, par4, par5); -- int var7 = par2World.getBlockMetadata(par3, par4, par5); - -- if (BlockRail.isPoweredBlockRail((BlockRail)Block.blocksList[var6])) -- { -- this.isPoweredRail = true; -- var7 &= -9; -- } -- else -- { -- this.isPoweredRail = false; -- } -+ BlockRail target = (BlockRail)Block.blocksList[var6]; -+ int var7 = target.getBasicRailMetadata(par2World, null, par3, par4, par5); -+ isPoweredRail = !target.isFlexibleRail(par2World, par3, par4, par5); -+ canMakeSlopes = target.canMakeSlopes(par2World, par3, par4, par5); - - this.setConnections(var7); - } -@@ -258,7 +253,7 @@ - } - } - -- if (var6 == 0) -+ if (var6 == 0 && canMakeSlopes) - { - if (BlockRail.isRailBlockAt(this.worldObj, this.trackX, this.trackY + 1, this.trackZ - 1)) - { -@@ -271,7 +266,7 @@ - } - } - -- if (var6 == 1) -+ if (var6 == 1 && canMakeSlopes) - { - if (BlockRail.isRailBlockAt(this.worldObj, this.trackX + 1, this.trackY + 1, this.trackZ)) - { -@@ -422,7 +417,7 @@ - } - } - -- if (var7 == 0) -+ if (var7 == 0 && canMakeSlopes) - { - if (BlockRail.isRailBlockAt(this.worldObj, this.trackX, this.trackY + 1, this.trackZ - 1)) - { -@@ -435,7 +430,7 @@ - } - } - -- if (var7 == 1) -+ if (var7 == 1 && canMakeSlopes) - { - if (BlockRail.isRailBlockAt(this.worldObj, this.trackX + 1, this.trackY + 1, this.trackZ)) - { -@@ -485,7 +480,7 @@ - /** - * get number of adjacent tracks - */ -- static int getNAdjacentTracks(RailLogic par0RailLogic) -+ public static int getNAdjacentTracks(RailLogic par0RailLogic) - { - return par0RailLogic.getAdjacentTracks(); - } diff --git a/patches/minecraft_server/net/minecraft/src/ServerConfigurationManager.java.patch b/patches/minecraft_server/net/minecraft/src/ServerConfigurationManager.java.patch deleted file mode 100644 index 20dd44dde..000000000 --- a/patches/minecraft_server/net/minecraft/src/ServerConfigurationManager.java.patch +++ /dev/null @@ -1,153 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/ServerConfigurationManager.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/ServerConfigurationManager.java 0000-00-00 00:00:00.000000000 -0000 -@@ -14,6 +14,7 @@ - - import cpw.mods.fml.server.FMLServerHandler; - import net.minecraft.server.MinecraftServer; -+import net.minecraft.src.forge.DimensionManager; - - public class ServerConfigurationManager - { -@@ -27,7 +28,7 @@ - private MinecraftServer mcServer; - - /** Reference to the PlayerManager object. */ -- private PlayerManager[] playerManagerObj = new PlayerManager[3]; -+ //private PlayerManager[] playerManagerObj = new PlayerManager[3]; - - /** the maximum amount of players that can be connected */ - private int maxPlayers; -@@ -73,9 +74,11 @@ - this.opFile = par1MinecraftServer.getFile("ops.txt"); - this.whitelistPlayersFile = par1MinecraftServer.getFile("white-list.txt"); - int var2 = par1MinecraftServer.propertyManagerObj.getIntProperty("view-distance", 10); -+ /* - this.playerManagerObj[0] = new PlayerManager(par1MinecraftServer, 0, var2); - this.playerManagerObj[1] = new PlayerManager(par1MinecraftServer, -1, var2); - this.playerManagerObj[2] = new PlayerManager(par1MinecraftServer, 1, var2); -+ */ - this.maxPlayers = par1MinecraftServer.propertyManagerObj.getIntProperty("max-players", 20); - this.whiteListEnforced = par1MinecraftServer.propertyManagerObj.getBooleanProperty("white-list", false); - this.readBannedPlayers(); -@@ -102,9 +105,10 @@ - */ - public void joinNewPlayerManager(EntityPlayerMP par1EntityPlayerMP) - { -- this.playerManagerObj[0].removePlayer(par1EntityPlayerMP); -- this.playerManagerObj[1].removePlayer(par1EntityPlayerMP); -- this.playerManagerObj[2].removePlayer(par1EntityPlayerMP); -+ for (World world : DimensionManager.getWorlds()) -+ { -+ ((WorldServer)world).playerManager.removePlayer(par1EntityPlayerMP); -+ } - this.getPlayerManager(par1EntityPlayerMP.dimension).addPlayer(par1EntityPlayerMP); - WorldServer var2 = this.mcServer.getWorldManager(par1EntityPlayerMP.dimension); - var2.chunkProviderServer.loadChunk((int)par1EntityPlayerMP.posX >> 4, (int)par1EntityPlayerMP.posZ >> 4); -@@ -112,7 +116,7 @@ - - public int getMaxTrackingDistance() - { -- return this.playerManagerObj[0].getMaxTrackingDistance(); -+ return getPlayerManager(0).getMaxTrackingDistance(); - } - - /** -@@ -120,7 +124,8 @@ - */ - private PlayerManager getPlayerManager(int par1) - { -- return par1 == -1 ? this.playerManagerObj[1] : (par1 == 0 ? this.playerManagerObj[0] : (par1 == 1 ? this.playerManagerObj[2] : null)); -+ WorldServer world = (WorldServer)DimensionManager.getWorld(par1); -+ return (world == null ? null : world.playerManager); - } - - /** -@@ -245,6 +250,7 @@ - var5.copyPlayer(par1EntityPlayerMP); - } - -+ var5.dimension = par2; - var5.entityId = par1EntityPlayerMP.entityId; - var5.playerNetServerHandler = par1EntityPlayerMP.playerNetServerHandler; - WorldServer var6 = this.mcServer.getWorldManager(par1EntityPlayerMP.dimension); -@@ -289,6 +295,10 @@ - */ - public void sendPlayerToOtherDimension(EntityPlayerMP par1EntityPlayerMP, int par2) - { -+ sendPlayerToOtherDimension(par1EntityPlayerMP, par2, new Teleporter()); -+ } -+ public void sendPlayerToOtherDimension(EntityPlayerMP par1EntityPlayerMP, int par2, Teleporter teleporter) -+ { - int var3 = par1EntityPlayerMP.dimension; - WorldServer var4 = this.mcServer.getWorldManager(par1EntityPlayerMP.dimension); - par1EntityPlayerMP.dimension = par2; -@@ -296,33 +306,14 @@ - par1EntityPlayerMP.playerNetServerHandler.sendPacket(new Packet9Respawn(par1EntityPlayerMP.dimension, (byte)par1EntityPlayerMP.worldObj.difficultySetting, var5.getWorldInfo().getTerrainType(), var5.getHeight(), par1EntityPlayerMP.itemInWorldManager.getGameType())); - var4.removePlayer(par1EntityPlayerMP); - par1EntityPlayerMP.isDead = false; -- double var6 = par1EntityPlayerMP.posX; -- double var8 = par1EntityPlayerMP.posZ; -- double var10 = 8.0D; -- -- if (par1EntityPlayerMP.dimension == -1) -- { -- var6 /= var10; -- var8 /= var10; -- par1EntityPlayerMP.setLocationAndAngles(var6, par1EntityPlayerMP.posY, var8, par1EntityPlayerMP.rotationYaw, par1EntityPlayerMP.rotationPitch); - -- if (par1EntityPlayerMP.isEntityAlive()) -- { -- var4.updateEntityWithOptionalForce(par1EntityPlayerMP, false); -- } -- } -- else if (par1EntityPlayerMP.dimension == 0) -- { -- var6 *= var10; -- var8 *= var10; -- par1EntityPlayerMP.setLocationAndAngles(var6, par1EntityPlayerMP.posY, var8, par1EntityPlayerMP.rotationYaw, par1EntityPlayerMP.rotationPitch); -+ WorldProvider pOld = DimensionManager.getProvider(var3); -+ WorldProvider pNew = DimensionManager.getProvider(par2); -+ double moveFactor = pOld.getMovementFactor() / pNew.getMovementFactor(); -+ double var6 = par1EntityPlayerMP.posX * moveFactor; -+ double var8 = par1EntityPlayerMP.posZ * moveFactor; - -- if (par1EntityPlayerMP.isEntityAlive()) -- { -- var4.updateEntityWithOptionalForce(par1EntityPlayerMP, false); -- } -- } -- else -+ if (par1EntityPlayerMP.dimension == 1) - { - ChunkCoordinates var12 = var5.getEntrancePortalLocation(); - var6 = (double)var12.posX; -@@ -342,7 +333,7 @@ - par1EntityPlayerMP.setLocationAndAngles(var6, par1EntityPlayerMP.posY, var8, par1EntityPlayerMP.rotationYaw, par1EntityPlayerMP.rotationPitch); - var5.updateEntityWithOptionalForce(par1EntityPlayerMP, false); - var5.chunkProviderServer.chunkLoadOverride = true; -- (new Teleporter()).placeInPortal(var5, par1EntityPlayerMP); -+ teleporter.placeInPortal(var5, par1EntityPlayerMP); - var5.chunkProviderServer.chunkLoadOverride = false; - } - -@@ -372,9 +363,9 @@ - this.sendPacketToAllPlayers(new Packet201PlayerInfo(var1.username, true, var1.ping)); - } - -- for (int var2 = 0; var2 < this.playerManagerObj.length; ++var2) -+ for (World world : DimensionManager.getWorlds()) - { -- this.playerManagerObj[var2].updatePlayerInstances(); -+ ((WorldServer)world).playerManager.updatePlayerInstances(); - } - } - -@@ -907,7 +898,7 @@ - - public String[] func_52019_t() - { -- return this.mcServer.worldMngr[0].getSaveHandler().getPlayerNBTManager().func_52007_g(); -+ return DimensionManager.getWorld(0).getSaveHandler().getPlayerNBTManager().func_52007_g(); - } - - private void func_52018_u() diff --git a/patches/minecraft_server/net/minecraft/src/SlotCrafting.java.patch b/patches/minecraft_server/net/minecraft/src/SlotCrafting.java.patch deleted file mode 100644 index 898ee7ab3..000000000 --- a/patches/minecraft_server/net/minecraft/src/SlotCrafting.java.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/SlotCrafting.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/SlotCrafting.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,8 @@ - - import cpw.mods.fml.server.FMLServerHandler; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class SlotCrafting extends Slot - { - /** The craft matrix inventory linked to this result slot. */ -@@ -99,6 +101,7 @@ - public void onPickupFromSlot(ItemStack par1ItemStack) - { - FMLServerHandler.instance().onItemCrafted(thePlayer, par1ItemStack, craftMatrix); -+ ForgeHooks.onTakenFromCrafting(thePlayer, par1ItemStack, craftMatrix); - this.func_48416_b(par1ItemStack); - - for (int var2 = 0; var2 < this.craftMatrix.getSizeInventory(); ++var2) diff --git a/patches/minecraft_server/net/minecraft/src/SpawnerAnimals.java.patch b/patches/minecraft_server/net/minecraft/src/SpawnerAnimals.java.patch deleted file mode 100644 index c6371528b..000000000 --- a/patches/minecraft_server/net/minecraft/src/SpawnerAnimals.java.patch +++ /dev/null @@ -1,67 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/SpawnerAnimals.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/SpawnerAnimals.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,10 +1,14 @@ - package net.minecraft.src; - -+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 net.minecraft.src.forge.ForgeHooks; -+ - public final class SpawnerAnimals - { - /** The 17x17 area around the player where mobs can spawn */ -@@ -20,7 +24,7 @@ - { - Chunk var3 = par0World.getChunkFromChunkCoords(par1, par2); - int var4 = par1 * 16 + par0World.rand.nextInt(16); -- int var5 = par0World.rand.nextInt(var3 == null ? 128 : Math.max(128, var3.getTopFilledSegment())); -+ int var5 = par0World.rand.nextInt(var3 == null ? 128 : Math.max(128, var3.getTopFilledSegment() + 15)); //Vanilla Bug that causes mobs to not spawn on the topmost chunk with blocks. - int var6 = par2 * 16 + par0World.rand.nextInt(16); - return new ChunkPosition(var4, var5, var6); - } -@@ -78,6 +82,13 @@ - if ((!var34.getPeacefulCreature() || par2) && (var34.getPeacefulCreature() || par1) && par0World.countEntities(var34.getCreatureClass()) <= var34.getMaxNumberOfCreature() * eligibleChunksForSpawning.size() / 256) - { - Iterator var35 = eligibleChunksForSpawning.keySet().iterator(); -+ if (mod_MinecraftForge.SPAWNER_MAKE_MORE_RANDOM) -+ { -+ ArrayList tmp = new ArrayList(eligibleChunksForSpawning.keySet()); -+ Collections.shuffle(tmp); -+ var35 = tmp.iterator(); -+ //Note for cpw: this can be done by Collections.shuffle(b) -+ } - label108: - - while (var35.hasNext()) -@@ -202,7 +213,8 @@ - else - { - int var5 = par1World.getBlockId(par2, par3 - 1, par4); -- return Block.isNormalCube(var5) && var5 != Block.bedrock.blockID && !par1World.isBlockNormalCube(par2, par3, par4) && !par1World.getBlockMaterial(par2, par3, par4).isLiquid() && !par1World.isBlockNormalCube(par2, par3 + 1, par4); -+ boolean spawnBlock = (Block.blocksList[var5] != null && Block.blocksList[var5].canCreatureSpawn(par0EnumCreatureType, par1World, par2, par3 - 1, par4)); -+ return spawnBlock && var5 != Block.bedrock.blockID && !par1World.isBlockNormalCube(par2, par3, par4) && !par1World.getBlockMaterial(par2, par3, par4).isLiquid() && !par1World.isBlockNormalCube(par2, par3 + 1, par4); - } - } - -@@ -211,6 +223,16 @@ - */ - private static void creatureSpecificInit(EntityLiving par0EntityLiving, World par1World, float par2, float par3, float par4) - { -+ if (ForgeHooks.onEntitySpawnSpecial(par0EntityLiving, par1World, par2, par3, par4)) //Deprecated in 1.2.5, remove in 1.3 -+ { -+ return; -+ } -+ -+ if (ForgeHooks.onEntityLivingSpawn(par0EntityLiving, par1World, par2, par3, par4)) -+ { -+ return; -+ } -+ - if (par0EntityLiving instanceof EntitySpider && par1World.rand.nextInt(100) == 0) - { - EntitySkeleton var7 = new EntitySkeleton(par1World); diff --git a/patches/minecraft_server/net/minecraft/src/StatList.java.patch b/patches/minecraft_server/net/minecraft/src/StatList.java.patch deleted file mode 100644 index 6713f755d..000000000 --- a/patches/minecraft_server/net/minecraft/src/StatList.java.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/StatList.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/StatList.java 0000-00-00 00:00:00.000000000 -0000 -@@ -166,9 +166,9 @@ - */ - private static StatBase[] initMinableStats(String par0Str, int par1) - { -- StatBase[] var2 = new StatBase[256]; -+ StatBase[] var2 = new StatBase[Block.blocksList.length]; - -- for (int var3 = 0; var3 < 256; ++var3) -+ for (int var3 = 0; var3 < Block.blocksList.length; ++var3) - { - if (Block.blocksList[var3] != null && Block.blocksList[var3].getEnableStats()) - { diff --git a/patches/minecraft_server/net/minecraft/src/Teleporter.java.patch b/patches/minecraft_server/net/minecraft/src/Teleporter.java.patch deleted file mode 100644 index 9d417f875..000000000 --- a/patches/minecraft_server/net/minecraft/src/Teleporter.java.patch +++ /dev/null @@ -1,41 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/Teleporter.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/Teleporter.java 0000-00-00 00:00:00.000000000 -0000 -@@ -70,7 +70,7 @@ - { - double var15 = (double)var14 + 0.5D - par2Entity.posZ; - -- for (int var17 = 127; var17 >= 0; --var17) -+ for (int var17 = par1World.getHeight() - 1; var17 >= 0; --var17) //BugFix - { - if (par1World.getBlockId(var11, var17, var14) == Block.portal.blockID) - { -@@ -170,7 +170,7 @@ - var18 = (double)var17 + 0.5D - par2Entity.posZ; - label274: - -- for (var20 = 127; var20 >= 0; --var20) -+ for (var20 = par1World.getHeight() - 1; var20 >= 0; --var20) //BugFix - { - if (par1World.isAirBlock(var14, var20, var17)) - { -@@ -236,7 +236,7 @@ - var18 = (double)var17 + 0.5D - par2Entity.posZ; - label222: - -- for (var20 = 127; var20 >= 0; --var20) -+ for (var20 = par1World.getHeight() - 1; var20 >= 0; --var20) //BugFix - { - if (par1World.isAirBlock(var14, var20, var17)) - { -@@ -304,9 +304,9 @@ - var10 = 70; - } - -- if (var10 > 118) -+ if (var10 > par1World.getHeight() - 10) //BugFix - { -- var10 = 118; -+ var10 = par1World.getHeight() - 10; //BugFix - } - - var16 = var10; diff --git a/patches/minecraft_server/net/minecraft/src/TileEntity.java.patch b/patches/minecraft_server/net/minecraft/src/TileEntity.java.patch deleted file mode 100644 index ea26b9c53..000000000 --- a/patches/minecraft_server/net/minecraft/src/TileEntity.java.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/TileEntity.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/TileEntity.java 0000-00-00 00:00:00.000000000 -0000 -@@ -207,4 +207,29 @@ - public static void addNewTileEntityMapping(Class tileEntityClass, String id) { - addMapping(tileEntityClass, id); - } -+ -+ /** -+ * Determines if this TileEntity requires update calls. -+ * @return True if you want updateEntity() to be called, false if not -+ */ -+ public boolean canUpdate() -+ { -+ return true; -+ } -+ -+ /** -+ * Called when you receive a TileEntityData packet for the location this -+ * TileEntity is currently in. On the client, the NetworkManager will always -+ * be the remote server. On the server, it will be whomever is responsible for -+ * sending the packet. -+ * -+ * @param net The NetworkManager the packet originated from -+ * @param pkt The data packet -+ */ -+ public void onDataPacket(NetworkManager net, Packet132TileEntityData pkt){} -+ -+ /** -+ * Called when the chunk this TileEntity is on is Unloaded. -+ */ -+ public void onChunkUnload(){} - } diff --git a/patches/minecraft_server/net/minecraft/src/TileEntityBrewingStand.java.patch b/patches/minecraft_server/net/minecraft/src/TileEntityBrewingStand.java.patch deleted file mode 100644 index 60a68514c..000000000 --- a/patches/minecraft_server/net/minecraft/src/TileEntityBrewingStand.java.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/TileEntityBrewingStand.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/TileEntityBrewingStand.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,7 +2,9 @@ - - import java.util.List; - --public class TileEntityBrewingStand extends TileEntity implements IInventory -+import net.minecraft.src.forge.ISidedInventory; -+ -+public class TileEntityBrewingStand extends TileEntity implements IInventory, ISidedInventory - { - /** The itemstacks currently placed in the slots of the brewing stand */ - private ItemStack[] brewingItemStacks = new ItemStack[4]; -@@ -317,4 +319,16 @@ - - return var1; - } -+ -+ @Override -+ public int getStartInventorySide(int side) -+ { -+ return (side == 1 ? 3 : 0); -+ } -+ -+ @Override -+ public int getSizeInventorySide(int side) -+ { -+ return (side == 1 ? 1 : 3); -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/TileEntityFurnace.java.patch b/patches/minecraft_server/net/minecraft/src/TileEntityFurnace.java.patch deleted file mode 100644 index 6c17198b8..000000000 --- a/patches/minecraft_server/net/minecraft/src/TileEntityFurnace.java.patch +++ /dev/null @@ -1,96 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/TileEntityFurnace.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/TileEntityFurnace.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,7 +2,10 @@ - - import cpw.mods.fml.common.FMLCommonHandler; - --public class TileEntityFurnace extends TileEntity implements IInventory -+import net.minecraft.src.forge.ForgeHooks; -+import net.minecraft.src.forge.ISidedInventory; -+ -+public class TileEntityFurnace extends TileEntity implements IInventory, ISidedInventory - { - /** - * The ItemStacks that hold the items currently being used in the furnace -@@ -251,8 +254,12 @@ - } - 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()))); -+ ItemStack var1 = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]); -+ if (var1 == null) return false; -+ if (this.furnaceItemStacks[2] == null) return true; -+ if (!this.furnaceItemStacks[2].isItemEqual(var1)) return false; -+ int result = furnaceItemStacks[2].stackSize + var1.stackSize; -+ return (result <= this.getInventoryStackLimit() && result <= this.furnaceItemStacks[2].getMaxStackSize()); - } - } - -@@ -263,15 +270,25 @@ - { - if (this.canSmelt()) - { -- ItemStack var1 = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0].getItem().shiftedIndex); -+ ItemStack var1 = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]); - - if (this.furnaceItemStacks[2] == null) - { - this.furnaceItemStacks[2] = var1.copy(); - } -- else if (this.furnaceItemStacks[2].itemID == var1.itemID) -+ else if (this.furnaceItemStacks[2].isItemEqual(var1)) - { -- ++this.furnaceItemStacks[2].stackSize; -+ //========================================================== -+ //Adding extra importance here, so this really small bug -+ //fix stops slipping through the cracks. -+ // -+ //Makes it so that items that result in multiple items are -+ //smelted correctly each time. -+ // -+ // -+ // -+ this.furnaceItemStacks[2].stackSize += var1.stackSize; -+ //========================================================== - } - - --this.furnaceItemStacks[0].stackSize; -@@ -296,12 +313,17 @@ - else - { - int var1 = par1ItemStack.getItem().shiftedIndex; -- if (var1 < 256 && Block.blocksList[var1].blockMaterial == Material.wood) return 300; -+ if (par1ItemStack.getItem() instanceof ItemBlock && Block.blocksList[var1].blockMaterial == Material.wood) return 300; - if (var1 == Item.stick.shiftedIndex) return 100; - if (var1 == Item.coal.shiftedIndex) return 1600; - if (var1 == Item.bucketLava.shiftedIndex) return 20000; - if (var1 == Block.sapling.blockID) return 100; - if (var1 == Item.blazeRod.shiftedIndex) return 2400; -+ int ret = ForgeHooks.getItemBurnTime(par1ItemStack); -+ if (ret > 0) -+ { -+ return ret; -+ } - return FMLCommonHandler.instance().fuelLookup(var1, par1ItemStack.getItemDamage()); - } - } -@@ -325,4 +347,18 @@ - public void openChest() {} - - public void closeChest() {} -+ -+ @Override -+ public int getStartInventorySide(int side) -+ { -+ if (side == 0) return 1; -+ if (side == 1) return 0; -+ return 2; -+ } -+ -+ @Override -+ public int getSizeInventorySide(int side) -+ { -+ return 1; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/World.java.patch b/patches/minecraft_server/net/minecraft/src/World.java.patch deleted file mode 100644 index 266391f66..000000000 --- a/patches/minecraft_server/net/minecraft/src/World.java.patch +++ /dev/null @@ -1,354 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/World.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/World.java 0000-00-00 00:00:00.000000000 -0000 -@@ -9,8 +9,17 @@ - import java.util.Set; - import java.util.TreeSet; - -+import net.minecraft.src.forge.ForgeHooks; -+ - public class World implements IBlockAccess - { -+ /** -+ * Used in the getEntitiesWithinAABB functions to expand the search area for entities. -+ * Modders should change this variable to a higher value if it is less then the radius -+ * of one of there entities. -+ */ -+ public static double MAX_ENTITY_RADIUS = 2.0D; -+ - /** - * boolean; if true updates scheduled by scheduleBlockUpdate happen immediately - */ -@@ -79,7 +88,7 @@ - * Contains a timestamp from when the World object was created. Is used in the session.lock file - */ - private long lockTimestamp = System.currentTimeMillis(); -- protected int autosavePeriod = 40; -+ public int autosavePeriod = 40; - - /** Whether monsters are enabled or not. (1 = on, 0 = off) */ - public int difficultySetting; -@@ -219,6 +228,7 @@ - - this.calculateInitialSkylight(); - this.calculateInitialWeather(); -+ ForgeHooks.onWorldLoad(this); - } - - /** -@@ -323,6 +333,7 @@ - } - - this.chunkProvider.saveChunks(par1, par2IProgressUpdate); -+ ForgeHooks.onWorldSave(this); - } - } - -@@ -354,7 +365,8 @@ - */ - public boolean isAirBlock(int par1, int par2, int par3) - { -- return this.getBlockId(par1, par2, par3) == 0; -+ int id = getBlockId(par1, par2, par3); -+ return (id == 0 || Block.blocksList[id] == null || Block.blocksList[id].isAirBlock(this, par1, par2, par3)); - } - - /** -@@ -363,7 +375,8 @@ - public boolean blockHasTileEntity(int par1, int par2, int par3) - { - int var4 = this.getBlockId(par1, par2, par3); -- return Block.blocksList[var4] != null && Block.blocksList[var4].hasTileEntity(); -+ int md = this.getBlockMetadata(par1, par2, par3); -+ return Block.blocksList[var4] != null && Block.blocksList[var4].hasTileEntity(md); - } - - /** -@@ -956,7 +969,9 @@ - int var12 = this.getBlockMetadata(var8, var9, var10); - Block var13 = Block.blocksList[var11]; - -- if ((!par4 || var13 == null || var13.getCollisionBoundingBoxFromPool(this, var8, var9, var10) != null) && var11 > 0 && var13.canCollideCheck(var12, par3)) -+ if (var13 != null && //BugFix NPE on missconfigured block ids. -+ (!par4 || var13 == null || var13.getCollisionBoundingBoxFromPool(this, var8, var9, var10) != null) && -+ var11 > 0 && var13.canCollideCheck(var12, par3)) - { - MovingObjectPosition var14 = var13.collisionRayTrace(this, var8, var9, var10, par1Vec3D, par2Vec3D); - -@@ -1604,7 +1619,7 @@ - - if (var7 != null) - { -- var7.removeChunkBlockTileEntity(var5.xCoord & 15, var5.yCoord, var5.zCoord & 15); -+ var7.cleanChunkBlockTileEntity(var5.xCoord & 15, var5.yCoord, var5.zCoord & 15); - } - } - } -@@ -1614,6 +1629,10 @@ - - if (!this.entityRemoval.isEmpty()) - { -+ for (Object tile : entityRemoval) -+ { -+ ((TileEntity)tile).onChunkUnload(); -+ } - this.loadedTileEntityList.removeAll(this.entityRemoval); - this.entityRemoval.clear(); - } -@@ -1634,14 +1653,16 @@ - { - this.loadedTileEntityList.add(var8); - } -- -+ } -+ else -+ { - if (this.chunkExists(var8.xCoord >> 4, var8.zCoord >> 4)) - { - Chunk var9 = this.getChunkFromChunkCoords(var8.xCoord >> 4, var8.zCoord >> 4); - - if (var9 != null) - { -- var9.setChunkBlockTileEntity(var8.xCoord & 15, var8.yCoord, var8.zCoord & 15, var8); -+ var9.cleanChunkBlockTileEntity(var8.xCoord & 15, var8.yCoord, var8.zCoord & 15); - } - } - -@@ -1658,13 +1679,13 @@ - - public void addTileEntity(Collection par1Collection) - { -- if (this.scanningTileEntities) -+ List dest = scanningTileEntities ? addedTileEntityList : loadedTileEntityList; -+ for(Object entity : par1Collection) - { -- this.addedTileEntityList.addAll(par1Collection); -- } -- else -- { -- this.loadedTileEntityList.addAll(par1Collection); -+ if(((TileEntity)entity).canUpdate()) -+ { -+ dest.add(entity); -+ } - } - } - -@@ -1686,7 +1707,7 @@ - int var4 = MathHelper.floor_double(par1Entity.posZ); - byte var5 = 32; - -- if (!par2 || this.checkChunksExist(var3 - var5, 0, var4 - var5, var3 + var5, 0, var4 + var5)) -+ if (!par2 || this.checkChunksExist(var3 - var5, 0, var4 - var5, var3 + var5, 0, var4 + var5) || ForgeHooks.canUpdateEntity(par1Entity)) - { - par1Entity.lastTickPosX = par1Entity.posX; - par1Entity.lastTickPosY = par1Entity.posY; -@@ -1910,6 +1931,13 @@ - { - return true; - } -+ else -+ { -+ if (var11 > 0 && Block.blocksList[var11] != null && Block.blocksList[var11].isBlockBurning(this, var8, var9, var10)) -+ { -+ return true; -+ } -+ } - } - } - } -@@ -2192,25 +2220,21 @@ - */ - public void setBlockTileEntity(int par1, int par2, int par3, TileEntity par4TileEntity) - { -- if (par4TileEntity != null && !par4TileEntity.isInvalid()) -+ if (par4TileEntity == null || par4TileEntity.isInvalid()) - { -- if (this.scanningTileEntities) -- { -- par4TileEntity.xCoord = par1; -- par4TileEntity.yCoord = par2; -- par4TileEntity.zCoord = par3; -- this.addedTileEntityList.add(par4TileEntity); -- } -- else -- { -- this.loadedTileEntityList.add(par4TileEntity); -- Chunk var5 = this.getChunkFromChunkCoords(par1 >> 4, par3 >> 4); -+ return; -+ } -+ List dest = scanningTileEntities ? addedTileEntityList : loadedTileEntityList; -+ if (par4TileEntity.canUpdate()) -+ { -+ dest.add(par4TileEntity); -+ } - -- if (var5 != null) -- { -- var5.setChunkBlockTileEntity(par1 & 15, par2, par3 & 15, par4TileEntity); -- } -- } -+ Chunk var5 = this.getChunkFromChunkCoords(par1 >> 4, par3 >> 4); -+ -+ if (var5 != null) -+ { -+ var5.setChunkBlockTileEntity(par1 & 15, par2, par3 & 15, par4TileEntity); - } - } - -@@ -2219,27 +2243,10 @@ - */ - public void removeBlockTileEntity(int par1, int par2, int par3) - { -- TileEntity var4 = this.getBlockTileEntity(par1, par2, par3); -- -- if (var4 != null && this.scanningTileEntities) -- { -- var4.invalidate(); -- this.addedTileEntityList.remove(var4); -- } -- else -+ Chunk var5 = this.getChunkFromChunkCoords(par1 >> 4, par3 >> 4); -+ if (var5 != null) - { -- if (var4 != null) -- { -- this.addedTileEntityList.remove(var4); -- this.loadedTileEntityList.remove(var4); -- } -- -- Chunk var5 = this.getChunkFromChunkCoords(par1 >> 4, par3 >> 4); -- -- if (var5 != null) -- { -- var5.removeChunkBlockTileEntity(par1 & 15, par2, par3 & 15); -- } -+ var5.removeChunkBlockTileEntity(par1 & 15, par2, par3 & 15); - } - } - -@@ -2265,7 +2272,8 @@ - */ - public boolean isBlockNormalCube(int par1, int par2, int par3) - { -- return Block.isNormalCube(this.getBlockId(par1, par2, par3)); -+ Block block = Block.blocksList[getBlockId(par1, par2, par3)]; -+ return block != null && block.isBlockNormalCube(this, par1, par2, par3); - } - - /** -@@ -2281,7 +2289,7 @@ - if (var5 != null && !var5.isEmpty()) - { - Block var6 = Block.blocksList[this.getBlockId(par1, par2, par3)]; -- return var6 == null ? false : var6.blockMaterial.isOpaque() && var6.renderAsNormalBlock(); -+ return var6 == null ? false : isBlockNormalCube(par1, par2, par3); - } - else - { -@@ -2540,6 +2548,7 @@ - } - } - } -+ ForgeHooks.addActiveChunks(this, activeChunkSet); - - Profiler.endSection(); - -@@ -2863,7 +2872,7 @@ - - private int computeBlockLightValue(int par1, int par2, int par3, int par4, int par5, int par6) - { -- int var7 = Block.lightValue[par5]; -+ int var7 = (par5 == 0 || Block.blocksList[par5] == null ? 0 : Block.blocksList[par5].getLightValue(this, par2, par3, par4)); - int var8 = this.getSavedLightValue(EnumSkyBlock.Block, par2 - 1, par3, par4) - par6; - int var9 = this.getSavedLightValue(EnumSkyBlock.Block, par2 + 1, par3, par4) - par6; - int var10 = this.getSavedLightValue(EnumSkyBlock.Block, par2, par3 - 1, par4) - par6; -@@ -3196,10 +3205,10 @@ - public List getEntitiesWithinAABBExcludingEntity(Entity par1Entity, AxisAlignedBB par2AxisAlignedBB) - { - this.entitiesWithinAABBExcludingEntity.clear(); -- int var3 = MathHelper.floor_double((par2AxisAlignedBB.minX - 2.0D) / 16.0D); -- int var4 = MathHelper.floor_double((par2AxisAlignedBB.maxX + 2.0D) / 16.0D); -- int var5 = MathHelper.floor_double((par2AxisAlignedBB.minZ - 2.0D) / 16.0D); -- int var6 = MathHelper.floor_double((par2AxisAlignedBB.maxZ + 2.0D) / 16.0D); -+ int var3 = MathHelper.floor_double((par2AxisAlignedBB.minX - MAX_ENTITY_RADIUS) / 16.0D); -+ int var4 = MathHelper.floor_double((par2AxisAlignedBB.maxX + MAX_ENTITY_RADIUS) / 16.0D); -+ int var5 = MathHelper.floor_double((par2AxisAlignedBB.minZ - MAX_ENTITY_RADIUS) / 16.0D); -+ int var6 = MathHelper.floor_double((par2AxisAlignedBB.maxZ + MAX_ENTITY_RADIUS) / 16.0D); - - for (int var7 = var3; var7 <= var4; ++var7) - { -@@ -3220,10 +3229,10 @@ - */ - public List getEntitiesWithinAABB(Class par1Class, AxisAlignedBB par2AxisAlignedBB) - { -- int var3 = MathHelper.floor_double((par2AxisAlignedBB.minX - 2.0D) / 16.0D); -- int var4 = MathHelper.floor_double((par2AxisAlignedBB.maxX + 2.0D) / 16.0D); -- int var5 = MathHelper.floor_double((par2AxisAlignedBB.minZ - 2.0D) / 16.0D); -- int var6 = MathHelper.floor_double((par2AxisAlignedBB.maxZ + 2.0D) / 16.0D); -+ int var3 = MathHelper.floor_double((par2AxisAlignedBB.minX - MAX_ENTITY_RADIUS) / 16.0D); -+ int var4 = MathHelper.floor_double((par2AxisAlignedBB.maxX + MAX_ENTITY_RADIUS) / 16.0D); -+ int var5 = MathHelper.floor_double((par2AxisAlignedBB.minZ - MAX_ENTITY_RADIUS) / 16.0D); -+ int var6 = MathHelper.floor_double((par2AxisAlignedBB.maxZ + MAX_ENTITY_RADIUS) / 16.0D); - ArrayList var7 = new ArrayList(); - - for (int var8 = var3; var8 <= var4; ++var8) -@@ -3350,6 +3359,11 @@ - var8 = null; - } - -+ if (var8 != null && var8.isBlockReplaceable(this, par2, par3, par4)) -+ { -+ var8 = null; -+ } -+ - return par1 > 0 && var8 == null && var9.canPlaceBlockOnSide(this, par2, par3, par4, par6); - } - } -@@ -3827,7 +3841,7 @@ - */ - public int getHeight() - { -- return 256; -+ return worldProvider.hasNoSky ? 128 : 256; //Nether is 128, overworld is 256, Bugfix related to Portal generation - } - - /** -@@ -3864,4 +3878,38 @@ - { - return this.getChunkProvider().findClosestStructure(this, par1Str, par2, par3, par4); - } -+ -+ /** -+ * Adds a single TileEntity to the world. -+ * TODO: Eloraam fully describe the bug this fixes. -+ * @param entity The TileEntity to be added. -+ */ -+ public void addTileEntity(TileEntity entity) -+ { -+ List dest = scanningTileEntities ? addedTileEntityList : loadedTileEntityList; -+ if(entity.canUpdate()) -+ { -+ dest.add(entity); -+ } -+ } -+ -+ /** -+ * Determine if the given block is considered solid on the -+ * specified side. Used by placement logic. -+ * -+ * @param x Block X Position -+ * @param y Block Y Position -+ * @param z Block Z Position -+ * @param side The Side in question -+ * @return True if the side is solid -+ */ -+ public boolean isBlockSolidOnSide(int x, int y, int z, int side) -+ { -+ Block block = Block.blocksList[getBlockId(x, y, z)]; -+ if(block == null) -+ { -+ return false; -+ } -+ return block.isBlockSolidOnSide(this, x, y, z, side); -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenBigMushroom.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenBigMushroom.java.patch deleted file mode 100644 index a288eed40..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenBigMushroom.java.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenBigMushroom.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenBigMushroom.java 0000-00-00 00:00:00.000000000 -0000 -@@ -54,7 +54,9 @@ - { - var13 = par1World.getBlockId(var11, var9, var12); - -- if (var13 != 0 && var13 != Block.leaves.blockID) -+ Block block = Block.blocksList[var13]; -+ -+ if (var13 != 0 && block != null && !block.isLeaves(par1World, var11, var9, var12)) - { - var8 = false; - } -@@ -186,7 +188,9 @@ - var15 = 0; - } - -- if ((var15 != 0 || par4 >= par4 + var7 - 1) && !Block.opaqueCubeLookup[par1World.getBlockId(var13, var11, var14)]) -+ Block block = Block.blocksList[par1World.getBlockId(var13, var11, var14)]; -+ -+ if ((var15 != 0 || par4 >= par4 + var7 - 1) && (block == null || block.canBeReplacedByLeaves(par1World, var13, var11, var14))) - { - this.setBlockAndMetadata(par1World, var13, var11, var14, Block.mushroomCapBrown.blockID + var6, var15); - } -@@ -198,7 +202,9 @@ - { - var12 = par1World.getBlockId(par3, par4 + var11, par5); - -- if (!Block.opaqueCubeLookup[var12]) -+ Block block = Block.blocksList[var12]; -+ -+ if (block == null || block.canBeReplacedByLeaves(par1World, par3, par4 + var11, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var11, par5, Block.mushroomCapBrown.blockID + var6, 10); - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenDeadBush.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenDeadBush.java.patch deleted file mode 100644 index b8d798be5..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenDeadBush.java.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenDeadBush.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenDeadBush.java 0000-00-00 00:00:00.000000000 -0000 -@@ -16,10 +16,16 @@ - { - int var11; - -- for (boolean var6 = false; ((var11 = par1World.getBlockId(par3, par4, par5)) == 0 || var11 == Block.leaves.blockID) && par4 > 0; --par4) -+ Block block = null; -+ do - { -- ; -- } -+ block = Block.blocksList[par1World.getBlockId(par3, par4, par5)]; -+ if (block != null && !block.isLeaves(par1World, par3, par4, par5)) -+ { -+ break; -+ } -+ par4--; -+ } while (par4 > 0); - - for (int var7 = 0; var7 < 4; ++var7) - { diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenDungeons.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenDungeons.java.patch deleted file mode 100644 index 28aac01d9..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenDungeons.java.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenDungeons.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenDungeons.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import net.minecraft.src.forge.MinecraftForge; -+ - public class WorldGenDungeons extends WorldGenerator - { - public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5) -@@ -117,9 +119,9 @@ - - if (var16 != null) - { -- for (int var17 = 0; var17 < 8; ++var17) -+ for (int var17 = 0; var17 < MinecraftForge.getDungeonLootTries(); ++var17) - { -- ItemStack var18 = this.pickCheckLootItem(par2Random); -+ ItemStack var18 = MinecraftForge.getRandomDungeonLoot(par2Random); - - if (var18 != null) - { -@@ -147,7 +149,7 @@ - - if (var19 != null) - { -- var19.setMobID(this.pickMobSpawner(par2Random)); -+ var19.setMobID(MinecraftForge.getRandomDungeonMob(par2Random)); - } - else - { diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenForest.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenForest.java.patch deleted file mode 100644 index 6524cac51..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenForest.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenForest.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenForest.java 0000-00-00 00:00:00.000000000 -0000 -@@ -43,7 +43,9 @@ - { - var12 = par1World.getBlockId(var10, var8, var11); - -- if (var12 != 0 && var12 != Block.leaves.blockID) -+ Block block = Block.blocksList[var12]; -+ -+ if (var12 != 0 && (block != null && !block.isLeaves(par1World, var10, var8, var11))) - { - var7 = false; - } -@@ -82,7 +84,10 @@ - { - int var15 = var14 - par5; - -- if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var12, var16, var14)]) -+ Block block = Block.blocksList[par1World.getBlockId(var12, var16, var14)]; -+ -+ if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var12, var16, var14))) - { - this.setBlockAndMetadata(par1World, var12, var16, var14, Block.leaves.blockID, 2); - } -@@ -94,7 +99,9 @@ - { - var10 = par1World.getBlockId(par3, par4 + var16, par5); - -- if (var10 == 0 || var10 == Block.leaves.blockID) -+ Block block = Block.blocksList[var10]; -+ -+ if (var10 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var16, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var16, par5, Block.wood.blockID, 2); - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenHugeTrees.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenHugeTrees.java.patch deleted file mode 100644 index 26db3a98a..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenHugeTrees.java.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenHugeTrees.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenHugeTrees.java 0000-00-00 00:00:00.000000000 -0000 -@@ -55,7 +55,12 @@ - { - var12 = par1World.getBlockId(var10, var8, var11); - -- if (var12 != 0 && var12 != Block.leaves.blockID && var12 != Block.grass.blockID && var12 != Block.dirt.blockID && var12 != Block.wood.blockID && var12 != Block.sapling.blockID) -+ if (var12 != 0 && -+ (Block.blocksList[var12] != null && !Block.blocksList[var12].isLeaves(par1World, var10, var8, var11)) && -+ var12 != Block.grass.blockID && -+ var12 != Block.dirt.blockID && -+ (Block.blocksList[var12] != null && !Block.blocksList[var12].isWood(par1World, var10, var8, var11)) && -+ var12 != Block.sapling.blockID) - { - var7 = false; - } -@@ -103,7 +108,7 @@ - { - var11 = par1World.getBlockId(par3, par4 + var10, par5); - -- if (var11 == 0 || var11 == Block.leaves.blockID) -+ if (var11 == 0 || Block.blocksList[var11] == null || Block.blocksList[var11].isLeaves(par1World, par3, par4 + var10, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var10, par5, Block.wood.blockID, this.woodMetadata); - -@@ -125,7 +130,7 @@ - { - var11 = par1World.getBlockId(par3 + 1, par4 + var10, par5); - -- if (var11 == 0 || var11 == Block.leaves.blockID) -+ if (var11 == 0 || Block.blocksList[var11] == null || Block.blocksList[var11].isLeaves(par1World, par3 + 1, par4 + var10, par5)) - { - this.setBlockAndMetadata(par1World, par3 + 1, par4 + var10, par5, Block.wood.blockID, this.woodMetadata); - -@@ -145,7 +150,7 @@ - - var11 = par1World.getBlockId(par3 + 1, par4 + var10, par5 + 1); - -- if (var11 == 0 || var11 == Block.leaves.blockID) -+ if (var11 == 0 || Block.blocksList[var11] == null && Block.blocksList[var11].isLeaves(par1World, par3 + 1, par4 + var10, par5 + 1)) - { - this.setBlockAndMetadata(par1World, par3 + 1, par4 + var10, par5 + 1, Block.wood.blockID, this.woodMetadata); - -@@ -165,7 +170,7 @@ - - var11 = par1World.getBlockId(par3, par4 + var10, par5 + 1); - -- if (var11 == 0 || var11 == Block.leaves.blockID) -+ if (var11 == 0 || Block.blocksList[var11] == null || Block.blocksList[var11].isLeaves(par1World, par3, par4 + var10, par5 + 1)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var10, par5 + 1, Block.wood.blockID, this.woodMetadata); - -@@ -216,7 +221,12 @@ - { - int var14 = var13 - par3; - -- if ((var12 >= 0 || var14 >= 0 || var12 * var12 + var14 * var14 <= var10 * var10) && (var12 <= 0 && var14 <= 0 || var12 * var12 + var14 * var14 <= (var10 + 1) * (var10 + 1)) && (par6Random.nextInt(4) != 0 || var12 * var12 + var14 * var14 <= (var10 - 1) * (var10 - 1)) && !Block.opaqueCubeLookup[par1World.getBlockId(var11, var8, var13)]) -+ Block block = Block.blocksList[par1World.getBlockId(var11, var8, var13)]; -+ -+ if ((var12 >= 0 || var14 >= 0 || var12 * var12 + var14 * var14 <= var10 * var10) && -+ (var12 <= 0 && var14 <= 0 || var12 * var12 + var14 * var14 <= (var10 + 1) * (var10 + 1)) && -+ (par6Random.nextInt(4) != 0 || var12 * var12 + var14 * var14 <= (var10 - 1) * (var10 - 1)) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var11, var8, var13))) - { - this.setBlockAndMetadata(par1World, var11, var8, var13, Block.leaves.blockID, this.leavesMetadata); - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenMinable.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenMinable.java.patch deleted file mode 100644 index 99795c27d..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenMinable.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenMinable.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenMinable.java 0000-00-00 00:00:00.000000000 -0000 -@@ -6,6 +6,7 @@ - { - /** The block ID of the ore to be placed using this generator. */ - private int minableBlockId; -+ private int minableBlockMeta = 0; - - /** The number of blocks to generate. */ - private int numberOfBlocks; -@@ -15,6 +16,12 @@ - this.minableBlockId = par1; - this.numberOfBlocks = par2; - } -+ -+ public WorldGenMinable(int id, int meta, int number) -+ { -+ this(id, number); -+ minableBlockMeta = meta; -+ } - - public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5) - { -@@ -57,9 +64,10 @@ - { - double var45 = ((double)var44 + 0.5D - var24) / (var28 / 2.0D); - -- if (var39 * var39 + var42 * var42 + var45 * var45 < 1.0D && par1World.getBlockId(var38, var41, var44) == Block.stone.blockID) -+ Block block = Block.blocksList[par1World.getBlockId(var38, var41, var44)]; -+ if (var39 * var39 + var42 * var42 + var45 * var45 < 1.0D && (block != null && block.isGenMineableReplaceable(par1World, var38, var41, var44))) - { -- par1World.setBlock(var38, var41, var44, this.minableBlockId); -+ par1World.setBlockAndMetadata(var38, var41, var44, this.minableBlockId, minableBlockMeta); - } - } - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenShrub.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenShrub.java.patch deleted file mode 100644 index 9509a7ae4..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenShrub.java.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenShrub.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenShrub.java 0000-00-00 00:00:00.000000000 -0000 -@@ -17,10 +17,16 @@ - { - int var15; - -- for (boolean var6 = false; ((var15 = par1World.getBlockId(par3, par4, par5)) == 0 || var15 == Block.leaves.blockID) && par4 > 0; --par4) -+ Block block = null; -+ do - { -- ; -- } -+ block = Block.blocksList[par1World.getBlockId(par3, par4, par5)]; -+ if (block != null && !block.isLeaves(par1World, par3, par4, par5)) -+ { -+ break; -+ } -+ par4--; -+ } while (par4 > 0); - - int var7 = par1World.getBlockId(par3, par4, par5); - -@@ -42,7 +48,9 @@ - { - int var14 = var13 - par5; - -- if ((Math.abs(var12) != var10 || Math.abs(var14) != var10 || par2Random.nextInt(2) != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var11, var8, var13)]) -+ block = Block.blocksList[par1World.getBlockId(var11, var8, var13)]; -+ -+ if ((Math.abs(var12) != var10 || Math.abs(var14) != var10 || par2Random.nextInt(2) != 0) && (block == null || block.canBeReplacedByLeaves(par1World, var11, var8, var13))) - { - this.setBlockAndMetadata(par1World, var11, var8, var13, Block.leaves.blockID, this.field_48408_a); - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenSwamp.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenSwamp.java.patch deleted file mode 100644 index 433de5bfb..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenSwamp.java.patch +++ /dev/null @@ -1,44 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenSwamp.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenSwamp.java 0000-00-00 00:00:00.000000000 -0000 -@@ -44,7 +44,7 @@ - { - var12 = par1World.getBlockId(var10, var8, var11); - -- if (var12 != 0 && var12 != Block.leaves.blockID) -+ if (var12 != 0 && (Block.blocksList[var12] != null && !Block.blocksList[var12].isLeaves(par1World, var10, var8, var11))) - { - if (var12 != Block.waterStill.blockID && var12 != Block.waterMoving.blockID) - { -@@ -91,7 +91,10 @@ - { - int var15 = var14 - par5; - -- if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var12, var16, var14)]) -+ Block block = Block.blocksList[par1World.getBlockId(var12, var16, var14)]; -+ -+ if ((Math.abs(var13) != var11 || Math.abs(var15) != var11 || par2Random.nextInt(2) != 0 && var10 != 0) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var12, var16, var14))) - { - this.setBlock(par1World, var12, var16, var14, Block.leaves.blockID); - } -@@ -103,7 +106,9 @@ - { - var10 = par1World.getBlockId(par3, par4 + var16, par5); - -- if (var10 == 0 || var10 == Block.leaves.blockID || var10 == Block.waterMoving.blockID || var10 == Block.waterStill.blockID) -+ Block block = Block.blocksList[var10]; -+ -+ if (var10 == 0 || (block != null && block.isLeaves(par1World, par3, par4 + var16, par5)) || var10 == Block.waterMoving.blockID || var10 == Block.waterStill.blockID) - { - this.setBlock(par1World, par3, par4 + var16, par5, Block.wood.blockID); - } -@@ -118,7 +123,8 @@ - { - for (var13 = par5 - var11; var13 <= par5 + var11; ++var13) - { -- if (par1World.getBlockId(var12, var16, var13) == Block.leaves.blockID) -+ Block block = Block.blocksList[par1World.getBlockId(var12, var16, var13)]; -+ if (block != null && block.isLeaves(par1World, var12, var16, var13)) - { - if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var12 - 1, var16, var13) == 0) - { diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenTaiga1.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenTaiga1.java.patch deleted file mode 100644 index 26a521840..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenTaiga1.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenTaiga1.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenTaiga1.java 0000-00-00 00:00:00.000000000 -0000 -@@ -41,7 +41,9 @@ - { - var15 = par1World.getBlockId(var13, var11, var14); - -- if (var15 != 0 && var15 != Block.leaves.blockID) -+ Block block = Block.blocksList[var15]; -+ -+ if (var15 != 0 && (block == null || !block.isLeaves(par1World, var13, var11, var14))) - { - var10 = false; - } -@@ -77,7 +79,10 @@ - { - int var17 = var16 - par5; - -- if ((Math.abs(var15) != var18 || Math.abs(var17) != var18 || var18 <= 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var14, var13, var16)]) -+ Block block = Block.blocksList[par1World.getBlockId(var14, var13, var16)]; -+ -+ if ((Math.abs(var15) != var18 || Math.abs(var17) != var18 || var18 <= 0) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var14, var13, var16))) - { - this.setBlockAndMetadata(par1World, var14, var13, var16, Block.leaves.blockID, 1); - } -@@ -98,7 +103,9 @@ - { - var14 = par1World.getBlockId(par3, par4 + var13, par5); - -- if (var14 == 0 || var14 == Block.leaves.blockID) -+ Block block = Block.blocksList[var14]; -+ -+ if (var14 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var13, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var13, par5, Block.wood.blockID, 1); - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenTaiga2.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenTaiga2.java.patch deleted file mode 100644 index 9f8cadbcd..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenTaiga2.java.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenTaiga2.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenTaiga2.java 0000-00-00 00:00:00.000000000 -0000 -@@ -45,7 +45,9 @@ - { - var15 = par1World.getBlockId(var13, var11, var14); - -- if (var15 != 0 && var15 != Block.leaves.blockID) -+ Block block = Block.blocksList[var15]; -+ -+ if (var15 != 0 && block != null && !block.isLeaves(par1World, var13, var11, var14)) - { - var10 = false; - } -@@ -87,7 +89,9 @@ - { - int var20 = var19 - par5; - -- if ((Math.abs(var18) != var21 || Math.abs(var20) != var21 || var21 <= 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var17, var16, var19)]) -+ Block block = Block.blocksList[par1World.getBlockId(var17, var16, var19)]; -+ -+ if ((Math.abs(var18) != var21 || Math.abs(var20) != var21 || var21 <= 0) && (block == null || block.canBeReplacedByLeaves(par1World, var17, var16, var19))) - { - this.setBlockAndMetadata(par1World, var17, var16, var19, Block.leaves.blockID, 1); - } -@@ -117,7 +121,9 @@ - { - var17 = par1World.getBlockId(par3, par4 + var16, par5); - -- if (var17 == 0 || var17 == Block.leaves.blockID) -+ Block block = Block.blocksList[var17]; -+ -+ if (var17 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var16, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var16, par5, Block.wood.blockID, 1); - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenTallGrass.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenTallGrass.java.patch deleted file mode 100644 index 5819588d7..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenTallGrass.java.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenTallGrass.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenTallGrass.java 0000-00-00 00:00:00.000000000 -0000 -@@ -18,10 +18,16 @@ - { - int var11; - -- for (boolean var6 = false; ((var11 = par1World.getBlockId(par3, par4, par5)) == 0 || var11 == Block.leaves.blockID) && par4 > 0; --par4) -+ Block block = null; -+ do - { -- ; -- } -+ block = Block.blocksList[par1World.getBlockId(par3, par4, par5)]; -+ if (block != null && !block.isLeaves(par1World, par3, par4, par5)) -+ { -+ break; -+ } -+ par4--; -+ } while (par4 > 0); - - for (int var7 = 0; var7 < 128; ++var7) - { diff --git a/patches/minecraft_server/net/minecraft/src/WorldGenTrees.java.patch b/patches/minecraft_server/net/minecraft/src/WorldGenTrees.java.patch deleted file mode 100644 index c56173db3..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldGenTrees.java.patch +++ /dev/null @@ -1,50 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldGenTrees.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldGenTrees.java 0000-00-00 00:00:00.000000000 -0000 -@@ -64,7 +64,13 @@ - { - var12 = par1World.getBlockId(var10, var8, var11); - -- if (var12 != 0 && var12 != Block.leaves.blockID && var12 != Block.grass.blockID && var12 != Block.dirt.blockID && var12 != Block.wood.blockID) -+ Block block = Block.blocksList[var12]; -+ -+ if (var12 != 0 && -+ !block.isLeaves(par1World, var10, var8, var11) && -+ var12 != Block.grass.blockID && -+ var12 != Block.dirt.blockID && -+ !block.isWood(par1World, var10, var8, var11)) - { - var7 = false; - } -@@ -107,7 +113,10 @@ - { - int var17 = var16 - par5; - -- if ((Math.abs(var15) != var13 || Math.abs(var17) != var13 || par2Random.nextInt(2) != 0 && var12 != 0) && !Block.opaqueCubeLookup[par1World.getBlockId(var14, var11, var16)]) -+ Block block = Block.blocksList[par1World.getBlockId(var14, var11, var16)]; -+ -+ if ((Math.abs(var15) != var13 || Math.abs(var17) != var13 || par2Random.nextInt(2) != 0 && var12 != 0) && -+ (block == null || block.canBeReplacedByLeaves(par1World, var14, var11, var16))) - { - this.setBlockAndMetadata(par1World, var14, var11, var16, Block.leaves.blockID, this.metaLeaves); - } -@@ -119,7 +128,9 @@ - { - var12 = par1World.getBlockId(par3, par4 + var11, par5); - -- if (var12 == 0 || var12 == Block.leaves.blockID) -+ Block block = Block.blocksList[var12]; -+ -+ if (var12 == 0 || block == null || block.isLeaves(par1World, par3, par4 + var11, par5)) - { - this.setBlockAndMetadata(par1World, par3, par4 + var11, par5, Block.wood.blockID, this.metaWood); - -@@ -159,7 +170,8 @@ - { - for (var15 = par5 - var13; var15 <= par5 + var13; ++var15) - { -- if (par1World.getBlockId(var14, var11, var15) == Block.leaves.blockID) -+ Block block = Block.blocksList[par1World.getBlockId(var14, var11, var15)]; -+ if (block != null && block.isLeaves(par1World, var14, var11, var15)) - { - if (par2Random.nextInt(4) == 0 && par1World.getBlockId(var14 - 1, var11, var15) == 0) - { diff --git a/patches/minecraft_server/net/minecraft/src/WorldProvider.java.patch b/patches/minecraft_server/net/minecraft/src/WorldProvider.java.patch deleted file mode 100644 index d8c6dce44..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldProvider.java.patch +++ /dev/null @@ -1,56 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldProvider.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldProvider.java 0000-00-00 00:00:00.000000000 -0000 -@@ -1,5 +1,7 @@ - package net.minecraft.src; - -+import net.minecraft.src.forge.DimensionManager; -+ - public abstract class WorldProvider - { - /** world object being used */ -@@ -117,7 +119,7 @@ - - public static WorldProvider getProviderForDimension(int par0) - { -- return (WorldProvider)(par0 == -1 ? new WorldProviderHell() : (par0 == 0 ? new WorldProviderSurface() : (par0 == 1 ? new WorldProviderEnd() : null))); -+ return DimensionManager.createProviderFor(par0); - } - - /** -@@ -132,4 +134,36 @@ - { - return this.terrainType.getMinimumSpawnHeight(worldObj); - } -+ -+ /** -+ * Returns the sub-folder of the world folder that this WorldProvider saves to. -+ * EXA: DIM1, DIM-1 -+ * @return The sub-folder name to save this world's chunks to. -+ */ -+ public abstract String getSaveFolder(); -+ -+ /** -+ * A message to display to the user when they transfer to this dimension. -+ * -+ * @return The message to be displayed -+ */ -+ public abstract String getWelcomeMessage(); -+ -+ /** -+ * A Message to display to the user when they transfer out of this dismension. -+ * -+ * @return The message to be displayed -+ */ -+ public abstract String getDepartMessage(); -+ -+ /** -+ * The dimensions movement factor. Relative to normal overworld. -+ * It is applied to the players position when they transfer dimensions. -+ * Exa: Nether movement is 8.0 -+ * @return The movement factor -+ */ -+ public double getMovementFactor() -+ { -+ return 1.0; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldProviderEnd.java.patch b/patches/minecraft_server/net/minecraft/src/WorldProviderEnd.java.patch deleted file mode 100644 index b52789dd6..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldProviderEnd.java.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldProviderEnd.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldProviderEnd.java 0000-00-00 00:00:00.000000000 -0000 -@@ -62,4 +62,22 @@ - { - return 50; - } -+ -+ @Override -+ public String getSaveFolder() -+ { -+ return "DIM1"; -+ } -+ -+ @Override -+ public String getWelcomeMessage() -+ { -+ return "Entering the End"; -+ } -+ -+ @Override -+ public String getDepartMessage() -+ { -+ return "Leaving the End"; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldProviderHell.java.patch b/patches/minecraft_server/net/minecraft/src/WorldProviderHell.java.patch deleted file mode 100644 index c0acea1d8..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldProviderHell.java.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldProviderHell.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldProviderHell.java 0000-00-00 00:00:00.000000000 -0000 -@@ -63,4 +63,28 @@ - { - return false; - } -+ -+ @Override -+ public String getSaveFolder() -+ { -+ return "DIM-1"; -+ } -+ -+ @Override -+ public String getWelcomeMessage() -+ { -+ return "Entering the Nether"; -+ } -+ -+ @Override -+ public String getDepartMessage() -+ { -+ return "Leaving the Nether"; -+ } -+ -+ @Override -+ public double getMovementFactor() -+ { -+ return 8.0; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldProviderSurface.java.patch b/patches/minecraft_server/net/minecraft/src/WorldProviderSurface.java.patch deleted file mode 100644 index 4e895ed0c..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldProviderSurface.java.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldProviderSurface.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldProviderSurface.java 0000-00-00 00:00:00.000000000 -0000 -@@ -2,4 +2,21 @@ - - public class WorldProviderSurface extends WorldProvider - { -+ @Override -+ public String getSaveFolder() -+ { -+ return null; -+ } -+ -+ @Override -+ public String getWelcomeMessage() -+ { -+ return null; -+ } -+ -+ @Override -+ public String getDepartMessage() -+ { -+ return null; -+ } - } diff --git a/patches/minecraft_server/net/minecraft/src/WorldServer.java.patch b/patches/minecraft_server/net/minecraft/src/WorldServer.java.patch deleted file mode 100644 index 475612ef3..000000000 --- a/patches/minecraft_server/net/minecraft/src/WorldServer.java.patch +++ /dev/null @@ -1,71 +0,0 @@ ---- ../src_base/minecraft_server/net/minecraft/src/WorldServer.java 0000-00-00 00:00:00.000000000 -0000 -+++ ../src_work/minecraft_server/net/minecraft/src/WorldServer.java 0000-00-00 00:00:00.000000000 -0000 -@@ -3,6 +3,7 @@ - import java.util.ArrayList; - import java.util.List; - import net.minecraft.server.MinecraftServer; -+import net.minecraft.src.forge.DimensionManager; - - public class WorldServer extends World - { -@@ -17,6 +18,8 @@ - - /** Maps ids to entity instances */ - private IntHashMap entityInstanceIdMap; -+ public EntityTracker entityTracker; -+ public PlayerManager playerManager; - - public WorldServer(MinecraftServer par1MinecraftServer, ISaveHandler par2ISaveHandler, String par3Str, int par4, WorldSettings par5WorldSettings) - { -@@ -27,6 +30,9 @@ - { - this.entityInstanceIdMap = new IntHashMap(); - } -+ DimensionManager.setWorld(par4, this); -+ playerManager = new PlayerManager(mcServer, par4, mcServer.propertyManagerObj.getIntProperty("view-distance", 10)); -+ entityTracker = new EntityTracker(mcServer, par4); - } - - /** -@@ -72,14 +78,26 @@ - public List getTileEntityList(int par1, int par2, int par3, int par4, int par5, int par6) - { - ArrayList var7 = new ArrayList(); -- -- for (int var8 = 0; var8 < this.loadedTileEntityList.size(); ++var8) -+ for(int x = (par1 >> 4); x <= (par4 >> 4); x++) - { -- TileEntity var9 = (TileEntity)this.loadedTileEntityList.get(var8); -- -- if (var9.xCoord >= par1 && var9.yCoord >= par2 && var9.zCoord >= par3 && var9.xCoord < par4 && var9.yCoord < par5 && var9.zCoord < par6) -+ for(int z = (par3 >> 4); z <= (par6 >> 4); z++) - { -- var7.add(var9); -+ Chunk chunk = getChunkFromChunkCoords(x, z); -+ if (chunk != null) -+ { -+ for(Object obj : chunk.chunkTileEntityMap.values()) -+ { -+ TileEntity entity = (TileEntity)obj; -+ if (!entity.isInvalid()) -+ { -+ if (entity.xCoord >= par1 && entity.yCoord >= par2 && entity.zCoord >= par3 && -+ entity.xCoord <= par4 && entity.yCoord <= par5 && entity.zCoord <= par6) -+ { -+ var7.add(entity); -+ } -+ } -+ } -+ } - } - } - -@@ -99,7 +117,7 @@ - var6 = var5; - } - -- return var6 > 16 || this.mcServer.configManager.isOp(par1EntityPlayer.username); -+ return var6 > mcServer.spawnProtectionSize || this.mcServer.configManager.isOp(par1EntityPlayer.username); - } - - /**